问题:
在公司参与硬件过程中,该项目的两台主动-主动jboss服务器频繁触发高CPU使用率警报,并且长时间以来CPU使用率超过90%。
疑难解答:
第一步:在两台Linux服务器上,执行top命令并按cpu利用率按大写P排序,并将cpu占用率最高的进程确定为java进程
那么,如何解决java进程的CPU使用率过高的问题?我们从两个角度开始:
(1)执行任务本身的java线程本身有错误,无限循环或操作本身消耗了cpu,导致cpu的使用率很高
([2) jvm出现频繁的gc,导致cpu很高
第二步:首先检查Java任务线程本身,以确定哪个线程占用了CPU太多
(1)方法1:ps -mp [java进程ID] -o THREAD,tid,time | sort -n查找具有最大CPU使用率的线程ID

请注意,此方法已在生产环境中进行了测试,结果发现找不到cpu占用率高的线程。所有线程均显示cpu占用率为0。因此,实际调查采用方法二
(2)使用top -H -p [java进程ID]查找具有较高CPU使用率的线程ID,如下图所示,左侧红色框中标记的PID被列为该线程ID

第3步:计算Java线程ID的十六进制值,因为在用jstack查看的后续线程快照中,线程ID是小写的十六进制值
([1)可以转换为百度基础
([2)可以使用Windows附带的计算器,程序员模式,可以转换十六进制
([3) Linux可用命令:printf“%x \ n” [thread_id]
第4步:使用命令jstack [java process pid] | grep [线程ID十六进制值] -A 30(-A 30表示向下打印30行)

分析上图,我们可以看到该线程正在进行常规匹配。检查完整的堆栈以找到特定的代码位置。经过分析,确定该URL正在进行常规匹配。继续分析其他线程,发现它们基本上在进行URL常规匹配。
跟进分析需要与业务代码分析相结合,以确定常规匹配是否耗时。
常规分析参考博客:
步骤5:从GC的角度来看,是否有大量的GC,首先确定当前的内存消耗,使用top命令或检查设备监控管理系统,确认内存利用率达到97。 %:

第6步:确认gc的数量,使用命令jstat -gc [java进程ID]:
YGC表示YoungGC,也称为次要GC,它是新一代的GC
FGC,代表FullGC,这是发生在较早的时期的
S0C:第一个幸存区域的大小
S1C:第二个生存区的大小
S0U:第一个幸存区域的已用大小
S1U:第二个生存区的已用大小
EC:伊甸园的大小
欧盟:伊甸园的使用规模
OC:老年年龄
OU:老年使用的尺寸
MC:方法区域大小
MU:方法区域使用的大小
CCSC:压缩的类空间大小
CCSU:压缩的类空间使用量
YGCT:年轻一代垃圾回收会浪费时间
FGCT:晚年收集垃圾会浪费时间
GCT:垃圾回收消耗的总时间
如何计算gc频率,请参考:
结合上图,可以看出自程序运行以来,已经发生了7436个YGC和63个FGC,并且还有更多的GC。
基本上,它可以表明存在频繁的GC导致CPU使用率高的问题
第7步:使用命令转储存储器堆存储快照:jmap -dump:format = b,file = / tmp / my.hprof [java进程ID]
步骤8:使用内存分析工具(例如Eclipse Memory Analyzer)来分析my.hprof文件,并分析内存块占用了很多内存,并且存在内存泄漏,这使得空间无法被释放。
摘要:
有关过度使用CPU的调查需要两个角度。一个是它自己的任务线程中是否有错误,另一个是内存泄漏是否导致频繁的gc触发;另一个是内存泄漏是否导致频繁的gc触发。然后使用top,jstack,jmap等工具来定位问题的代码位置,然后针对性地进行分析和修改。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-367867-1.html
司机坐在左边开车艾玛英国拍摄鉴定完毕
这个只有对的方向才是最好的不是吗
嘻嘻