首先执行top命令查看cpu占用过高的进程id
接着执行top -Hp 进程id获取进程内cpu占用最高的线程id
TIME列是各个java线程耗费的cpu时间,将线程id使用printf "%X\n" 线程id转成十六进制
然后使用jstack 进程id | grep 线程id十六进制,找到这个线程的堆栈,然后分析代码逻辑。
使用jstat命令查看jvm监测统计
jstat -gc PID 毫秒间隔 统计次数
jvm的堆内存分为新生代、老年代、永久代,其中新生代又分为Eden区和Surivor区,Surivor区又分为from Surivor和toSurivor
这里的S0和S1就相当于from surivor 和to surivor
S0C和S1C就是from surivor和to surivor的容量
S0U和S1U就是from surivor和to surivor的使用量
EC和EU就是Eden区的容量和使用量
OC和OU就是老年代的容量和使用量
如果是1.8开始的jdk版本,永久代被元空间替代,MC和MU就是元数据空间的容量和使用量
YGC、YGCT是新生代的GC次数和耗时
FGC、FGCT是full gc的次数和耗时
GCT是gc总耗时