JVM调优主要是指内存管理方面的调优,包括各个代的大小、GC策略等。
1:代大小的调优
最关键的参数为-Xms -Xmx -Xmn -XX:SurvivorRatio -XX:MaxTenuringThreshold
-Xms和-Xmx通常设置为相同的值,避免运行时要不断的扩展JVM的内存空间,这个值决定了JVM Heap所能使用的最大空间
-Xmn决定了新生代(New Generation)空间的大小,新生代中Eden, S0和S1三个区域的比率可通过-XX:SurvivorRatio来控制
-XX:MaxTenuringThreshold控制对象在经历多少次Minor GC后才能转入旧生代,通常将此值设置为新生代存活周期,此参数只有在
串行GC时有效。
1.1 避免新生代大小设置过小
设置过小时,会产生两种比较明显的现象,一是Minor GC的次数更加频繁,而是有可能导致Minor GC对象直接进入旧生代,此时
进入旧生代的对象占据了旧生代剩余空间,则触发Full Gc。
当MinorGc 过于频繁,或发现经常出现Minor GC时,Survivor的一个区域空间满,且Old Gen增长超过了Survivor区域大小时,就需要
考虑新生代的调整了,调整时的原则是在不能调大JVM Heap的情况下,尽可能放大新生代空间,尽量让对象在Minor Gc阶段被回收,
但新生代空间也不可过大,在能够调大JVM Heap的情况下,则可以按照增加的新生代空间大小增加JVM Heap的大小,以保证旧生代够用。
1.2 避免新生代设置过大
大多数场景下都应该设置的比旧生代小,通常推荐的比例是新生代占JVM Heap区大小的33%左右。
1.3 避免Survivor区过小或者过大
在无法调整JVM以及新生代的大小时,合理调整Survivor区的大小也能带来一些效果。调大SurvivorRatio值意味着Eden区域变大,minor gc
的触发次数会降低,但此时Survivor区域的空间变小了,如有超过Survivor空间大小的对象在minor gc后仍没有被回收,则会直接进入旧生代;
调小SurvivorRatio则意味着Eden区域变小,minor gc的触发次数会增加,Survivor区域变大,意味着可以存储更多在minor gc后仍存活的对象,
避免进入旧生代。