在.NET中显式调用垃圾收集

在.NET中显式调用垃圾收集,.net,garbage-collection,.net,Garbage Collection,我的理解是,在Java中,如果我显式地调用垃圾收集,那么调用所做的只是向垃圾收集器提示已请求收集 基于阅读这里的文档:我说的不是.NET中的情况,如果我调用垃圾收集,那么运行垃圾收集,对吗 文件说明如下: 使用此方法尝试回收无法访问的内存。但是,使用此方法不能保证回收指定代中所有不可访问的内存。 如果实现了对象老化,则垃圾收集器不会收集代数高于指定代数的对象。如果未实现对象老化,垃圾收集器将在垃圾收集期间考虑所有对象 对我来说,这意味着垃圾收集器在您调用它时运行——或者我读错了吗 如果这只是一个

我的理解是,在Java中,如果我显式地调用垃圾收集,那么调用所做的只是向垃圾收集器提示已请求收集

基于阅读这里的文档:我说的不是.NET中的情况,如果我调用垃圾收集,那么运行垃圾收集,对吗

文件说明如下:

使用此方法尝试回收无法访问的内存。但是,使用此方法不能保证回收指定代中所有不可访问的内存。 如果实现了对象老化,则垃圾收集器不会收集代数高于指定代数的对象。如果未实现对象老化,垃圾收集器将在垃圾收集期间考虑所有对象

对我来说,这意味着垃圾收集器在您调用它时运行——或者我读错了吗

如果这只是一个提示,那么内存分析器是如何工作的呢


我问过的每个人都告诉我这只是.NET中的一个提示,所以如果现在不是这样,那么以前的.NET版本中是否也有过这种情况?

这取决于您如何触发GC

:

Default此枚举的默认设置,当前是强制的

强制强制立即执行垃圾收集

优化允许垃圾收集器确定当前时间是否是回收对象的最佳时间

如果调用无参数重载或pass GCCollectionMode.Default,则当前会强制执行GC,但从理论上讲,该行为可能会在.NET的未来版本中发生变化

如果您通过GCCollectionMode.Forced,它将强制立即执行GC

如果你通过GCCollectionMode.Optimized,那只是一个提示。我不知道运行时对这个提示有多认真


因此,如果您想强制GC或确保它只是一个提示,请使用重载。

这取决于您如何触发GC

:

Default此枚举的默认设置,当前是强制的

强制强制立即执行垃圾收集

优化允许垃圾收集器确定当前时间是否是回收对象的最佳时间

如果调用无参数重载或pass GCCollectionMode.Default,则当前会强制执行GC,但从理论上讲,该行为可能会在.NET的未来版本中发生变化

如果您通过GCCollectionMode.Forced,它将强制立即执行GC

如果你通过GCCollectionMode.Optimized,那只是一个提示。我不知道运行时对这个提示有多认真


因此,如果要强制执行GC或确保它只是一个提示,请使用重载。

对象老化是一种笨拙的方式,可以说垃圾收集器支持多代。例如,桌面版的.NET使用3代,而Compact Framework只使用1代。这是一个CLR实现细节。随着物品的老化,换句话说,它们会活得更长,并在收藏中幸存下来,它们将进入编号更高的一代。这是一种优化,GC将在不太可能需要收集的对象上做更少的工作


因此,在CF的情况下,无论传递什么作为参数,都会收集整个堆。在桌面版本中,收集与论点相同的几代人以及年轻一代。换句话说,GC.Collect1将收集第0代和第1代,而不会对第2代执行任何操作。

对象老化是一种笨拙的方式,可以说垃圾收集器支持多代。例如,桌面版的.NET使用3代,而Compact Framework只使用1代。这是一个CLR实现细节。随着物品的老化,换句话说,它们会活得更长,并在收藏中幸存下来,它们将进入编号更高的一代。这是一种优化,GC将在不太可能需要收集的对象上做更少的工作


因此,在CF的情况下,无论传递什么作为参数,都会收集整个堆。在桌面版本中,收集与论点相同的几代人以及年轻一代。换句话说,GC.Collect1将收集gen 0和gen 1,而不使用gen 2执行任何操作。

我想知道,要使CF支持无引用类型字段的密封类的分代GC有多难[所有可变对象都将停留在级别0]?如果引用持有对象可以提升,或者如果GC可以通过某种方式知道引用持有对象是不可变的,那么好处就不会那么大,但我认为一些合理的好处是相对便宜的。我想知道让CF支持无引用类型字段的密封类的分代GC有多难[所有可变对象都将停留在0级]?好处就不会那么大了 至少,如果引用保持对象可以提升,或者如果GC可以知道引用保持对象是不可变的,那么这是可能的,但是我认为可以相对便宜地获得一些合理的好处。