线上问题定位

线上问题定位

1、CPU飙升问题排查

1、找到对应java进程的id

jps -l 查询当前服务器上所有的java进程id,然后通过:top命令查看当前服务器上的各个进程资源占用情况。cpu占用情况。

image-20241015104616780

2、使用jdk提供的工具 jstack,将指定的进程内的各个线程的堆栈日志输出到一个指定文件中。 jstack 进程id > xx.txt

3、top-Hp 进程id, 查看当前进程内的各个线程的资源占用情况

image-20241015104904554

4、由于进程的堆栈日志中记录的各个线程的id是16进制的,所以需要将十进制的线程id转换称16进制的。printf "%x" 十进制的线程id

5、根据十六进制的线程id,去当前进程的堆栈日志(xx.txt)中查找

image-20241015105243230

2、死锁问题排查

死锁数如何产生的==》两个线程,两把锁,每个线程各自持有一把锁,然后去等待对方的锁。

1、先查看java进程的id , jps -l

2、使用jdk提供的工具 jstack,将指定的进程内的各个线程的堆栈日志输出到一个指定文件中。 jstack 进程id > xx.txt

3、在堆栈日志的末尾,如果出现了Found1 deadlock. 说明该进程内有死锁的情况。

4、找到发生死锁代码的具体位置

image-20241015105627399

3、OOM异常

导致OOM的情况:当需要在堆内存中为一个新对象开辟空间时,如果堆内存空间不足,此时先发的垃圾回收,回收后,如果剩余堆内存空间依然不足以为新对象去分配,此时就会出现OOM。

可能是因为堆内存设置的过小,也可能是因为程序中创建了大量的对象,并且这些对象存在强引用,导致最终没有被释放。

在启动项目时,通过指定参数,当项目出现OOM时,自动的让其导出堆内存的映像文件,之后使用jdk的工具分析这个映像文件,检查哪些对象的数星偏高,并且还要找到这些对象是在哪个类中去创建的。

1、启动项目前,添加jvm的参数

java  -jar  -Xmx10m -Xms10m  -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./jvm_logs/  xx.jar

2、 检查内存影像文件是否生成 /jvm_logs/java_pid114493.hprof

3、将hprof文件下载到win本地,使用jdk8中的jvisualvm.exe工具载入这个影像文件。

VisualVM工具(jdk8自带的工具):打开jvisualvm工具 ----> 载入文件 ----> 查看类实例数最多的并且和业务相关的对象 ----> 查看线程的报错信息

oom

posted @ 2024-11-05 21:10  CH_song  阅读(19)  评论(0)    收藏  举报