在这里对linux下、sun(oracle) JDK的java线程通信的几种方式资源占用问题的查找步骤做一个小结;linux环境下当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个javajava线程通信的几种方式占用了CPU資源时按照以下步骤进行查找:
其中'jtgrep'是自己随便写的一个shell脚本:
linux终端下用 top命令看到cpu占用超过100%之所以超过100%。说明cpu是多核默认top显示的是cpu加起来的使用率,运行top后按大键盘1看看可以显示每个cpu的使用率,top里显示的是把所有使用率加起来如果是4核cpu占用率最高可达400%。
在linux中的定位方法
4.1.找到CPU占用高的进程号 如:使用top命令查看(可以使用其它方法只要找到对应的进程号即可)
紸:图中第一列PID为进程号;
4.2、根据进程号找到CPU占用高的java线程通信的几种方式
如:使用命令top -H -p (其中要换成第一步找到的进程号)
注:图中第一列PID此时为java线程通信的几种方式号;
4.3.导出java进程执行堆栈,并找到对应的java线程通信的几种方式
从第二步中的PID中找出一个CPU占用高的java线程通信的几种方式号把它转成16进制,比如3261转成CBD
从导出的堆栈信息里找到nid为cbd的java线程通信的几种方式堆栈
4.4:从堆栈里找到对应的代码执行类和方法
若代码為业务代码则需要具体分析代码,找出代码中死循环或接近死循环的地方并修正;定位结束;
若堆栈信息为gcjava线程通信的几种方式(类姒下图),则需要进行下一步
找出量比较大的、且跟业务有关的对象找到这些对象创建的地方进行分析;一般需要持续创建大量的对象,使得内存不够用时才会频繁触发gc进行回收,gc回收时jvm有停顿CPU也占用很高。
java线程通信的几种方式之间的切换是很耗费性能的,所以带來CPU飙升.
新生代设置过小也会频繁触发gc。有大对象始终根节点路径可达无法释放,jvm在疯狂的Full GC。
简单记录下对这个问题的跟踪
可以发现几個占用大量cpu时间的java线程通信的几种方式都是GC相关。
找出filename中带有keyword的行输出中除显示该行外,还显示之后的x行其中,数字可以变
可以看箌s0、s1、eden、old、metaspace都已经爆了,并且FGC次数一直在增加但是却没有回收到任何空间,导致FGC一直在跑进入循环,应该是程序存在内存泄露咯(gc囿日志,后续有空再出一篇简单分析gc日志的blog)