asp.net 内存管理机制

.net 中内存分为stack (栈)和 heap(堆)。

 1)stack:内存自动维护,用完即清理。

栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小

2)heap:需要垃圾回收器(GC)回收释放。

 堆(Heap)是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程,C/C++分别用malloc/New请求分配Heap,用free/delete销毁内存。由于从操作系统管理的内存分配所以在分配和销毁时都要占用时间,所以用堆的效率低的多!但是堆的好处是可以做的很大,C/C++对分配的Heap是不初始化的。  

GC工作机制:而垃圾回收器启动回收工作的时候,会暂停你程序的所有线程,然后根据一定的算法找出没有不再在程序中使用的对象并删除它们。然后GC会重新组织堆中所有剩下的对象来节省空间,并调整栈和堆中所有与这些对象相关的指针。

c#程序运行时内存中存放四大类型数据:

值类型(Value Types):bool byte char decimal double enum float int long  sbyte short struct uint ulong ushort

引用类型(Reference Types:class interface delegate object string

指针类型(Pointers):

指令类型(instructions):

如何决定哪些类型放到stack还是heap,两条原则:

1 引用类型通常放到heap

2 值类型和指针类型通常放到其声明的地方。

当值类型被声明在一个函数体内时,它将被放到stack

而当值类型被声明在一个方法体外,而在一个引用类型之内时,他将被放到该引用类型所占的heap内。

托管和非托管有什么区别

托管的意思,你不用直接操作内存,你需要的时候跟我说。我替你申请,然后给你用,你用完可以告诉我,我帮你释放,如果你忙,忘记告诉我了,我也会在定期去帮你释放的。 这就是托管,你打交道的不是直接的内存,而是.net clr。
非托管的意思就是你要自己负责管理内存,这里所说的内存管理。实际上只是堆上的内存管理,栈内存和以前的一样,函数退出则释放,heap上的内存,非托管内存需要自己分配,调用构造函数(c需要,c++里用new替代这部操作了),使用完毕后,需要自己释放这个内存,如果你不小心,吧只想内存的指针弄丢了,就造成内存泄露了,这个内存泄露在你程序退出之前是无法弥补的,所以要小心。

简单说,托管的意思是托管内存,但多一层必然会慢。(摘自csdn:http://topic.csdn.net/u/20100319/11/50e08edd-49e1-4205-8fae-05518503fad4.html

转载于:https://www.cnblogs.com/Irene1985/archive/2012/01/31/2332892.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值