【问题标题】:What exactly takes place behind the scenes when you call System.gc()?当您调用 System.gc() 时,幕后究竟发生了什么?
【发布时间】:2009-07-05 12:02:09
【问题描述】:

调用 System.gc() 请求进行垃圾收集,但不能保证。关于无法保证的部分对我来说很有趣:有人可以解释您拨打此电话时发生的确切过程吗?

【问题讨论】:

    标签: java garbage-collection


    【解决方案1】:

    不能保证会发生垃圾收集,因为不能保证 JVM 支持垃圾收集(我不相信 JLS 中根本没有提到,当然index 中也没有)。

    但是,我认为这种“无法保证”的信念有点错误。来自太阳API docs

    当控制从方法返回时 调用,Java 虚拟机有 尽最大努力回收空间 来自所有丢弃的对象。

    好的,所以也许不能保证,但这向我表明,当您调用此方法时,正常的 JVM 实际上会启动 GC 周期。也许一些 JVM 不会,也许未来的一些垃圾收集器不会,但现在,它会做宣传的事情。

    当然,也就是说,应用程序代码几乎没有理由调用此方法。 JVM 会在需要时收集垃圾。

    【讨论】:

    • 在规范中,“尽力而为”可能被解释为根本没有特别的努力。
    【解决方案2】:

    确切的过程是特定于 JVM 的,实际上是一个正在进行大量研究的领域。这是可能的,因为规范对实际应该发生的事情非常模糊。

    最初,Java 有一个“停止一切并查看每个对象以查看哪些还活着”。这是 1) 缓慢和 2) 在发生这种情况时停止了一切。

    今天,基于 Sun 的 JVM 有多个对象池,因为大多数对象的寿命不长,因此通过保持单独的池可以避免很多工作。

    Suns 关于如何在 java 5 中调整 gc 的文档对发生的事情很有指导意义:

    http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

    【讨论】:

      【解决方案3】:

      具体过程取决于 JVM 的版本和供应商。

      有不同的算法 - 标记和扫描、分代等。通常它们在并行线程中运行。

      JVM 可以调用System.gc()disabled,所以这是一个很好的理由,不能保证。 IBM 的Java theory and practice: Garbage collection and performance 对此进行了更多讨论,并解释了为什么对于帮助 GC 似乎显而易见的事情实际上会损害 性能。它还解释了许多用于实现 GC 的算法。

      Sun 还在 Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning 中描述了他们的各种 GC 实现。

      【讨论】:

        猜你喜欢
        • 2016-03-19
        • 2021-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 2022-11-27
        相关资源
        最近更新 更多