3709进程占用cpu最高。
1.2 使用jdk命令jstack获取此时的线程快照当前目录生成快照
>jstack -l 3709 > ./jstack_result.txt1.3 top -Hp pid 查看子线程pid,可以看到CPU占用过高的线程
[root@iZbp158rdu61wkh469o19kZ ~]# top -Hp 3709 top - 00:08:12 up 1:41, 3 users, load average: 1.64, 0.71, 0.83 Threads: 37 total, 2 running, 35 sleeping, 0 stopped, 0 zombie %Cpu(s): 97.3 us, 1.0 sy, 0.0 ni, 1.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 7733364 total, 2523520 free, 3729476 used, 1480368 buff/cache KiB Swap: 0 total, 0 free, 0 used. 3727164 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3711 root 20 0 4540444 1.6g 13872 R 98.0 22.1 13:41.88 java 3712 root 20 0 4540444 1.6g 13872 R 93.4 22.1 13:40.40 java 3713 root 20 0 4540444 1.6g 13872 S 0.3 22.1 0:34.87 java 3740 root 20 0 4540444 1.6g 13872 S 0.3 22.1 0:03.06 java 3709 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.00 java 3710 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:02.99 java 3714 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.02 java 3715 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.01 java 3716 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.00 java 3717 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:05.52 java 3718 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:01.21 java 3719 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.00 java 3720 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:01.55 java 3723 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.16 java 3724 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.15 java 3725 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.00 java 3726 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.00 java 3727 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.00 java 3728 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.40 java 3731 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.00 java 3732 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.00 java 3733 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.00 java 3734 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.00 java 3735 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.10 java 3736 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:02.94 java 3737 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.00 java 3738 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.00 java 3739 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:02.79 java 3741 root 20 0 4540444 1.6g 13872 S 0.0 22.1 0:00.00 java1.4 将子线程pid进行16进制转换
[root@iZbp158rdu61wkh469o19kZ ~]# printf %x\n 3711 e7f1.5 打开第二步的jstack_result.txt,搜索e7dn,将会打印代码行号
一般因为逻辑缺陷造成死循环,容易造成cpu占用过高
2、死锁场景 2.1 死锁代码import com.ybw.arthas.demo.service.TestService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class TestServiceImpl implements TestService {
public static Object lock1 = new Object();
public static Object lock2 = new Object();
@Override
public void deadLock() {
new Thread(() -> {
synchronized (lock1) {
try {
log.info("thread1 开始执行");
Thread.sleep(500);
} catch (Exception e) {
}
synchronized (lock2) {
log.info("thread1 执行结束");
}
}
}).start();
new Thread(() -> {
synchronized (lock2) {
try {
log.info("thread2 开始执行");
Thread.sleep(500);
} catch (Exception e) {
}
synchronized (lock1) {
log.info("thread2 执行结束");
}
}
}).start();
}
}
2.2 执行查看结果
执行打印日志,证明被锁住了
[INFO ] 2022-05-01 18:21:10.558 [Thread-4] c.y.a.d.service.impl.TestServiceImpl - thread1 开始执行 [INFO ] 2022-05-01 18:21:10.567 [Thread-5] c.y.a.d.service.impl.TestServiceImpl - thread2 开始执行
jstack查看
>jstack 3839 ..... Found one Java-level deadlock: ============================= "Thread-5": waiting to lock monitor 0x00007fa8d8002538 (object 0x000000008a6fa370, a java.lang.Object), which is held by "Thread-4" "Thread-4": waiting to lock monitor 0x00007fa8f40062c8 (object 0x000000008a6fa360, a java.lang.Object), which is held by "Thread-5" Java stack information for the threads listed above: =================================================== "Thread-5": at com.ybw.arthas.demo.service.impl.TestServiceImpl.lambda$deadLock$1(TestServiceImpl.java:41) - waiting to lock <0x000000008a6fa370> (a java.lang.Object) - locked <0x000000008a6fa360> (a java.lang.Object) at com.ybw.arthas.demo.service.impl.TestServiceImpl$$Lambda$480/219071009.run(Unknown Source) at java.lang.Thread.run(Thread.java:745) "Thread-4": at com.ybw.arthas.demo.service.impl.TestServiceImpl.lambda$deadLock$0(TestServiceImpl.java:29) - waiting to lock <0x000000008a6fa360> (a java.lang.Object) - locked <0x000000008a6fa370> (a java.lang.Object) at com.ybw.arthas.demo.service.impl.TestServiceImpl$$Lambda$479/1398325595.run(Unknown Source) at java.lang.Thread.run(Thread.java:745) Found 1 deadlock.
可以看到两个线程对应行数
3、生成堆内存的dump 文件>jmap -dump:format=b,file=dump.hprof 3839
在当前目录生成dump.hprof



