当前位置 > 首页 > 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

  • Entity Framework 4.0: Generating SQL script from model

    2009-7-24 0:49:00

    Entity Framework 4.0 is able to generate database schema based on model. If you built your model fi

  • Hiring!

    2007-3-17 9:38:00

    We are hiring a full time ASP.NET Developer! Location: Salt Lake City, UT 84121 Status: Full T

  • Características Desconocidas de Internet Explorer 8

    2009-7-19 5:02:00

    This article is in Spanish / Este artículo esta en espa?ol Hola a todos Este artículo tra

  • 有关DataTable 的 Merge 操作

    2009-8-21 21:37:00

    摘要: 因为WPF项目需要,经常要对DataTable 的操作及回滚,因操作存在于多个窗口及方法间,不适用TransactionScope。于是想到DataTable的Merge操作。1):首先创建

  • 谈 三层结构与MVC模式的区别

    2009-4-29 23:45:00

    在CSDN和园子里有朋友谈到三层与MVC的区别,以前也有人抛出这个问题,本人对来公司面试的朋友也偶乐会提这方面的问题。 那么我也来讲讲我对这两者的理解吧。 首先对这个题目,本身是存在问题

  • [原创]我所理解的Remoting (2) :远程对象的生命周期管理-Part II

    2007-3-31 1:57:00

    摘要: 在上一篇文章中( [原创]我所理解的Remoting(2):远程对象生命周期的管理—Part I ),我简要的讲述了CLR的垃圾回收机制和Remoting 基于Lease的对象生命周期的管

  • 你跟对老板了吗?

    2009-10-12 17:58:00

    摘要: 哎!蹉跎岁月中~~~ 今天又没安排我事做,闲来无聊,随便写点。 国庆放了4天,不知道大家放了几天。老板发了一百块月饼钱,不知道大家发了多少。我坚持这个在深圳只有2000的工作,无保险,无劳

  • 成都(10月24日时代广场)Windows 7社区发布活动

    2009-10-15 2:57:00

    摘要: 报名地址:https://spreadsheets.google.com/viewform?hl=en&formkey=dEVwUnlzYktDS2h3RzlpNWpNbzFYZWc

  • MbUnit 3 RTM

    2009-4-3 9:13:00

    MbUnit 3 has been a long, long labour. It started around early fall of 2007 and under Jeff had grow

  • VS2005集成VSS2005的方法

    2007-6-12 13:34:00

    VS2005集成VSS2005的方法 Q: 安装了VSS6/VSS2005,但是Visual Studio 2005的IDE中看不到VSS,怎么办? A: 打开菜单中的 Tools->