jdk命令使用场景

jdk命令使用场景,第1张

1、CPU 100%分析 1.1 top查看进程pid

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/869454.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存