当前位置 > 首页 > Asp.net

DOTNET中GC原理

2012-12-5 16:02:00来源:Asp.net

1. Stack和Heap
    每个线程对应一个stack,线程创建的时候CLR为其创建这个stack,stack主要作用是记录函数的执行情况。值类型变量(函数的参数、局部变量等非成员变量)都分配在stack中,引用类型的对象分配在heap中,在stack中保存heap对象的引用指针。GC只负责heap对象的释放,heap内存空间管理

Heap内存分配
   
    除去pinned object等影响,heap中的内存分配很简单,一个指针记录heap中分配的起始地址,根据对象大小连续的分配内存

Stack结构
    每个函数调用时,逻辑上在thread stack中会产生一个帧(stack frame),函数返回时对应的stack frame被释放掉
    用个简单的函数查看执行时CLR对栈的处理情况:
static void Main(string[] args)
{
    
int r = Sum(23456);
}
private static int Sum(int a, int b, int c, int d, int e)
{
    
return a + b + c + d + e;
}
    JIT编译后主要汇编代码如下(其他的情况下汇编代码可能有所差别,但用这个简单函数大致看下栈的管理已经足够):
;====函数Main====
push    4         ;第3个参数到最后一个参数压栈
push    5    
push    6    
mov    edx,3   ;第1、第2个参数分别放入ecx、edx寄存器
mov    ecx,2 
call    dword ptr ds:[00AD96B8h]  ;调用函数Sum,执行call的时候返回地址(即下面这条mov语句的地址)自动压栈了
mov    dword ptr [ebp-0Ch],eax   ;将函数返回值设置到局部变量r中(函数调用结束返回值在eax寄存器中)

;
====函数Sum====
push    ebp           ;保存原始ebp寄存器
mov    ebp,esp     ;将当前栈指针保存在ebp中,后面使用ebp对参数和局部变量寻址
sub    esp,8         ;分配两个局部变量
mov    dword ptr [ebp-4],ecx         ;第1个参数放入局部变量
mov

  • 配置管理的困惑

    2007-5-12 2:30:00

    摘要: 在项目一期进行客户验收或试运行的同时开展了二期的开发工作,这时若要修正一期的bug,如何更好地保证改完的一期版本不含二期的功能,这些修改又自动更新到二期的版本中来? 阅读全文 阿多

  • 【原创】ASP.NET MVC3开发中遇到问题以及解决方法

    2012-3-22 22:11:00

    小弟刚学MVC3,在学习过程中遇到了很多的问题,现在把已遇到问题总结出来,以后陆续更新。方便和我一样的新手。。 1.手写Model类,EF执行错误找不到表对象。 [TableAtt

  • Windows Live Writer推荐SyntaxHighlighter代码着色插件

    2009-11-27 14:01:00

    阅读: 340 评论: 9 作者: 博客园团队 发表于 2009-11-27 12:01 原文链接 博客园内置支持 SyntaxHighlighter 代码着色,代码着色语法:<pr

  • Jquery利用ajax调用asp.net webservice的各种数据类型(总结篇)

    2012-10-13 16:22:00

    老话说的好:好记心不如烂笔头! 本着这原则,我把最近工作中遇到的jquery利用ajax调用web服务的各种数据类型做了一个总结! 本文章没有什么高难度技术,就是记录一下,汇总一下,以便以后需要

  • 使用Jasper和IronPython操作数据

    2007-5-9 22:59:00

    1.建立数据库 use master go create database Jasper go use Jasper go CREATE TABLE Users ( Use

  • 我的有道难题算法-双倍超立方数

    2009-6-2 3:45:00

    题目要求:双倍超立方数是指一个正整数可以正好被拆分为两种不同的a^3+b^3的方式,其中a,b均为整数且0<a<=b。对于任何一个指定的 int n, 返回所有的小于等于n的双倍超立方数

  • 微软跟我们的不同

    2009-4-28 23:09:00

    作为国内的软件产业来说,起步较晚,相对来说发展的也比较慢,当微软帝国开始兴起的时候可能我们还不知道软件是什么?这也是我们跟他们的第一个不同点! 当我们知道软件是什么的时候,我们就已经要依赖微软

  • 全局程序集缓存导致cs0006编译错误:找不到元数据文件错误

    2007-3-11 13:23:00

    背景知识: 什么是全局程序集缓存 ? 安装有公共语言运行库的每台计算机都具有称为全局程序集缓存的计算机范围内的代码缓存。全局程序集缓存中存储了专门指定给由计算机中若干应用程序

  • [备忘]ASP.NET MVC3 RC2 发布

    2010-12-11 20:48:00

    下载地址: http://go.microsoft.com/fwlink/?LinkID=191799 除了典典的介绍: http://www.cnblogs.com/chsword/a

  • 如何查询并解决80端口

    2009-12-2 23:28:00

    阅读: 178 评论: 0 作者: 铁拐李 发表于 2009-12-02 21:48 原文链接 今天在使用apache的时候80端口被占用了,解决办法如下 在命令行里输入ne