在生产环境,可能会出现CPU飙高,或者内存溢出的情况,造成系统卡顿甚至崩溃,怎样快速定位到问题代码,下面介绍几种方法。
查看CPU飙高有使用jstack命令及Arthas工具,怎么使用,模拟CPU飙高案例。
public class CPUHighTest {
public static void main(String[] args){
new Thread(() -> {
while (true) {
}
}).start();
}
}
编译:javac CPUHighTest.java,生成class文件
运行:java CPUHighTest
如果运行报错:Error:Could not find or load main class Arthas
需要更改profile文件,在$JAVA_HOME前加.:
CLASSPATH=.:$JAVA_HOME/lib/
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
https://github.com/alibaba/arthas/releases
下载成功后,解压,启动Arthas
java -jar arthas-boot.jar
选择相应的进程,进入arthas
输入dashboard查看概况,发现有CPU占用高的进程
输入thread <进程id>,本例中为9,迅速定位到问题代码
模拟内存溢出
public class OOMTest{
public static void main(String[] args) {
List
编译:javac OOMTest.java,生成class文件
运行:设置jvm参数,将堆内存设小一点,方便模拟内存溢出,java -Xms10M -Xmx10M OOMTest
jmap -dump:format=b,file=jvm.hprof 1777262
java -Xms10M -Xmx10M -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/jvm.hprof OOMTest
使用工具分析dump日志
java自带的分析工具,在java的bin目录下
启动成功导入jvm.hprof文件
一般dump文件会比较大,导入jvisualvm时会比较慢,有时会提示内存不足,需要设置jvisualvm启动参数:visualvm_default_options
配置文件位置:JDK路径/lib/visualvm/etc/visualvm.conf
如果电脑内存允许的话,尽可能设置大点
迅速定位到问题代码
下载安装
下载地址:https://www.eclipse.org/mat/downloads.php
下载成功后解压,双击MemoryAnalyzer.exe启动
如果本地jdk版本不是11以上,启动过程中可能会报JDK版本问题
这时需要在MemoryAnalyzer.ini中添加参数,设置本地JDK
-vm
C:Program FilesJavajdk-11.0.16binjavaw.exe
启动成功后导入dump文件
file->open heap dump
通过Histogram查看实例占用情况
查看thread_overview
选择占用最高的thread->右键->Thread Details
可迅速找出问题代码。
页面更新:2024-02-18
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号