JVM CPU 占用率高分析

1 篇文章 0 订阅
1 篇文章 0 订阅

简介

最近公司API项目经常CPU爆满。排除下问题。做下记录。

编写一下代码

public class JVMCPU {
    public static void main(String[] args) {
        fun1();
    }
    public static void fun1() {
        fun2();
    }
    public static void fun2() {
        long n = 1;
        long sum = 1;
        while (true) {
            sum *= n;
            n++;
            if (n == 18) ;
            {
                n = 1;
            }
        }
    }
}

编译运行
javac JVMMCPU.java
java JVMCPU

dump线程堆栈

123 为 进程ID
jstack -l 123 > 123.txt

windows

windows 任务管理器只能查看占用高的进程,需要Process Explorer工具查看进程中CPU占用高的线程。
获取到 线程ID

linux

top 查看 CPU使用率高的进程ID
top -H -p 123 查看CPU使用率高的线程ID

把10进制线程ID转换为16进制


分析

线程ID 0x26ec

dump出来的文件内容

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x0000000017e09000 nid=0x1c18 in Object.wait() [0x00000000190af000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000000d5f06af8> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:502)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:157)
    - locked <0x00000000d5f06af8> (a java.lang.ref.Reference$Lock)

   Locked ownable synchronizers:
    - None

"main" #1 prio=5 os_prio=0 tid=0x0000000003211000 nid=0x26ec runnable [0x000000000320f000]
   java.lang.Thread.State: RUNNABLE
    at JVMCPU.fun2(JVMCPU.java:21)
    at JVMCPU.fun1(JVMCPU.java:10)
    at JVMCPU.main(JVMCPU.java:6)

   Locked ownable synchronizers:
    - None

"VM Thread" os_prio=2 tid=0x0000000017e08000 nid=0xdc0 runnable 

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x0000000003226800 nid=0x1a8c runnable 

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x0000000003228000 nid=0x54 runnable 

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x000000000322a000 nid=0x1b88 runnable 

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x000000000322b800 nid=0x1a50 runnable 

"VM Periodic Task Thread" os_prio=2 tid=0x0000000019576000 nid=0x2478 waiting on condition 

查看代码可以看到在fun2方法中有大量的计算

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值