Java gc - 什么是长寿命对象?

Java gc - what is long-lived object?

我被告知不要创建太多长期存在的对象以获得更好的 gc 性能。因为长寿命的对象将被移动到老年代。而且旧世代收集物品的成本更高

但是长寿是什么意思? 100 毫秒太长了吗?那么 10 秒呢?

我的应用占用15G堆内存并使用G1 gc,我找不到像'how long to move an object to old gen'

这样的配置

tenuring threshold 是一个对象在被提升到老年代之前可以在新生代集合中存活的次数。这可以用这些配置 options:

  • -XX:InitialTenuringThreshold:初始任期阈值(默认为7)。
  • -XX:MaxTenuringThreshold: 最大期限阈值(并行收集器的默认值为 15,CMS 的默认值为 4)。
  • -XX:+PrintTenuringDistribution:打印tenuring年龄信息。

长寿命对象是在足够小的集合中存活下来的对象,并且 'moved' 到老年代。

在第一次 GC 中,活动对象从新生代移动到幸存者 space。 然后,经过多次gcs后,他们被tenured到old space.

如此处所示,survivor doc,gc 对象在被使用之前存活的数量取决于幸存者 space 大小。

At each GC, the JVM determines the number of times an object can be copied before it is tenured, called the tenure threshold. This threshold is chosen to keep the survivor space half full.

如果你想有更多的控制权,你可以使用JVM参数XX:MaxTenuringThreshold