[JVM]调优实例分析

升级JDK版本

升级版本后存在内存溢出,检查原因后发现Java堆根据情况伸缩扩展并无异常,而永久代几乎每次扩展后都被填满,在达到扩展极限后产生内存溢出。
导致原因:默认永久代最大值过小(64M),导致永久代溢出
解决方案:设置永久代默认最大值为256M

编译时间和类加载时间优化

升级后查看到类加载时间反而增加了一倍(只在部分机器上出现)
导致原因:编译时在字节码验证的部分时间差距很大
解决方案:考虑到Eclipse的安全性,可以把它的编译代码认为是可靠的,取消字节码验证。虚拟机在client模式时使用名为C1的轻量级编译器,若长时间使用Eclipse则可以考虑使用server模式下C2相对重量级的编译器。

控制垃圾收集频率

查看原始数据样本,共发生了19次Full GC 和378次Minor GC,超过1/4的时间用来做垃圾收集。
导致原因:查看新生代分配的空间过小,导致Minor GC频繁发生,老年代初始大小过小导致频繁扩容进行Full GC。
解决方案:强制虚拟机启动时分配新生代容量提升为128M,避免频繁GC,Java堆和永久代容量分别固定为512M和96M,避免内存扩展(数值由实际需求设置)。
(调优后仍存在4次Full GC,经查看是由于显示调用System.gc()触发的,由于设置后已不需要,因此加入参数屏蔽掉。)

选择收集器降低延迟

查看编译期间的运行数据,发现cpu利用率较低,并且GC的停顿时间较长。
解决方案:采用效率更高的CMS收集器进行老年代GC和ParNew收集器进行新生代GC,通过并行和并发提高cpu利用率,降低停顿时间。

猜你喜欢

转载自blog.csdn.net/qq_37251123/article/details/87891465