如何通过NewRatio JVM参数为年轻代分配三倍于老年代的内存?
解决NewRatio参数设置年轻代为老年代3倍的问题
首先得澄清一下-XX:NewRatio参数的定义,你之前直接写1:3肯定会报错,因为这个参数需要的是一个数值,而不是比例格式的字符串。
在HotSpot JVM里,-XX:NewRatio=N的核心含义是:老年代的内存大小是年轻代的N倍。对应的公式可以表示为:
老年代大小 = N × 年轻代大小
默认情况下NewRatio=2,也就是老年代与年轻代的内存占比为2:1。
现在你想要实现年轻代大小 = 3 × 老年代大小,把这个需求代入上面的公式推导:
老年代大小 = N × (3 × 老年代大小)
两边约去老年代大小后,就能算出N=1/3≈0.333。
所以正确的参数设置应该是:
-XX:NewRatio=0.333
不过有两点需要注意:
- 不是所有JVM版本都支持小数的NewRatio值,比如一些较旧的HotSpot版本只接受整数参数。如果你的JVM不支持小数,单纯通过NewRatio参数就无法实现这个比例,这时候可以直接用
-XX:NewSize、-XX:MaxNewSize和-XX:OldSize来指定固定大小,比如:-XX:NewSize=3g -XX:MaxNewSize=3g -XX:OldSize=1g - 要确保整个堆的总大小(年轻代+老年代)不超过
-Xmx设置的最大值,比如上面的例子里-Xmx至少要设为4g。
内容的提问来源于stack exchange,提问作者Jess
相关产品推荐
相关产品推荐

