JVM-GC3--定位线上OOM问题的方法

2022-05-09 16:28:47 浏览数 (1)

第二节jvm公开课课, 主要介绍了一个知识点. 那就是线上发生OOM, 如何定位

  1. top命令, 线上查看cpu和内存的使用情况
  2. jstack 进程号

  查看当前进程有哪些线程

  初步定为排查线程的健康状况, 如果有很多线程处于等待状态,那么可能就有问题了

  1. jstat -gc 线程号: GC回收的情况
  2. jinfo 3271 

  显示进程中的常用信息

  1. jmap

  jmap -dump:format=b, file=20200208.dump 3806

  这个命令可以吧内存拷贝到文件, 然后分析文件. 

  注意: jmap不能用于生产环境, 会让生产环境卡死的.

  问题: 拷贝到文件内容怎么看呢? 使用java自带的jvisualvm.java . 这个文件在jdk1.8/bin/目录下.

  1). 在windows下双击打开jvisualvm. 然后点击文件/装入, 设置文件类型为 堆 Dump(*.hprof, *....)

  2). 选择文件后打开, 显示堆文件的概要信息

  3). 查看类模块

   可以看到哪些类创建的实例数特别大. 占用了多少内存/cpu

  4). OQL控制台: 可以输入类似于sql一样的语句: 例如输入select * from java.lang.String s, 就会执行语句,显示出所有的创建java.lang.String对象的类.

内存小的话, 可以使用jmap, 但是大的话坚决不能使用.

  jmap 可不可以把一部分日志打印到堆文件呢?  

  jmap -histr 3806 | head 10000 > 1.txt    把10000行数据打印到文件进行分析.

  1. arthas 在线排查工具

  这是今天讲的重点. 通过这个工具可以做什么

  • dashboard: 仪表盘, 显示观察堆的使用
  • jvm
  • thread / thread 进程号
  • sc(search class的简称)
  • watch
  • heapdump: 产生一个对存储文件
  • jad: java反编译工具
  • redefine 路径 在线修改代码
    • 修改源文件
    • javac编译
    • 执行defeine在线修改代码
  1. 很重要的一个方面, 加日志.

常见的GC问题

 1. java启动时如何设置jvm的日志

  java -Xloggc:/root/1.txt 

  这个命令是把jvm日志打印到/root/1.txt文件下.

  但切记生成环境不可使用,原因是, 内容特别多, 有吧硬盘打满的危险

  使用滚动生成日志的方式:

代码语言:javascript复制
java -Xloggc:/root/logs/gc.log -XX: PrintGCDetails -XX: UseGCLogFileRotation -XX:NumberOfGCLogFiles=100 -XX:GCLogFileSize=100k

  参数含义:

  • -Xloggc: 输入jvm日志的文件路径
  • -XX: PrintGCDetails 打印gc的详细日志信息
  • -XX:UseGCLogFileRatation 滚动打印日志
  • -XX:NumberOfGCLogFiles gc日志文件个数
  • -XX:GCLogFileSize gc日志每个文件的大小    

问题 : 滚动生成日志也存在一定的问题, 有可能你要查看的日志已经被删除了. 所以设置好文件大小和文件个数关键

参考文章: https://blog.csdn.net/qq_35440040/article/details/101026766

  1. 内存不超过10%, 但是频繁发生FGC是什么原因?如何排查?

第一步: 查看启动参数. -Xmx 128M -Xms 128M  

  使用命令查看启动参数:jps -m -l -v

第二步: 问题还是没有解决, 使用执行命令:jamp -histro 进程, 查看堆信息

第三步: 使用 jstat -gccause 26003 1000查看gc的情况

第四步: dump堆内存分析。看看哪些类实例最多, 这样内存和cpu居高不下.


扩展阅读

整理这个文件的时候, 想起之前同事整理的一篇在spring cloud环境下,如何通过spring boot actuator来定位线上问题.

1. 监控和管理生产环境spring boot actuator: https://www.cnblogs.com/ITPower/articles/12286106.html

2. 通过spring boot actuator导出dump分析: https://cloud.tencent.com/developer/article/1997412

0 人点赞