Survivor内存中的垃圾收集逻辑是什么?-这是基于创建对象的时间还是基于使用自由度



垃圾回收器在幸存者1和幸存者2之间经过8次传递后收集对象。8是不固定的,这也可以根据堆的大小来减少。我的问题是8次通过后的删除逻辑是什么。这是基于创建时间,我指的是删除旧对象,还是基于使用频率,我指使用频率较低的先收集垃圾。如果有基于频率的最小限制是多少。

如果对象还活着,它们会被移动到另一个幸存者空间。晋升为旧一代/终身制是基于幸存的gc周期数。(当然还有活力(这里应该补充一点,如果其他幸存者空间太小,最旧的对象将提前升级到旧的世代/终身空间。

提供了幸存者空间,以便在对象升级到旧一代之前给它们更多的机会进行收集(从而减少旧一代收集器的负载(

发生次要GC时仍存在于eden空间中的对象大多被复制到"to"幸存者空间,以及仍在"from"幸存者空间中引用的任何对象。不适合幸存者空间的大型对象将直接复制到旧一代(此终身制(。对象在被终身使用之前在幸存者空间之间复制的次数由终身使用阈值控制。this的值有一个初始值和最大值,默认情况下分别为7和15(在JDK8中(。这些可以通过命令行标志-XX:InitialTenuringThreshold=n和-XX:MaximumTenuringThreshold=n显式设置。

JVM将在初始值和最大值范围内调整寿命阈值。一个额外的标志-XX:TargetServivorRatio=n(默认为50(可用于修改集合中使用的幸存者空间的百分比。

为了回答您的具体问题,对象的寿命是基于生存期而不是访问频率。

最新更新