3709进程占用cpu最高。
1.2 使用jdk命令jstack获取此时的线程快照当前目录生成快照
>jstack -l 3709 > ./jstack_result.txt
1.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 java
1.4 将子线程pid进行16进制转换
[root@iZbp158rdu61wkh469o19kZ ~]# printf %x\n 3711
e7f
1.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;
/**
* @program: arthas-demo
* @description:
* @author: geoffrey
* @create: 2022-05-01 18:00
*/
@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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)