您的幸存者比例非常重要,10 000 您告诉 JVM 幸存者空间是伊甸园大小的 10000 分之一。
从文档:
如果幸存者空间太小,复制集合会直接溢出到终身代。如果幸存者空间太大,它们将是无用的空。在每次垃圾回收时,虚拟机都会选择一个阈值次数,一个对象在其被永久保存之前可以被复制。选择此阈值以使幸存者保持半满。命令行选项 -XX:+PrintTenuringDistribution 可用于显示该阈值和新生代对象的年龄。它对于观察应用程序的生命周期分布也很有用。
很明显,由于幸存者空间比率如此之低,您的对象直接存储在终身代中。
当终身代满时,发生了一个主要的收集,这就是你[Full GC...]
在日志中看到的原因。
如果你想让年轻一代更大的用途:
-XX:NewRatio=1
这意味着伊甸园和幸存者空间的组合大小将是总堆大小的一半。(我猜你不可能有更大的年轻一代)
-XX:NewSize
如果你已经设置了-Xmn
,你也不必设置,-Xmn
从 1.4 开始也是一样的。而且我猜你不想从上面绑定年轻一代-XX:MaxNewSize
,默认值是无限的。但是将年轻代的大小设置为与最大堆大小相同的值意味着您不会为老年代留出空间,所以我猜JVM会调整代的大小。
总而言之,在某些情况下,分配可以直接发生在终身代中。(对象会直接分配到老年代吗?)
- 如果年轻代分配失败,并且对象是一个不包含任何对象引用的大数组,则可以直接将其分配到年老代。在某些特定情况下,此策略旨在通过从老年代分配来避免收集年轻代。阈值大小为 64k 字。