gpt4 book ai didi

java - 为什么让短期和长期对象在垃圾收集中有所不同?

转载 作者:IT老高 更新时间:2023-10-28 20:39:01 24 4
gpt4 key购买 nike

我经常读到,在 Sun JVM 中,短期对象(“相对较新的对象”)可以比长期对象(“相对较旧的对象”)更有效地进行垃圾收集

  • 为什么会这样?
  • 这是特定于 Sun JVM 还是源于一般垃圾收集原则?

最佳答案

大多数 Java 应用程序会创建 Java 对象,然后很快将其丢弃,例如。您在方法中创建了一些对象,然后一旦退出该方法,所有对象都会消失。大多数应用程序都以这种方式运行,并且大多数人倾向于以这种方式编写应用程序。 Java 堆大致分为 3 部分,永久、老(长生命周期)代和年轻(短生命周期)代。 Young gen 进一步分为 S1、S2 和 eden。这些只是堆。

大多数对象都是在年轻一代中创建的。这里的想法是,由于对象的死亡率很高,我们快速创建它们,使用它们然后丢弃它们。速度至关重要。当你创建对象时,young gen 会被填满,直到发生 Minor GC。在次要 GC 中,所有存活的对象都从 eden 复制过来,并将 S2 复制到 S1。然后,“指针”停留在 eden 和 S2 上。

每个副本都会使对象老化。默认情况下,如果一个对象存在 32 个副本,即。 32 次次要 GC,然后 GC 估计它会存在更长的时间。因此,它所做的就是通过将其移至老一代来对其进行终身维护。老一代只是一个大空间。当老一代填满时,老一代会发生一次完整的 GC 或主要 GC。因为没有其他空间可以复制,GC 必须压缩。这比 Minor GC 慢很多,这就是我们避免更频繁地这样做的原因。

您可以使用

调整tenuring参数
java -XX:MaxTenuringThreshold=16 

如果你知道你有很多长寿的对象。您可以使用

打印应用程序的各个年龄段
java -XX:-PrintTenuringDistribution

关于java - 为什么让短期和长期对象在垃圾收集中有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2620533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com