垃圾回收

原创 2006年05月19日 11:05:00

 .net垃圾回收要区别代码是托管代码或是非托管代码。在回收期间,如果垃圾回收器在托管代码中找到对某对象的一个或多个引用,
则不会释放该对象。垃圾回收器不识别非托管代码中对对象的引用,因此,除非明确禁止,否则它有可能释放非托管代码中以独占
方式使用的对象(GC无法回收非托管资源?)。(KeepAlive 方法提供一种机制,该机制可防止垃圾回收器回收在非托管代码中仍使用的对象。)


对于托管代码垃圾回收器会回收废弃对象,在回收废弃对象的的时候,垃圾回收器首先要检查该对象有无析构函数,如果没有就立即
回收,如果有,就把该对象的引用放入一托管回收列表中,当垃圾回收器检查完后,就开始清理托管列表中的对象,但并不马上回收内
存,要等到下一次垃圾回收器检查废弃对象的时候,才全部回收内存。


对于非托管资源,可以使用Finalize方法,.NET Framework 提供Finalize方法,它允许对象在垃圾回收器回收该对象使用的内存
时适当清理其非托管资源。C#中显性地调用finalizer是不允许的,它只能被碎片收集程序调用。如果希望尽快地释放一些不再使用
的数量有限的非托管资源(如文件句柄),则应该使用IDisposable接口,这一接口有个Dispose方法,它能够帮你完成这个任务。
Dispose是无需等待Finalize被调用而能够释放非托管资源的方法。Dispose方法的实现请采用微软所推荐的public   Dispose()和
private   Dispose(   bool   disposing   )。


任务管理器显示的是物理内存占用量,不包括页面文件上交换过去的内存,也不完全都是程序自己占用的,有些内核对象占用的空间也
被计算在内。窗口最小化时内存占用量下降,是因为Windows自动把程序此进程不常用的内存交换到页面文件,把内存空间让给活动窗
口这个特性对于所有Windows程序默认都一样(除非通过SetProcessWorkingSetSize   API直接指定working   set大小),当然也包括
.NET程序 。 GC.Collect方法并不保证回收所有无法访问的内存  
   
  可以这么写(这个技巧来自《.NET   框架程序设计》):  
  //   先强制回收一次内存(内存仍未释放,因为对象还要"复苏",然后执行Finalize方法)  
  GC.Collect();  
  //   等待所有对象的Finalize方法调用完成  
  GC.WaitForPendingFinalizers();  
  //   再次回收(此时内存空间才会被真正释放)  
  GC.Collect();  

垃圾回收的算法与实现

  • 2017年10月12日 15:59
  • 27.09MB
  • 下载

java 垃圾回收 机制详解

  • 2016年05月09日 16:48
  • 203KB
  • 下载

Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C、C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确...

Flex之垃圾回收

  • 2014年10月28日 13:43
  • 677KB
  • 下载

Java垃圾回收原理

  • 2012年05月10日 13:40
  • 3KB
  • 下载

Java GC专家系列1:理解Java垃圾回收

了解Java的垃圾回收(GC)原理能给我们带来什么好处?对于软件工程师来说,满足技术好奇心可算是一个,但重要的是理解GC能帮忙我们更好的编写Java应用程序。 上面是我个人的主观的看法,但我相信...

JVM内存分配与垃圾回收详解

  • 2012年07月06日 17:11
  • 10.83MB
  • 下载

jvm:停止复制、标记清除、标记整理算法(垃圾回收)

jvm:停止复制、标记清除、标记整理算法(垃圾回收)
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:垃圾回收
举报原因:
原因补充:

(最多只允许输入30个字)