第二节jvm公开课课, 主要介绍了一个知识点. 那就是线上发生OOM, 如何定位
- top命令, 线上查看cpu和内存的使用情况
- jstack 进程号
查看当前进程有哪些线程
初步定为排查线程的健康状况, 如果有很多线程处于等待状态,那么可能就有问题了
- jstat -gc 线程号: GC回收的情况
- jinfo 3271
显示进程中的常用信息
- 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行数据打印到文件进行分析.
- arthas 在线排查工具
这是今天讲的重点. 通过这个工具可以做什么
- dashboard: 仪表盘, 显示观察堆的使用
- jvm
- thread / thread 进程号
- sc(search class的简称)
- watch
- heapdump: 产生一个对存储文件
- jad: java反编译工具
- redefine 路径 在线修改代码
- 修改源文件
- javac编译
- 执行defeine在线修改代码
- 很重要的一个方面, 加日志.
常见的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
- 内存不超过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