【实战JVM】-实战篇-06-GC调优


1 GC调优概述

在这里插入图片描述

1.1 调优指标

1.1.1 吞吐量

在这里插入图片描述

在这里插入图片描述

1.1.2 延迟

在这里插入图片描述

使用GCeasy来进行分析

1.1.3 内存使用量

在这里插入图片描述

2 GC调优方法

在这里插入图片描述

2.1 发现问题

2.1.1 jstat工具

在这里插入图片描述

jstat -gc 3785 1000 10

在这里插入图片描述

2.1.2 visualvm插件

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.1.3 Prometheus+Grafana

在这里插入图片描述

2.1.4 GC Viewer

生成GC日志

在这里插入图片描述

-XX:+PrintGCDetails -Xloggc:test1.log

生成

在这里插入图片描述

在这里插入图片描述

java -jar gcviewer-1.36.jar test1.log

在这里插入图片描述

2.1.5 GCeasy

https://gceasy.ycrash.cn/gc-dashboard.jsp

在这里插入图片描述

在这里插入图片描述

给的相当详细

在这里插入图片描述

2.2 常见GC模式

2.2.1 正常情况

在这里插入图片描述

2.2.2 缓存对象过多

在这里插入图片描述

2.2.3 内存泄漏

在这里插入图片描述

2.2.4 持续FullGC

在这里插入图片描述

2.2.5 元空间不足导致FullGC

在这里插入图片描述

2.3 解决GC问题的手段

在这里插入图片描述

2.3.1 优化基础JVM参数

2.3.1.1 -Xmx -Xms 堆参数

在这里插入图片描述

在这里插入图片描述

2.3.1.2 -XX:MaxMetaspaceSize -XX:MetaspaceSize 元空间参数

在这里插入图片描述

所以我们启动程序之后基本都会触发1到2次的由元空间不足引起的FullGC,这是因为-XX:MetaspaceSize触发FullGC最开始的大小可能只有20M,所以会触发1到2次的FullGC,因为是在启动的时候触发的,所以并不会对用户的使用产生影响。

2.3.1.3 -Xss 虚拟机栈参数

在这里插入图片描述

2.3.1.4 不建议设置参数

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.3.1.5 模板

在这里插入图片描述

2.3.2 更换垃圾回收器

第二点减少对象的产生,就涉及内存调优,这个在以前已经讲过了,不再赘述

在这里插入图片描述

private Cache cache = Caffeine.newBuilder().weakKeys().softValues().build();

软引用+弱引用最大程度保证缓存不会溢出

先测试jdk8自带ps+po

-Xms4g -Xmx4g -Xss256k -XX:MaxMetaspaceSize=512m  -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/test.hprof  -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

启动测试脚本

在这里插入图片描述

50并发下最大的响应时间是280ms,最后总结,并发越高,fullgc时间越长,因为创建对象速度快,可能刚刚释放,又要创建又要fullgc

再测试parnew+cms

-Xms4g -Xmx4g -Xss256k -XX:MaxMetaspaceSize=512m  -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/test.hprof  -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseParNewGC -XX:+UseConcMarkSweepGC

在这里插入图片描述

50并发下最大的响应时间是220ms,其实都差不多

最后测试g1,在jdk17上

在这里插入图片描述

在这里插入图片描述

平均不到100ms,差距还是非常明显的。

2.4 实战

在这里插入图片描述

分析出有很多缓存对象

如果想要生成内存快照时不做fullgc,则需要通过jmap来保存,去掉live即可

jmap -dump:format=b,file=/home/jvm/dump/jvm-optimize-jmap.hprof 29317

但是mat分析时还是会自动把能回收的对象排除在外,所以我们需要

在这里插入图片描述

找到了482M的对象,本应该是被回收的,但是这些数组已经不在gcroot的引用链上了,所以用回溯找是没法找到的

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.4.1 总结

在这里插入图片描述

在这里插入图片描述

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-06 12:12:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-06 12:12:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-06 12:12:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-06 12:12:04       20 阅读

热门阅读

  1. C# Math.Round() 四舍六入五取偶

    2024-06-06 12:12:04       9 阅读
  2. C#一些高级语法

    2024-06-06 12:12:04       7 阅读
  3. 物联网的应用——环境监测

    2024-06-06 12:12:04       8 阅读
  4. 使用packstack快速部署OpenStack

    2024-06-06 12:12:04       7 阅读
  5. 动态规划:打家劫舍 II

    2024-06-06 12:12:04       9 阅读
  6. 前端 、Python 扁平化嵌套数组和应用场景

    2024-06-06 12:12:04       9 阅读
  7. 如何搭建开发一款看广告赚钱软件?

    2024-06-06 12:12:04       9 阅读
  8. spring整合kafka

    2024-06-06 12:12:04       6 阅读
  9. go语言接口之接口类型

    2024-06-06 12:12:04       8 阅读