当前位置: 首页 > news >正文

记录一次线上fullgc问题排查过程

某天,接到测试部门反馈说线上项目突然很快,由于当前版本代码和上一版本相比就多了一个刚上线了一个5分钟1次的跑批任务,先关闭次任务后观察是否卡顿,并检查堆内存是否使用完造成频繁gc

1.通过jmap命令查看堆内存中的对象

2.生成当前堆快照文件并用mat工具打开(file->HeapDump)

导出命令如下:

 ./jmap -dump:format=b,file=heap.dump 3920149

发现是有一个任务线程创建了最多的对象,调整对应配置如下核心线程从1个改5个线程

3.查看堆内存设置情况:

 ./jhsdb jmap --heap --pid  7853

返回说明:

  1. MinHeapFreeRatio:最小堆空闲比例,表示堆中空闲空间的最小比例。默认值为40,表示堆中至少有40%的空间是空闲的。

  2. MaxHeapFreeRatio:最大堆空闲比例,表示堆中空闲空间的最大比例。默认值为70,表示堆中最多可以有70%的空间是空闲的。

  3. MaxHeapSize:最大堆大小,表示堆的最大可用空间。

  4. NewSize:新生代大小,表示新生代的初始大小。

  5. MaxNewSize:最大新生代大小,表示新生代的最大可用空间。

  6. OldSize:老年代大小,表示老年代的初始大小。

  7. NewRatio:新生代与老年代的比例,表示新生代与老年代的大小比例默认为2。

  8. SurvivorRatio:幸存者区与Eden区的比例,表示幸存者区与Eden区的大小比例。默认值为8,表示幸存者区的大小是Eden区大小的1/8。

  9. MetaspaceSize:元数据区大小,表示元数据区的初始大小。

  10. CompressedClassSpaceSize:压缩类空间大小,表示压缩类空间的初始大小。

  11. MaxMetaspaceSize:最大元数据区大小,表示元数据区的最大可用空间。

  12. G1HeapRegionSize:G1堆区域大小,表示G1堆区域的大小

堆分为新生代和老年代 默认占比 1:2, 可以看到老年代占用使用过高,调整其大小,调整为3 使用参数为:

-XX:NewRatio=3

新生代分为eden区、From Survivor(S0区)、To Survivor(S1区) 默认占比8:1:1,,可以看的s区100%,调整为6

-XX:SurvivorRatio=6

其他调整为:

 -Xmx8192M 最大堆内存调整为8192M
-XX:MetaspaceSize=256M 设置元数据区初始值256M
-XX:MaxMetaspaceSize=512M 设置元数据区最大值256M
-XX:MaxDirectMemorySize=256M 设置堆外内存256M
-XX:PretenureSizeThreshold=11457280 设置对象超过11457280 字节直接进入老年代
-XX:MaxTenuringThreshold=15 设置垃圾最大年龄15 超过这个就进入老年代
-XX:+HeapDumpOnOutOfMemoryError 打印OOM
-XX:HeapDumpPath=./logs/dump.hprof dump文件

4.调整后重启观察gc情况发现明显好转从600多次fgc到12次fgc,而且12次均为启动时就触发

./jstat -gcutil 7853 5000 5

返回说明:

  • S0:Survivor 0区的使用率,表示Survivor 0区已使用的百分比。
  • S1:Survivor 1区的使用率,表示Survivor 1区已使用的百分比。
  • E:Eden区的使用率,表示Eden区已使用的百分比。
  • O:老年代的使用率,表示老年代已使用的百分比。
  • M:元数据区的使用率,表示元数据区已使用的百分比。
  • CCS:压缩类空间的使用率,表示压缩类空间已使用的百分比。
  • YGC:Young Generation垃圾回收的次数,表示Young Generation垃圾回收的次数。
  • YGCT:Young Generation垃圾回收的总时间,表示Young Generation垃圾回收的总时间。
  • FGC:Full GC的次数,表示Full GC的次数。
  • FGCT:Full GC的总时间,表示Full GC的总时间。
  • CGC:Concurrent Mode Failure的次数,表示Concurrent Mode Failure的次数。
  • CGCT:Concurrent Mode Failure的总时间,表示Concurrent Mode Failure的总时间。
  • GCT:垃圾回收的总时间,表示垃圾回收的总时间。

参数解析

5.打印gc.log定位增加参数

 -XX:+PrintGCDetails  -Xloggc:./logs/gc.log

发现如下日志:

6.定位system.gc的具体位置

下载 https://arthas.aliyun.com/arthas-boot.jar

启动后选择本地项目如下:

访问arthas 的web界面

可以发现是由于项目中引入领英的paldb的问题要如何解决呢?

方法1:

-XX:+DisableExplicitGC

该参数将使JVM完全忽略系统的GC调用(不管使用的收集器是什么类型),国产欧拉系统设置了不生效,cenos机器设置正常

方法2:

-XX:+ExplicitGCInvokesConcurrent

该参数启用后JVM无论什么时候调用系统GC,都执行CMS GC,而不是Full GC。

7.再次观察gc

至此卡顿问题解决!

http://www.lryc.cn/news/189652.html

相关文章:

  • 设计接口应该考虑的因素以及遵循的原则
  • 【产品】智能结构仿真软件AIFEM 2023R2新版本功能介绍
  • displaty:none与visibility:hidden的区别
  • 探索数据库的世界:DB、DBMS、DBA、DBS的全面介绍
  • 【JVM】初步认识Java虚拟机
  • JAVA设计模式-模板模式
  • day007
  • Spring Boot项目在Windows上的自启动策略与Windows自动登录配置
  • mac 版hadoop3.2.4 解决 Unable to load native-hadoop library 缺失文件
  • mysql case when 不命中缓存
  • 2023年金九银十网络安全考试试题
  • JS 图片的左右切换
  • 什么是Python虚拟环境?
  • 知识增强语言模型提示 零样本知识图谱问答10.8+10.11
  • Linux编译FFmpeg
  • Netty深入浅出Java网络编程学习笔记(二) Netty进阶应用篇
  • 机器学习基础之《回归与聚类算法(1)—线性回归》
  • 如何实现制造业信息化转型?
  • stable diffusion艰难炼丹之路
  • 竞赛 深度学习 opencv python 实现中国交通标志识别
  • 用Python实现数据透视表、音频文件格式转换
  • java枚举中写抽象方法
  • 麒麟操作系统提示“默认密钥环已上锁”的解决办法
  • 云原生周刊:Docker 推出 Docker Debug | 2023.10.9
  • 设计模式 - 行为型模式考点篇:迭代器模式(概述 | 案例实现 | 优缺点 | 使用场景)
  • Spark任务优化分析
  • 最新数据库流行度最新排名(每月更新)
  • Python:如何在一个月内学会爬取大规模数据
  • K8S云计算系列-(4)
  • 【Mybatis源码】IDEA中Mybatis源码环境搭建