JVM的区域分类
Eden区域:新的对象生成时所使用的空间
Survivor区域: 包括from, to两个空间,用于保留正在使用的对象,延迟把这些对象移动到Old区域直到他们经历多次Scavenge GC后
New区域: 包括Eden和Survivor区域
Old区域: 寿命较长的对象保留在该区域
在Eden区域被用完的时,Scavenge GC将会自动启动,并把那些当前还存在引用的对象从Eden区域移动到to区域中。每次Scavenge GC时在form或to里还在使用的对象将会来回移动,直到他们的移动次数达到一定的限制,该限制是由MaxTenuringThreshold决定,MaxTenuringThreshold的默认值是32。这样的话一个对象可以在from和to之间进行32次交换,然后才会被移动到Old区域。
JVM启动参数
-Xms: Heap Size的初始值
-Xmx: Heap Size的最大值
-Xmn: New区域的大小
-XX:SurvivorRatio=<n>: Eden区域的大小除以from或to区域的大小,from和to区域的大小是相等的。n默认是8
GC种类
Scavenge GC: 回收New区域的对象
Ful GC: 回收New和Old两个区域的对象
优化目标
・减少Scavenge GC次数・缩短Scavenge GC的时间
・减少Full GC次数,尽量使Full GC不发生优化
调整的顺序
・增加Survivor区域
・增加New区域
・增加Heap区域 其他
通常-Xmn的值设置为-Xmx值的三分之一。在项目里如果临时对象使用的多的情况下,也可以将-Xmn的值设置为-Xmx值的一半。
通过调整SurvivorRatio的值可以控制对象在Survivor区域里的生存时间,SurvivorRatio的值越小,对象在Survivor区域里生存的时间越长。这样可以减少对象移动到Old领域,相应的减少Full GC的回数。
-Xverbosegc : 垃圾回收的详细输出的参数kill -3 <pid> : 输出JVM进程里正在处理的内容
References
1.
2.