当前位置 > 首页 > Asp.net

DOTNET中GC原理

12/5/2012 4:02:00 PM来源: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

  • Using the WebGrid Helper in ASP.NET MVC 3 Beta

    10/8/2010 5:29:00 PM

    ASP.NET MVC 3 Beta is now supports to using ASP.NET Web Pages helpers in the Razor views. In post,

  • 动画缓冲或叫缓动函数(Animation Easing)

    3/22/2010 3:57:00 PM

    之前的博客我介绍过如何做一个动画,以及 渐变风格动画 , 关键帧动画 。我们如果仅仅使用这些知识做一个模拟现实的动画,仍然是比较复杂的,比如:我们要实现一个篮球掉下再弹起,再掉下,再弹起的动画。或者

  • Get Repeater Control Output in String

    4/14/2009 1:16:00 AM

    In this post I will share with you a small code snippet which will help you to get the repeater con

  • First post, here it goes

    9/11/2007 2:40:00 PM

    Wow, I feel honored being up here with the likes of Scott Guthrie with my own Blog on asp.net. Th

  • 开发Vs2005 Add-ins----用快捷键插入Guid

    3/23/2007 10:47:00 PM

    摘要: Vs2005中对add-ins的支持要比2003好的多了,看了一些这方面的文章,忍不住技痒,自己做了一个小东西,用快捷键Alt + G插入 Guid, 希望可以给大家带来些许的方便,也希望可

  • 《.NET 安全揭秘》精彩放送—使用反射操作程序集(节选自2.2节)

    5/29/2012 1:11:00 PM

    文/玄魂 前言 经华章图书的允许,我会陆续在博客上公开《.NET 安全揭秘》一书的部分章节。 公开的内容不会和原书完全一致,会做适当的精简和改造。 欢迎大家多提批评和改良的建议,笔者不胜感激。

  • Asp.net安全架构之2:Session hijacking(会话劫持)

    5/30/2012 8:20:00 AM

    原理 会话劫持是指通过非常规手段,来得到合法用户在客户端和服务器段进行交互的特征值(一般为sessionid),然后伪造请求,去访问授权用户的数据。 获取特征值的非常规有段主要有如下几种:

  • Asp.net Ajax的使用

    8/13/2009 5:34:00 PM

    摘要: 本文详细介绍了Asp.net Ajax的各个层面,对于每个部分都给出了代码示例,从利用XMLHttp搭建最基本的Ajax框架开始,逐步介绍了Asp.net Ajax服务器端和客户端的框架,扩

  • ASP.NET Web API Exception Handling

    6/12/2012 5:08:00 AM

    When I talk about exceptions in my product team I often talk about two kind of exceptions, business

  • 杂谈项目中的那些事儿:人的力量

    10/10/2009 5:04:00 PM

    摘要: 所有项目最核心的部分是什么?有人说是钱,也就是项目成果能产生的预期利益,没错!就是钱,而且是未来的钱。而项目本身是花钱的玩意儿,如果未来没回报,谁会干? 哪怕做慈善也图个名和长远的社会效益阿