对JVM内存的系统级的调优主要的目的是减少gc的频率和Full gc的次数。
1.Full gc
会对整个堆进行整理,包括Young、Tenured和Perm。Full gc因为需要对整个堆进行回收,所以比较慢,因此应该尽可能减少Full gc的次数。
2.导致Full gc的原因
1)年老代(Tenured)被写满
调优时尽量让对象在新生代gc时被回收、让对象在新生代多存活一段时间和不要创建过大的对象及数组避免直接在旧生代创建对象 。
2)持久代Pemanet Generation空间不足
增大Perm Gen空间,避免太多静态对象 , 控制好新生代和旧生代的比例
3)System.gc被显示调用
垃圾回收不要手动触发,尽量依靠JVM自身的机制
在对JVM调优的过程中,很大一部分工作就是对于Fullgc的调节,下面详细介绍对应JVM调优的方法和步骤。
1.监控gc的状态
使用各种JVM工具,查看当前日志,分析当前JVM参数设置,并且分析当前堆内存快照和gc日志,根据实际的各区域内存划分和gc执行时间,觉得是否进行优化。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
举一个例子: 系统崩溃前的一些现象:
-
每次垃圾回收的时间越来越长,由之前的10ms延长到50ms左右