我能否拥有比老年代更大的年轻代?

4

如果我看到新生代和老生代的空间大部分未被利用,那么将年轻一代的大小设置得比老一代大是否可以?

将新生代的大小超过老生代会有什么后果吗?例如:-Xmx2g -Xmn1.5g


你在说什么? - ΦXocę 웃 Пepeúpa ツ
大多数活动应该在新生代进行,这是整个重点。如果你觉得分配给堆的空间比你实际需要的更多,就把它变小吧。但是你可能不应该增加新生代的大小。 - puhlen
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/sizing.html - Iłya Bursov
1个回答

3
你可以使用-Xmn来实现这一点(本答案基于java 8)
来自文档
设置新生代(nursery)堆的初始大小和最大大小(以字节为单位)。附加字母k或K表示千字节,m或M表示兆字节,g或G表示千兆字节。
堆的新生代区域用于新对象。在此区域执行GC的次数比其他区域更频繁。如果新生代的大小太小,则会执行许多次小型垃圾收集。如果大小太大,则只会执行完整的垃圾收集,这可能需要很长时间才能完成。Oracle建议您将新生代的大小保持在总堆大小的一半至四分之一之间。
以下示例显示如何使用各种单位将新生代的初始大小和最大大小设置为256 MB:
-Xmn256m -Xmn262144k -Xmn268435456
除了使用-Xmn选项同时设置新生代堆的初始大小和最大大小外,还可以使用-XX:NewSize设置初始大小,并使用-XX:MaxNewSize设置最大大小。

-Xms1024M -Xmx1024M -Xmn800m

这里的空间看起来像这样(使用visualvm的visual gc插件)enter image description here

您将拥有总共1024m的堆大小,其中800m用于年轻代(eden + 2个survivor空间),224m用于老年代。您可以使用SurvivorRatio调整survivor空间。

docs中得知:

您可以使用参数SurvivorRatio来调整survivor空间的大小,但这通常对性能不重要。例如,-XX:SurvivorRatio = 6将eden和一个survivor空间之间的比率设置为1:6。换句话说,每个survivor空间将是eden大小的六分之一,因此是年轻代大小的八分之一(不是七分之一,因为有两个survivor空间)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接