预备知识
top命令
top
命令使我们最常用的Linux命令之一,它可以实时的显示当前正在执行的进程的CPU使用率,内存使用率等系统信息。top -Hp pid
可以查看线程的系统资源使用情况。
jstack命令
jstack是JDK工具命令,它是一种线程堆栈分析工具,最常用的功能就是使用 jstack pid
命令查看线程的堆栈信息,也经常用来排除死锁情况。
mat内存工具
MAT(Memory Analyzer Tool)工具是eclipse的一个插件(MAT也可以单独使用),它分析大内存的dump文件时,可以非常直观的看到各个对象在堆空间中所占用的内存大小、类实例数量、对象引用关系、利用OQL对象查询,以及可以很方便的找出对象GC Roots的相关信息。
常见问题
CPU占满
- top命令查看CPU占用情况,找出线程号
- 通过执行
top -Hp 32805
查看Java线程情况 - 执行
printf '%x' 32826
获取16进制的线程id,用于dump
信息查询,结果为803a
。最后我们执行jstack 32805 |grep -A 20 803a
来查看下详细的dump
信息。 - 这里
dump
信息直接定位出了问题方法以及代码行,这就定位出了CPU占满的问题。
内存泄露
jstat -gc pid
命令来看看程序的GC情况- 借助我们的MAT工具来分析
死锁
死锁会导致耗尽线程资源,占用内存,表现就是内存占用升高,CPU不一定会飙升(看场景决定),如果是直接new线程,会导致JVM内存被耗尽,报无法创建线程的错误,这也是体现了使用线程池的好处。
- 通过
ps -ef|grep java
命令找出 Java 进程 pid - 执行
jstack pid
即可出现java线程堆栈信息,找到死锁信息