.net 垃圾回收与调试

using System;
using System.Threading;

public static class Program{
	public static void Main(){
		//创建一个Timer对象,每隔2000毫秒就调用一次TimerCallBack方法
		Timer t= new Timer(TimerCallBack, null, 0, 2000);
		
		Console.ReadLine();
	}
	
	private static void TimerCallBack(Object o){
		Console.WriteLine("In TimerCallBack:" + DateTime.Now);
		//出于演示目的,强制执行一次垃圾回收
		GC.Collect();
	}
}

垃圾回收开始时,垃圾回收器首先假定堆中的所有对象都是不可达的(垃圾);这当然也包括Timer对象。然后,垃圾回收器检查应用程序的根,发现在初始化以后,Main方法再也没有用过变量t . 既然应用程序没有任何变量应用Timer对象,垃圾回收就回收了分配给它的内存;这使计时器停止触发,并解释了为什么TimerCallback方法只被调用了一次。

注意:如果当前在调试程序,会造成整个出人意料无法显示对象t的情况。因此Microsoft提出一个解决方案:JIT编译器将方法的IL代码编译成本地代码时,JIT编译器会检查两点:定义方法的程序集在编译时没有优化;进程当前在一个调试器中执行。如果这两点都成立,JIT编译器在生产方法的内存根表时,会将所有变量的生存期手动延长至方法结束。换言之,JIT编译器自己骗自己,让自己认为Main中的t变量必须生存到方法结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值