我的理解是,在Java中,如果我显式地调用了垃圾收集,那么所有调用都会向垃圾收集器“提示”已经请求了一个集合。
基于阅读这里的文档:http://msdn.microsoft.com/en-us/library/y46kxc5e(v=vs.110).aspx我是否正确地说这不是.NET的情况,如果我要求垃圾收集,那么运行垃圾收集?
文档说明如下:
使用此方法尝试回收无法访问的内存。但是,使用此方法并不能保证回收指定代中的所有无法访问的内存。 如果实现了对象老化,则垃圾收集器不会收集具有高于指定生成的世代号的对象。如果未实现对象老化,则垃圾收集器会在垃圾回收期间考虑所有对象。
现在对我而言,暗示垃圾收集器在你打电话时运行 - 或者我读错了?
如果只是一个提示,那么内存分析器如何工作呢?
我所问过的每个人都告诉我,这只是在.NET中的提示,所以如果现在不是这样,那么以前的.NET版本是不是这样呢?
答案 0 :(得分:3)
“对象老化”是一种笨拙的方式,说垃圾收集器支持多代。例如,.NET的桌面版本使用3代,Compact Framework仅使用1代。它是CLR实现细节。作为对象“年龄”,换句话说,活着更久并且在收藏中存活,它们将进入更高编号的世代。这是一种优化,GC对不太可能需要收集的对象的工作量会减少。
因此在CF的情况下,无论您作为参数传递什么,都会收集整个堆。在桌面版本中,收集了与论据以及年轻一代相同的代。换句话说,GC.Collect(1)将收集gen#0和gen#1,而不会对gen#2做任何事情。
答案 1 :(得分:1)
这取决于您如何触发GC。
Default
此枚举的默认设置,当前为强制。
Forced
强制立即进行垃圾收集。
Optimized
允许垃圾收集器确定当前时间是否是回收对象的最佳时间。
如果调用无参数重载或传递GCCollectionMode.Default
,它当前会强制执行GC,但从理论上讲,在将来的.NET版本中,行为可能会发生变化。
如果您通过GCCollectionMode.Forced
,则会强制立即执行GC。
如果您通过GCCollectionMode.Optimized
,那么它只是一个提示。我不知道运行时对此提示的重视程度。
因此,如果您要强制使用GC或确保它只是提示,请使用Collect(int generation, GCCollectionMode mode)
重载。