当前位置: 首页 > 知识库问答 >
问题:

为什么垃圾收集器要单独处理可终结的对象?

井洲
2023-03-14

我正在读杰弗里·里克特的书“通过C#进行CLR”。它是从那里引用的:

Finalize方法在GC确定为垃圾的对象的垃圾收集完成时调用。这意味着不能立即回收这些对象的内存,因为Finalize方法可能执行访问字段的代码。因为一个可终结的对象必须在集合中存活,所以它会被提升到另一个世代,从而迫使该对象比它应该存活的时间长得多

共有1个答案

祝灼光
2023-03-14

为什么不能立即回收可完成的对象?我无法理解finalize方法可能执行访问字段的代码的参数。什么是问题?

>

  • 因为finalize()只是对象的普通方法,所以其中的代码可以访问对象的任何字段。

    当垃圾回收发生时,所有线程都被冻结。

    而且,我不明白为什么finalizable对象要移动到老一代,并存储在单独的队列中(在其他finalizer线程中处理)。

    要理解这一点,首先需要了解生成gc模型的概念。当对象从“freachable”队列中弹出并再次准备好进行垃圾收集后,由于它们在前一个队列中幸存下来,它们被移到了老一代。

  •  类似资料:
    • 来自MSDN:“当一个对象不可访问时,垃圾收集器会将该对象视为垃圾。然后,当垃圾收集器将一个对象的条目从终结队列移动到freachable队列时,该对象不再被视为垃圾,其内存也不会被回收。此时,垃圾收集器已完成对垃圾的识别。一些被识别为垃圾的对象已被重新分类。”被归类为非垃圾。垃圾收集器压缩可回收内存,特殊运行时线程清空可回收队列,执行每个对象的Finalize方法。需要两个GC来回收需要终结的对

    • 为了理解可用的JVM垃圾收集算法,我在查看java-available垃圾收集算法链接时感到困惑。 根据我的理解,将会有一些标准的GC算法,不同的JVM供应商实现这些算法来创建垃圾收集器。 现在请帮助我理解下面是算法还是算法的实现: 序列, 平行, CMS, G1, 我认为这些是实现某些特定算法的垃圾收集器类型(我不知道算法的名称)。 此外,我还浏览了在http://www.oracle.com/

    • 问题内容: 是什么决定了垃圾收集器何时真正收集?它是在一定时间之后还是在一定数量的内存用完之后发生的吗?还是还有其他因素? 问题答案: 它在确定是时候运行时运行。在世代垃圾收集器中,一种常见的策略是在第0代内存分配失败时运行收集器。也就是说,每次你分配一小块内存(大块通常直接放置在“旧”代中)时,系统都会检查gen-0堆中是否有足够的可用空间,如果没有,则运行GC释放空间以使分配成功。然后将旧数据

    • 问题内容: 我是Java新手,对Java中的垃圾收集器感到困惑。它实际上是做什么的,什么时候生效。请描述Java中垃圾收集器的一些属性。 问题答案: 该垃圾收集器是运行在一个程序的Java虚拟机,其摆脱其未使用的Java应用程序了对象。它是自动内存管理的一种形式。 当典型的Java应用程序运行时,它正在创建新的对象,例如和,但是在一段时间之后,这些对象将不再使用。例如,看下面的代码: 在上面的代码

    • Java 15 使 ZGC、Z 垃圾收集器成为标准功能。它是 Java 15 之前的一个实验性功能。它是低延迟、高度可扩展的垃圾收集器。 ZGC 是在 Java 11 中作为一项实验性功能引入的,因为开发人员社区认为它太大而无法提前发布。 即使在机器学习应用程序等海量数据应用程序的情况下,ZGC 也具有高性能和高效工作。它确保在处理数据时不会因垃圾收集而长时间停顿。它支持 Linux、Window

    • Java 15 使 ZGC、Z 垃圾收集器成为标准功能。它是 Java 15 之前的一个实验性功能。它是低延迟、高度可扩展的垃圾收集器。 ZGC 是在 Java 11 中作为一项实验性功能引入的,因为开发人员社区认为它太大而无法提前发布。从那时起,对这个垃圾收集做了很多改进,例如 - 并发类卸载 取消提交未使用的内存 支持班级数据共享 NUMA 多线程堆Pre-touch 最大堆大小限制从 4 T