java多线程基础篇(二)java线程常见问题Thread Dump日志分析

线程常见问题

CPU占用率很高,响应很慢
CPU占用率不高,但响应很慢
线程出现死锁的情况

CPU占用率不高,但响应很慢

有的时候我们会发现CPU占用率不高,系统日志也看不出问题,那么这种情况下,我们需要去看一下运
行中的线程有没有异常

1、jps命令

通过jps 命令,查看java进程的pid

D:\ideaWorkspace\lf-es-kafka-demo\src\main\java\com\lf\thread\status>jps
24256
31360 Jps
15492 ThreadStatus
2、jstack命令

通过`jstack 查看线程日志

D:\ideaWorkspace\lf-es-kafka-demo\src\main\java\com\lf\thread\status>jstack 15492

如果存在死锁情况,Thread Dump日志里面肯定会给出Found one Java-level deadlock:信息。只要找到这个信息就可以立马定位到问题并且去解决。

Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x0000000026070c88 (object 0x00000007163b7d78, a
java.lang.Integer),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x00000000260735c8 (object 0x0000000716649aa8, a
java.lang.Integer),
which is held by "Thread-1"

CPU占用率很高,但响应很慢

有的时候我们会发现CPU占用率很高,系统日志也看不出问题,那么这种情况下,我们需要去看一下运
行中的线程有没有异常

1、top -c

通过top -c 动态显示进程及占用资源的排行榜,从而找到占用CPU最高的进程PID,得到的
PID=80972

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
80972 root 20 0 7773456 296124 12904 S 100.2 1.8 0:38.83 java
2、top -H -p

然后再定位到对应的线程, top -H -p 80972 查找到该进程中最消耗CPU的线程,得到
PID=81122

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
81122 root 20 0 7773456 258504 12932 R 99.8 1.6 5:56.34 java
80972 root 20 0 7773456 258504 12932 S 0.0 1.6 0:00.00 java
3、printf “0x%x\n”

通过printf “0x%x\n” 81122 命令,把对应的线程PID转化为16进制

[root@localhost test]# printf "0x%x\n" 81122
0x13ce2
4、jstack pid| grep -A 20 0x13ce2

截止执行这个命令jstack 80972 | grep -A 20 0x13ce2 查看线程Dump日志,其中-A 20表示
展示20行, 80972表示进程ID, 0x13ce2表示线程ID

[root@localhost test]# jstack 80972 | grep -A 20 0x13ce2
"Thread-3" #30 daemon prio=5 os_prio=0 tid=0x00007f84500ce000 nid=0x13ce2
runnable [0x00007f84a78f7000]
java.lang.Thread.State: RUNNABLE
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:326)
at
java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
- locked <0x00000006c812f1b0> (a java.io.BufferedOutputStream)
at java.io.PrintStream.write(PrintStream.java:482)
- locked <0x00000006c812f190> (a java.io.PrintStream)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)
- locked <0x00000006c812f2d0> (a java.io.OutputStreamWriter)
at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
at java.io.PrintStream.newLine(PrintStream.java:546)
- eliminated <0x00000006c812f190> (a java.io.PrintStream)
at java.io.PrintStream.println(PrintStream.java:807)
- locked <0x00000006c812f190> (a java.io.PrintStream)
at com.example.threaddemo.WhileThread.run(ThreadController.java:33)
at java.lang.Thread.run(Thread.java:748)

从上述内容可以看出,是WhileThread.run方法中,执行的逻辑导致CPU占用过高。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值