java cpu 热点_Java CPU 100% 场景复现与分析

列举 4 种 cpu 100% 的场景,之后会进行复现,以及对应的解决方案。

e8d6cfdc0490b9aefbb800a5f1203cca.png

死循环

Java 代码

public class HelloWorld {

public static void main(String[] args) {

// 直接死循环

new Thread(() -> { while (true){ } }).start();

}

}

分析

top 分析进程使用资源情况

26b3fdb711d450131a3836da38689864.png

执行 top -Hp 2581 可查看进程 2581 中的占用 CPU 的线程 ID 是 2592 。

27a77e643bb7dcd02996ba84f5324732.png

执行 16 进制的转换 printf "%x \n" 2592 得到 a20 的,再通过 jstack 命令定位出现问题的地方

c5e418f51d92f760bbc4318e3954c2aa.png

大量 Full GC

Java 代码

public static void main(String[] args) {

//-XX:+UseSerialGC -Xms200M -Xmx200M -Xmn32m -XX:SurvivorRatio=8 -XX:+PrintGCDetails

byte[] newErdo = new byte[1024 * 1024 * 30];

while (true) {

// 触发 full gc

System.gc();

byte[] bytes = new byte[1024 * 1024 * 120];

}

}

分析

top 分析资源使用情况

b9ff72d733777d82f7d4e0567f07622f.png

查看 gc 状态

d0f23767dcb648a0b61baa96b12f005f.png

线程计算耗时长

Java 代码

public static void main(String[] args) {

// 有复杂,耗时长的计算,导致 CPU 100%

work();

}

private static void work() {

// 利用 CPU 计算 π 的近似值

int i = Integer.MAX_VALUE;

double pi, temp = 0;

for (int j = 1; j <= i; j++) {

temp += Math.pow(-1, j + 1) / (2 * j - 1);

}

pi = 4 * temp;

System.out.println(pi);

}

分析

f117f60bb21c44d5094b1e709a0e97da.png

大量线程上下文切换

Java 代码

public static void main(String[] args) {

// 大量线程 2000 同时并发,且进行等待

for (int i = 0; i < 2000; i++) {

new Thread(() -> {

try {

work();

} catch (InterruptedException e) {

e.printStackTrace();

}

}).start();

}

System.out.println(1111111111);

}

private static void work() throws InterruptedException {

Thread.sleep(10000L);

System.out.println("----> do work now");

}

分析

c37d66b7d23629653c90dede02e155c9.png

类似上述案例一样,运行程序后,会发现 CPU 突然飙升~~~

总结

命令 汇总

top -Hp [pid]

printf "%x \n" [tid]

jstack [pid]|grep [16 进制 tid] -A 10

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值