中括号“[]”代表可选 尖括号“<>”代表需要输入的内容 pid的获取可以参考:top命令
查看内存使用情况 jstat -gcutil <毫秒> <次数>
导出堆中的内存文件
添加live后,表示查看存活的文件
jmap -dump:[live,]format=b,file=<导出路径和文件名:/opt/dump.bin>
示例: jmap -dump:live,format=b,file=./123.hprof 123
查看Java线程
jps
查看当前JVM的配置
jps -lvm
查看栈的瞬时信息
jstack
示例:
根据Java进程堆栈信息找到对应线程ID
- 对应线程ID转换成16进制
27460 = 0x6b44 [27460是java进程下的线程id]
jstack 15460 >> 15460.log [15460是java进程id]
在15460.log文件中查找0x6b44对应的线程,如下图:
备注:
1、jstack 输出的堆栈信息,线程id对应的16进制为小写,查找时要统一按照小写方式查找
2、jstack输出为当前瞬间的堆栈信息,如果遇到间断性出现CPU高的问题时,需要多输出几次
从上面方式定位到代码Test.main(Test.java:4)处导致了CPU偏高的问题,那我们查看下代码具体如何实现的?
代码实现:
public class Test {
public static void main(String[] args) {
while(true) {
}
}
}
从代码层面看该处实现了一个死循环,所以导致了线程占用CPU偏高的问题。
查看当前JVM中的代理类
使用Java自带的HSDB工具,通过如下命令:
sudo java -classpath "$JAVA_HOME/lib/sa-jdi.jar" sun.jvm.hotspot.HSDB
然后点击:file-Attach to HostSpot process,输入进程id
最后点击:Tools-Class Browser
强制执行GC
jcmd <pid> GC.run