【调优】使用jstack来找出查找哪个线程消耗cpu最高(死循环)的java代码
1、top查找出哪个进程消耗的cpu高
top
2. 查找哪个线程消耗cpu最高
top -H -p 5918
3. 执行jstack
jstack 5918 | grep -A 100 171f
-A 100表示查找到所在行的后100行。5919用计算器转换为16进制171f,注意字母是小写。
4. 执行jmap
注意:jmap会将jvm卡死,并将堆内存中各对象已经实例化了多少个信息查询出来,所以生产环境肯定不能直接使用!!!!!
1)对象已经实例化了多少个
jps // 查询进程号 jmap -histo 11988 | head -20 //查询堆内存中各对象已经实例化了多少个,而且大量无法回收
2)堆转储
注意:往外导入依然会卡死JVM,所以生产环境肯定不能直接使用!!!!!
可以设置 -XX:+HeepDumpOnOutofMemoryError,当发生OOM时(JVM已经死了),才会转储文件。
jmap -dump:format=b,file=20200912.hprof 11988 //对jvm整个堆进行转储产生一个dump二进制文件
然后再使用网上的工具进行分析,JVisualVM(JVM自带)、Jhat、MAT导入即可分析哪些对象占用内存比较多。
JVM自带工具生产环境不能远程观察,会有开启多个端口产生安全隐患及性能下降。