Younggen可以抛出一些内存错误吗?

时间:2015-09-09 01:53:42

标签: java jvm

Iterable

在JRE7中。如果在eden + s1 + s2空格中没有任何空间的时候怎么办?年轻人会扔掉你的记忆吗? 我还没有看到这种情况发生,但如果有人经历过它,我会感到好奇。

1 个答案:

答案 0 :(得分:1)

这可能取决于实现,但通常不是因为它不是设定值,只是一个上限。如果在伊甸园和/或幸存者空间中没有更多的空间,则将对象直接复制到旧的gen,当没有空间时,JVM首先尝试执行收集。即使你设置XX:MaxTenuringThreshold=0,它也只是意味着对象会立即升级。

考虑到此参数设置上限,实际值由by the JVM

决定
  

终身临界值的最大值。默认值为15.

正如documentation所述:

  

当Java虚拟机因内存不足而无法分配对象时抛出,垃圾收集器不再提供更多内存。

当s1和s2之间的交换次数超过该值并且旧版本中没有空闲内存(并且GC无法释放任何内存)时,问题就会开始。

考虑到将该值设置得太低可能会成为一个问题,如果您的对象是短暂的,但过快地升级到旧的gen。另一方面,如果你的大多数物体都是长寿的,那么让它们在s1和s2之间交换也不是一个好主意。