1.垃圾收集器串行收集
用一个空的项目
初始参数
-XX:+PrintGCDetails -Xmx32M -Xms1M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseSerialGC
-XX:PermSize=32M
GC 回收次数25次 吞吐量4662
加大初始堆内存大小-Xms1M 修改为32m
GC 回收次数7次 吞吐量5144
扩大堆的最大内存为512M
-XX:+PrintGCDetails -Xmx512M -Xms32M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseSerialGC
-XX:PermSize=32M
GC 回收次数6次 吞吐量5141
结论:垃圾回收次数和设置最大堆内存大小无关,只和初始内存有关系。初始内存会影响吞吐量。
调整初始堆
-XX:+PrintGCDetails -Xmx512M –Xms512M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseSerialGC
-XX:PermSize=32M
GC回收次数0次 吞吐量6561次
结论:堆的初始值和最大堆内存一致,并且初始堆越大就会高。
JVM调优的原则:
(1)JVM GC的次数尽可能少。
(2)初始堆内存和最大堆内存大小一致。
2. 垃圾回收器并行回收
ParNew收集器
JVM参数:-XX:+HeapDumpOnOutOfMemoryError
表示堆溢出时的异常信息。
-XX:+PrintGCDetails -Xmx512M -Xms512M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseParNewGC
-XX:PermSize=32M
GC回收0次 吞吐量6706
CMS收集器
-XX:+PrintGCDetails -Xmx512M -Xms512M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseConcMarkSweepGC
-XX:PermSize=32M
g1收集器
-XX:+PrintGCDetails -Xmx512M -Xms512M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseG1GC
-XX:PermSize=32M
调优总结
(1)初始堆值和最大堆内存内存越大,吞吐量就越高。
(2)最好使用并行收集器,因为并行收集器速度比串行吞吐量高,速度快。
(3)设置堆内存新生代的比例和老年代的比例最好为1:2或者1:3。
(4)减少GC对老年代的回收。