一、linux下查找java进程占用cpu过高原因
1.查看进程
top命令查看进程占用资源情况
2.查找线程
top -H -p <pid>查看线程占用情况
ps -mp pid(进程id) -o THREAD,tid,time 查看线程列表
3.查找java的堆栈信息
将线程id转换成十六进制
printf "%x\n" 15664
4.使用jstack查询线程堆栈信息
jstack <pid> | grep -A 20 线程id(十六进制) 定位到线程ID的后20行
5.分析原因和修改代码
二、线上服务内存OOM问题定位
jmap -heap 10765
#查看进程新生代、老年代堆内存的分配大小以及使用情况,看是否本身分配过小。
jmap -histo:live 10765 | more
#找到最消耗内存的对象。
jmap -dump:live,format=b,file=dump.hprof 进程id
#jmap命令dump出堆里的对象文件,使用jprofiler、visalVM、eclipse mat分析内存对象情况。
三、full gc问题排查
老年代空间不足
永生代或者元数据空间不足
System.gc()方法调用
CMS GC时出现promotion failed和concurrent mode failure
YoungGC时晋升老年代的内存平均值大于老年代剩余空间
有连续的大对象需要分配
jstat -gcutil 9596 250 12
#进程9596每隔250ms打印一次,打印12次。
jstat -gccause pid
#查看gc详细原因
jmap -histo 进程id > jmap.txt
#dump文件分析,找到占用内存的对象,定位到具体code。