jvm调优以及常见jvm问题解决等
1、通过top命令查询异常的进程
top
2、通过 使用top -Hp<PID>命令查看该进程内各个线程的CPU占用情况:
top -Hp PID
记录下占用CPU较高的线程ID。
3、转换线程ID为十六进制
使用printf命令将线程ID 19664 转换为十六进制,结果为 0x4cd0:
printf "%x\n" <线程ID>
4、获取线程堆栈
使用jstack命令获取进程的线程堆栈信息:
# 得到线程堆栈信息中 4cd0 这个线程所在行的后面10行,从堆栈中可以发现导致cpu飙高的调用方法
jstack 19663|grep -A 10 4cd0
5、代码分析
根据堆栈信息,查看相关的Java代码。以下是一些可能导致CPU飙高的代码示例:
例如死循环,死锁等
public class BadSynchronization { private static final Object lock1 = new Object(); private static final Object lock2 = new Object(); public static void method1() { synchronized (lock1) { synchronized (lock2) { // 操作 } } } public static void method2() { synchronized (lock2) { synchronized (lock1) { // 操作 } } }
}
6、使用性能分析工具
可以使用诸如Arthas、JProfile等Java性能分析工具进行更深入的分析。
7、查看GC日志
如果怀疑是GC问题,可以查看GC日志:
jstat -gcutil PID 1000