jstack输出中线程id是16进制的,对应的仓库就是负载最高线程的仓库

永恒性能问题,尤其是cpu使用率过高时,日常需要寻找cpu消耗较高的线程,然后查看其堆栈,从而进入代码定位问题。
   

属性监控

  1. linux命令监控
    uptime 展现系统运行时刻、连接数、负载状况
    top 系统运作时刻、平均负载情况、cpu使用率(us用户空间占比
    sy内核空间占比 ni用户进程空间改变过优先级的占比 id空闲占比
    wa等待输入输出占比)、内存使用处境、任务运行总结情形、空间更换情形
    vmstat 总结系统cpu、io、内存、线程上下文切换目标
    pidstat 查看过程详细音讯,比如说cpu、io、内存等。

找出负载最高的线程以及它的线程堆栈?
先经过top命令查找当前负荷最高的历程
接下来通过 top -H -p pid 或 ps -p pid -L -o pcpu,tid,tname,cmd 或 pidstat
-p pid -u(监控cpu) -t(监控线程) -d(监控io) -r(监控内存) 1(采集频率)
3(采集次数)
然后经过 jstack -l pid >jstack.txt
打出线程堆栈,依据第二个步骤找出的线程id转化为16进制,在文件中找到呼应的nid与之对象,对应的仓库就是负载最高线程的仓库。

  1. jdk自带的工具
    jps 显示java进程号
    jinfo 彰显jvm配置参数音讯
    jmap 堆信息
    jmap -histo pid >1.txt 生成堆快照和目的总计消息
    jmap -dump:format=b,file=heap.hprof pid 生成堆dump文件
    jstack -l pid >stack.txt 生成线程堆栈音讯

 

属性调优

打印gc音讯有关参数
-verbose:gc
-XX:+printGC
-XX:+printGCDetails
-XX:+printGCTimeStamps
-Xloggc:log/gc.log
-XX:+printHeapAtGC
-XX:+HeapDumpOnOutOfMemoryError -XX:+HeapDumpPath
在OOM自动dump堆栈使用情形,保留现场

堆大小分配
-Xms -Xmx 最大堆和微小堆分配
-Xmn 新生代堆大小
-XX:NewRadio 新生代占比 官方推荐新生代占比3/8
-XX:Sur红米rRadio 幸存区占比 官方推荐8,幸存区占比1/10

库房、线程堆栈分析
jmap -F dump:format=b,file=(pid)heap.log (pid)
jstack -l (pid) ~/(pid)jstack.txt
留意:jmap可能会促成jvm
stw,暂时中止,谨慎运用,优先选项命令配置,触发oom时自动dump
线程dump重点关注如下:
死锁,deadlock(重点关注)
进行中,Runnable(一般景观下不爱护,假设长日子有可能是死循环)
等待资源,waiting on conditon(重点关注)
闭塞,blocked(重点关注)

这一场景下, jstack+top是一种相当经典的法门。

 

jstack+top

 

1、top -H 查看cpu占用较高的线程,记录十进制的线程id

2、jstack  将线程信息dump到文件中,在文件中依照线程id查找该线程的库房。
注意,jstack输出中线程id是16进制的,这里要做两遍进制转换。 

3、探讨这些线程的库房

相关文章