据说.net中的泛型,比如List<T> 垃圾回收器不会自动回收,直到出现结束?有这回事?

解决方案 »

  1.   

    C#和.NET 2.0 实战:平台、语言与框架这本书上说不回收。
    怎么回事?
      

  2.   


    那程序中有一大堆List<>数据,占了一大堆内存
    怎么解决?
      

  3.   

    找到文章了,结合上下文。意思是c#的运行时泛型的一个解释,当使用到泛型类的某个具体类型实例后,JIT会根据类型,生成泛型类的一个副本,使用指定的类型替代之前预留的泛化类型参数<T>。第一次使用时被翻译成IL后,程序退出才会释放,这个没任何问题,因为这只是类的定义,方法代码的副本,是很少的。垃圾回收是针对开发人员创建的托管内存的管理,并不是对CLR的管理。而保留这个泛型类的副本,也是一种优化,否则你反复使用List<int>则反复生成代码,效率会很低的。文章
    http://hi.baidu.com/li6343990/blog/item/58a2556fe57094f643169483.html
      

  4.   

    写个循环,无限调用一个方法 方法内部实例化一个泛型集合 
    看看在一段时间后是否会出现windows内存不足的提示.
    如果是则垃圾回收器不回收 否则 肯定是回收了.注意观察你的任务管理器, 当到达一个内存使用高峰期的时候 垃圾回收器会直接回收所有未使用资源.
    你的内存使用率会突然掉下去一大截.
      

  5.   


    你看的文章是描述CLR的原理,你的问题却和这个文章无关。
    托管内存是自动释放的。你可以检查是否有需要调用Dispose的地方没调用。或是手工的执行GC.Collect()。
      

  6.   

    垃圾回收也不是万能的,回收也是有条件的。
    比如一个对象由两部分组成,栈上的引用,堆中的实例(也就是具体的存数据的)
    如果堆中的实例没有被栈上的引用使用,这个实例会被回收。反之只要有引用,就不会被回收。直到应用程序被结束。泛型集合中全是引用,只要集合在,引用也就在了,所以实例也就不会被回收。能确认一个对象不用了,最好就置nullo=null;