文章目录
- 版权声明
- GC调优概念
- GC调优核心指标(KPI)
- 吞吐量
- 延迟(Latency)
- 内存使用量
- GC调优方法
- GC调优步骤
- GC调优工具
- jstat工具
- visualvm插件
- Prometheus + Grafana
- GC日志分析
- GC日志保存
- GC日志分析工具
- GC Viewer
- GCeasy
- 常见的GC模式
- 正常情况
- 缓存对象过多情况
- 内存泄漏情况
- 持续FullGC情况
- 元空间不足导致FULLGC情况
版权声明
- 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用,并非商业用途。
- 我在整理学习笔记的过程中尽力确保准确性,但无法保证内容的完整性和时效性。本博客的内容可能会随着时间的推移而过时或需要更新。
- 若您是黑马程序员或相关权利人,如有任何侵犯版权的地方,请您及时联系我,我将立即予以删除或进行必要的修改。
- 对于其他读者,请在阅读本博客内容时保持遵守相关法律法规和道德准则,谨慎参考,并自行承担因此产生的风险和责任。
- 本博客中的部分观点和意见仅代表我个人,不代表黑马程序员的立场。
GC调优概念
- GC调优指的是对垃圾回收(Garbage Collection)进行调优。GC调优的主要目标是避免由垃圾回收引起程序性能下降。
GC调优的核心分成三部分:
- 通用Jvm参数的设置
- 特定垃圾回收器的Jvm参数的设置。
- 解决由频繁的FULLGC引起的程序性能问题
- GC调优没有没有唯一的标准答案,如何调优与硬件、程序本身、使用情况均有关系,重点调优的工具和方法
GC调优核心指标(KPI)
- 判断GC是否需要调优,需要从吞吐量、延迟和内存使用量来考虑
吞吐量
- 吞吐量(Throughput) :业务吞吐量和垃圾回收吞吐量。
- 业务吞吐量指的在一段时间内,程序需要完成的业务数量。比如企业中对于吞吐量的要求可能会是这样的:支持用户每天生成10000笔订单;在晚上8点到10点,支持用户查询50000条商品信息。
- 保证高吞吐量的常规手段: 一 优化业务执行性能,减少单次业务的执行时间;二 优化垃圾回收吞吐量
- 垃圾回收吞吐量指的是 CPU 用于执行用户代码的时间与 CPU 总执行时间的比值,即 吞吐量 = 执行用户代码时间 / (执行用户代码时间 + G C 时间) 吞吐量 = 执行用户代码时间 /(执行用户代码时间 + GC时间) 吞吐量=执行用户代码时间/(执行用户代码时间+GC时间)。
- 吞吐量数值越高,垃圾回收的效率就越高,允许更多的CPU时间去处理用户的业务,相应的业务吞吐量也就越高。
- 吞吐量数值越高,垃圾回收的效率就越高,允许更多的CPU时间去处理用户的业务,相应的业务吞吐量也就越高。
- 如下图,gceasy分析工具给出的吞吐量(较差)
延迟(Latency)
- 延迟指的是从用户发起一个请求到收到响应这其中经历的时间。 延迟 = G C 延迟 + 业务执行时间 延迟 = GC延迟 + 业务执行时间 延迟=GC延迟+业务执行时间,如果GC时间过长,会影响到用户的使用
- 如下图,gceasy分析工具给出的延迟(较差)
内存使用量
- 内存使用量指Java应用占用系统内存的最大值,一般通过Jvm参数调整,在满足上述两个指标的前提下,值越小越好
GC调优方法
GC调优步骤
GC调优工具
jstat工具
- Jstat工具是JDK自带的一款监控工具,可以提供各种垃圾回收、类加载、编译信息等不同的数据。
- 优点:操作简单、无需额外的软件
- 缺点:无法准确到GC产生的时间、只能用于判断GC是否存在问题
参数 | 含义 |
---|---|
S0C | 年轻代中第一个幸存区的容量(KB) (Survivor 0 Capacity) |
S1C | 年轻代中第二个幸存区的容量(KB) (Survivor 1 Capacity) |
S0U | 年轻代中第一个幸存区已使用的空间(KB) (Survivor 0 Used) |
S1U | 年轻代中第二个幸存区已使用的空间(KB) (Survivor 1 Used) |
EC | 年轻代中Eden区的容量(KB) (Eden Capacity) |
EU | 年轻代中Eden区已使用的空间(KB) (Eden Used) |
OC | 老年代的容量(KB) (Old Capacity) |
OU | 老年代已使用的空间(KB) (Old Used) |
MC | 方法区(Metaspace)的容量(KB) (Metaspace Capacity) |
MU | 方法区已使用的空间(KB) (Metaspace Used) |
CCSC | 压缩类空间的容量(KB) (Compressed Class Space Capacity) |
CCSU | 压缩类空间已使用的空间(KB) (Compressed Class Space Used) |
YGC | 年轻代垃圾回收的次数 (Young Generation Garbage Collection Count) |
YGCT | 年轻代垃圾回收所花费的时间(秒) (Young Generation GC Time) |
FGC | 老年代垃圾回收的次数 (Full GC Count) |
FGCT | 老年代垃圾回收所花费的时间(秒) (Full GC Time) |
CGC | 压缩类空间垃圾回收的次数 (Compressed Class Space GC Count) |
CGCT | 压缩类空间垃圾回收所花费的时间(秒) (Compressed Class Space GC Time) |
GCT | 总的垃圾回收时间(秒) (Total GC Time) |
- 使用方法为:
jstat -gc 进程ID 每次统计的间隔(毫秒) 统计次数
C:\Users\HP>jps
20224
724 JpsC:\Users\HP>jstat -gc 20224 1000 5
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT CGC CGCT GCT
0.0 2048.0 0.0 1589.7 378880.0 208896.0 653312.0 456939.0 375360.0 371249.6 50944.0 49257.5 41 0.321 0 0.000 26 0.122 0.443
0.0 2048.0 0.0 1589.7 378880.0 217088.0 653312.0 456939.0 375360.0 371249.6 50944.0 49257.5 41 0.321 0 0.000 26 0.122 0.443
0.0 2048.0 0.0 1589.7 378880.0 227328.0 653312.0 456939.0 375360.0 371249.6 50944.0 49257.5 41 0.321 0 0.000 26 0.122 0.443
0.0 2048.0 0.0 1589.7 378880.0 235520.0 653312.0 456939.0 375360.0 371249.6 50944.0 49257.5 41 0.321 0 0.000 26 0.122 0.443
0.0 2048.0 0.0 1589.7 378880.0 243712.0 653312.0 456939.0 375360.0 371249.6 50944.0 49257.5 41 0.321 0 0.000 26 0.122 0.443
visualvm插件
- VisualVm中提供了一款Visual Tool插件,实时监控Java进程的堆内存结构、堆内存变化趋势以及垃圾回收时间的变化趋势
- 优点:适合开发使用,能直观观察堆内存和GC的变化趋势
- 缺点:对程序运行性能具有一定影响,生产环境程序员没有权限进行操作
- visual安装visual GC插件步骤如图
Prometheus + Grafana
- Prometheus+Grafana是企业中运维常用的监控方案,其中Prometheus用来采集系统或者应用的相关数据,同时具备告警功能。Grafana可以将Prometheus采集到的数据以可视化的方式进行展示。
- 优点:支持系统级别和应用级别的监控,比如linux操作系统、Redis、MySQL、Java进程;支持告警并允许自定义告警指标,通过邮件、短信等方式尽早通知相关人员进行处理
- 缺点:环境搭建较为复杂,一般由运维人员完成
GC日志分析
- 通过GC日志,可以更好的看到垃圾回收细节上的数据,同时也可以根据每款垃圾回收器的不同特点更好地发现存在的问题。
GC日志保存
- JDK 8及以下:-XX:
+PrintGCDetails -Xloggc:文件名
- JDK 9+:
-Xlog:gc*:file=文件名
GC日志分析工具
GC Viewer
- GCViewer是一个将GC日志转换成可视化图表的小工具,github地址
- 使用方法:
java -jar gcviewer.jar 日志文件.log
GCeasy
- GCeasy是一款用于分析Java应用程序的垃圾回收日志的工具。通过分析GC日志,GCeasy可以展示垃圾回收的统计信息、内存使用情况、GC停顿时间等关键指标,帮助开发人员更好地优化其应用程序的性能。
- GCeasy的官方网站https://gceasy.io/
常见的GC模式
正常情况
- 特点:呈现锯齿状,对象创建之后内存上升,一旦发生垃圾回收之后下降到底部,并且每次下降之后的内存大小接近,存留的对象较少
缓存对象过多情况
- 特点:呈现锯齿状,对象创建之后内存上升,一旦发生垃圾回收之后下降到底部,并且每次下降之后的内存大小接近,处于比较高的位置。
- 问题产生原因: 程序中保存大量的缓存对象,导致GC之后无法释放,可以使用MAT或者HeapHero等工具进行分析内存占用的原因。
内存泄漏情况
- 特点:呈现锯齿状,每次垃圾回收之后下降到的内存位置越来越高,最后由于垃圾回收无法释放空间导致对象无法分配产生OutOfMemory的错误。
- 问题产生原因: 程序中保存大量的内存泄漏对象,导致GC之后无法释放,可以使用MAT或者HeapHero等工具进行分析是哪些对象产生了内存泄漏。
持续FullGC情况
- 特点:在某个时间点产生多次Full GC,CPU使用率同时飙高,用户请求基本无法处理。一段时间之后恢复正常。
- 问题产生原因: 在该时间范围请求量激增,程序开始生成更多对象,同时垃圾收集无法跟上对象创建速率,导致持续地在进行FULL GC
- GCeasy文档报告地址
元空间不足导致FULLGC情况
- 特点:堆内存的大小并不是特别大,但是持续发生FULLGC。
- 问题产生原因: 元空间大小不足,导致持续FULLGC回收元空间的数据
- GCeasy文档报告地址