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

  • C# 保存图像文件到SQL SERVER数据库,再读取该文件并显示

    2009-7-24 4:54:00

    需要在SQL SERVER中创建数据库test, 然后再test中创建一个数据表ImageTable, 含字段 id int 自动增长 ImagePath nchar(50) Image image

  • 实用SQL语句

    2009-12-9 12:49:00

    阅读: 191 评论: 0 作者: 语虫 发表于 2009-12-09 11:51 原文链接 查询表内容 SELECT 表名=case when a.colorder=1 t

  • asp.net移动Web开发之学习篇(二)

    2010-1-8 19:46:00

    阅读: 249 评论: 2 作者: 总想拥有自己的天空 发表于 2010-01-08 16:54 原文链接 1.新建一个Mobile Web Form页面,在左边的Mobile Web F

  • jquery uploadify在谷歌浏和火狐下无法上传的解决方案(.Net版)

    2011-3-30 14:21:00

    在项目紧张的进行过程中,jquery uploadify上传不兼容的问题一下没有试着去解决,只想着用ie的人越来越多,怎么奈何firefox4刚推出,就有4000万的下载.......仰天长吧,记生

  • form关闭时的一个奇特现象

    2007-9-21 12:03:00

    摘要: 今天查一个错误时发现这个问题。 有一个frmEdit。在Closing事件里面判断数据是否修改,然后提示用户是否需要保存数据。 提供了三个按钮,yes,no,cancel。 yes:保

  • 简单ORM框架设计0——简介

    2009-6-25 20:54:00

    0.简单ORM框架设计0——简介 Known.DLite是一个简单ORM框架,它是我的第一个开源项目,也是我的练习作品。虽然想法有些简单,思路有些混乱,代码不够严谨,性

  • Asp.NET导出Excel文件乱码解决方法

    2012-7-28 16:06:00

    最近做的一个Asp.net项目中需要在后台生成Excel时出现乱码的问题,但只出现在IE中。 随后又就去网上查了一下csdn和cnblogs,得到的结果是,如下代码 HttpRespons

  • 你必须知道的ADO.NET(八) 深入理解DataAdapter(上)

    2012-3-25 16:58:00

    摘要 ADO.NET有两个核心组件:基于连接的Data Provider组件以及基于非连接的DataSet组件。基于连接的Data Provider组件常用于实时地从数据库中检索数据。而基于

  • 如何用C#设置IE的代理

    2009-7-17 16:03:00

    大家好,在上一篇文章中《 用C#实现Web代理服务器 》中大家知道了代理服务器的实现和使用。但是使用上文介绍中的方法每次都要设置很麻烦。所以就有了本文《如何用C#设置IE的代理》我以以把主要源码贴

  • 愉快的学习并且进步着(一)

    2007-4-27 17:34:00

    摘要: 个人网站 传音石 之前的版本是在页面打开的时候,才去读取RSS源,以致于第一次访问的时候速度很慢。虽然RSS Toolkit也有自己的缓存机制,但是整体的运行速度还是很慢,而且并不利于一些有