文章目录
- GC调优
- 发现问题
- jstat
- visualvm插件
- GC日志
- GCeasy
- 常见的GC模式
- 解决GC问题
- 优化基础JVM参数
GC调优
GC调优指的是对垃圾回收(Garbage Collection)进行调优。GC调优的主要目标是避免由垃圾回收引起程序性能下降。
GC调优的核心分成三部分:
- 通用Jvm参数的设置。
- 特定垃圾回收器的Jvm参数的设置。
- 解决由频繁的FULLGC引起的程序性能问题。
GC调优的核心指标:
- 垃圾回收吞吐量:垃圾回收吞吐量指的是 CPU 用于执行用户代码的时间与 CPU 总执行时间的比值,即吞吐量 = 执行用户代 码时间 /(执行用户代码时间 + GC时间)。吞吐量数值越高,垃圾回收的效率就越高,允许更多的CPU时 间去处理用户的业务,相应的业务吞吐量也就越高。
- 延迟(Latency): 延迟指的是从用户发起一个请求到收到响应这其中经历的时间。延迟 = GC延迟+ 业务执行时间,所以如果GC时间过长,会影响到用户的使用。
- 内存使用量:内存使用量指的是Java应用占用系统内存的最大值,一般通过Jvm参数调整,在满足上述两个指标的前提下, 这个值越小越好。
发现问题
jstat
Jstat工具是JDK自带的一款监控工具,可以提供各种垃圾回收、类加载、编译信息 等不同的数据。
使用方法为:
jstat -gc 进程ID 每次统计的间隔(毫秒) 统计次数
visualvm插件
VisualVm中提供了一款Visual Tool插件,实时监控Java进程的堆内存结构、 堆内存变化趋势以及垃圾回收时间的变化趋势。同时还可以监控对象晋升的直方图。
GC日志
通过GC日志,可以更好的看到垃圾回收细节上的数据,同时也可以根据每款垃圾回收器的不同特点更好地发 现存在的问题。
使用方法:
-XX:+PrintGCDetails -Xloggc:文件名
GCeasy
GCeasy是业界首款使用AI机器学习技术在线进行GC分析和诊断的工具。定位内存泄漏、GC延迟高的问题,提供JVM 参数优化建议,支持在线的可视化工具图表展示。
官方网站:https://gceasy.io/ (需要科学上网)
常见的GC模式
1)正常情况:呈现锯齿状,对象创建之后内存上升,一旦发生垃圾回收之后下降到底部,并且每次下降之后的内存大小 接近,存留的对象较少。
2)缓存对象过多:呈现锯齿状,对象创建之后内存上升,一旦发生垃圾回收之后下降到底部,并且每次下降之后的内存大小接近,处于比较高的位置。
3)内存泄漏:呈现锯齿状,每次垃圾回收之后下降到的内存位置越来越高,最后由于垃圾回收无法释放空间导致对象无 法分配产生OutOfMemory的错误。
4)持续的FullGC:在某个时间点产生多次Full GC,CPU使用率同时飙高,用户请求基本无法处理。一段时间之后恢复正常。
问题产生原因: 在该时间范围请求量激增,程序开始生成更多对象,同时垃圾收集无法跟上对象创建速率,导致 持续地在进行FULL GC。
5)元空间不足导致的FULLGC:堆内存的大小并不是特别大,但是持续发生FULLGC。
解决GC问题
优化基础JVM参数
1)参数1 : -Xmx
和 –Xms
-Xmx参数设置的是最大堆内存,但是由于程序是运行在服务器或者容器上,计算可用内存时,要将元空间、操作系统、 其它软件占用的内存排除掉。
-Xms用来设置初始堆大小,建议将-Xms设置的和-Xmx一样大
最合理的设置方式应该是根据最大并发量估算服务器的配置,然后再根据服务器配置计算最大堆内存的值。
2)参数2 : -XX:MaxMetaspaceSize
和 –XX:MetaspaceSize
-XX:MaxMetaspaceSize=值:参数指的是最大元空间大小,默认值比较大,如果出现元空间内存泄漏会让操作系 统可用内存不可控,建议根据测试情况设置最大值,一般设置为256m。
-XX:MetaspaceSize=值:参数指的是到达这个值之后会触发FULLGC, 后续什么时候再触发JVM会自行计算。如果设置为和MaxMetaspaceSize一样大,就不会FULLGC,但是对象也无法回收。
3)参数3 : -Xss
虚拟机栈大小
如果我们不指定栈的大小,JVM 将创建一个具有默认大小的栈。大小取决于操作系统和计算机的体系结构。 比如Linux x86 64位 : 1MB,如果不需要用到这么大的栈内存,完全可以将此值调小节省内存空间,合理值为 256k – 1m之间。
JVM参数模板:
-Xms1g
-Xmx1g
-Xss256k
-XX:MaxMetaspaceSize=512m
-XX:+DisableExplicitGC
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/opt/logs/my-service.hprof
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:文件路径