以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Dot NET,C#,ASP,VB 』  (http://bbs.xml.org.cn/list.asp?boardid=43)
----  管窥.net-----GC  (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=11854)


--  作者:admin
--  发布时间:11/9/2004 2:26:00 AM

--  管窥.net-----GC


发信人: walts (小天堂), 信区: DotNET        
标  题: 管窥.net-----GC
发信站: BBS 水木清华站 (Wed May  9 10:45:18 2001)

为什么.Net运行是环境不使用决定性空间析构
首先说明, 在.Net环境下, 如果对一个类型对象的最后一个引用不再存在,  
它所占用的空间是不一定会被释放的. 这就是指.Net不是决定性空间析构.  
那为什么会这样呢? 事实上,这和.Net使用的垃圾自动回收的算法有关.  
对于一个应用程序来讲, .Net会隔一段时间自动检查它的所有类型对象引用.
那些在每次查找的时候不再存在的对象才会被自动进行空间回收. 这就是说,
当一个对象的引用不再存在的时候,不会主动通知.Net运行时环境要回收它的空间.
只有在下一次进行对象引用扫描的时候才会回收. 这样做的目的就是要尽可能少的
进行垃圾自动回收, 减少性能损失. 其实, 一般情况下, 当堆空间耗尽的时候,
就会引发一次垃圾回收扫描操作.  

对垃圾自动回收能够控制吗?

是的, System.GC类的确提供了一些有趣的方法.  
第1个是Collect方法, 它强制垃圾回收器立即回收所有的无引用对象.
第2个是RequestFinalizeOnShutdown方法, 它告诉垃圾回收器在应用程序退出之
前一定要调用所引用的每个对象的Finalize方法. 一般的情况下垃圾回收操作执
行快速操作, 它比Finalize的优先级要高. 所以,用这个函数可以在一定程度上
保证可靠性.
用下面这个例子, 可以做一下验证.
using System;  

class CTest
{
protected override void Finalize()
{  
  Console.WriteLine( "This is the Finalizer." );  
}  
}  

class CApplication  
{  
public static void Main()  
{  
  Console.WriteLine( "This is Main." );  
  CTest test = new CTest();  
   
  // GC.RequestFinalizeOnShutdown();  
}
}
先运行一遍这个程序,然后把GC.RequestFinalizeOnShutdown这一行的注释去掉,再
试验一下.

--

※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.142.76]
上一篇
返回上一页
回到目录
回到页首
下一篇



W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
31.250ms