我的理解是,在Java中,如果我显式地调用一个垃圾收集,那么调用所做的就是向垃圾收集器“提示”已经请求了一个收集。
基于阅读这里的文档:http://msdn.microsoft.com/en-us/library/y46kxc5e(v=vs.110).aspx --我说得对吗--在.NET中不是这样的,如果我调用一个垃圾收集,那么垃圾收集就会运行吗?
文件说明如下:
使用此方法尝试回收无法访问的内存。但是,使用此方法并不能保证在指定的生成中所有不可访问的内存都被回收。如果实现了对象老化,垃圾回收器将不会收集具有高于指定生成的生成号的对象。如果未实现对象老化,垃圾回收器将在垃圾收集期间考虑所有对象。
对我来说,这意味着垃圾收集器在你打电话时会运行--或者我看错了吗?
如果它只是一个提示,例如内存分析器是如何工作的?
我问过的每个人都告诉我,这是一个提示,也只是在.NET中,所以如果现在不是这样的话,在以前的.NET版本中是否也是如此呢?
发布于 2014-11-20 10:38:40
这取决于如何触发GC。
GCCollectionMode
Default此枚举的默认设置,该枚举当前是强制的。Forced强制立即进行垃圾收集。Optimized允许垃圾收集器确定当前时间是否是回收对象的最佳时间。
如果调用无参数重载或传递GCCollectionMode.Default,则当前强制执行GC,但理论上,这种行为在未来版本的.NET中可能会发生变化。
如果您通过GCCollectionMode.Forced,它将强制立即执行GC。
如果您通过GCCollectionMode.Optimized,这只是一个提示。我不知道运行时如何认真地对待这个提示。
因此,如果您想强制GC或确保它只是一个提示,请使用Collect(int generation, GCCollectionMode mode)重载。
发布于 2014-11-20 12:54:19
“对象老化”是一种笨拙的方式,可以说垃圾收集器支持多代。例如,桌面版的.NET使用3代,Compact只使用1代。这是一个CLR实现细节。换句话说,随着对象“年龄”的延长,它们将进入编号较高的一代。这是一种优化,GC将减少对不太需要收集的对象的工作。
因此,在CF的情况下,不管您作为参数传递了什么,都会收集整个堆。在桌面版本中,相当于论点的几代人以及年轻一代都会被收集起来。换句话说,GC.Collect(1)将收集gen #0和gen #1,而对gen #2则完全不做任何事情。
https://stackoverflow.com/questions/27035412
复制相似问题