top -c 查询出最高的进程
截图未命名.jpg
使用top -Hp 进程id 查询当前进程下线程情况
image.png
使用 jstack 进程id查询java进程情况,可以看到哪个线程sleep了
dkf@dkf-VirtualBox:~$ jstack 53798
2020-08-29 14:23:58
Full thread dump OpenJDK 64-Bit Server VM (14.0.1+7-Ubuntu-1ubuntu1 mixed mode, sharing):
Threads class SMR info:
_java_thread_list=0x00007f34e0002c70, length=14, elements={
0x00007f351004f800, 0x00007f3510051800, 0x00007f3510059000, 0x00007f351005b000,
0x00007f351005d000, 0x00007f351005f000, 0x00007f3510060800, 0x00007f351009b000,
0x00007f35100a4000, 0x00007f35100b1000, 0x00007f35100b3800, 0x00007f35100b5800,
0x00007f3510016800, 0x00007f34e0005000
}
"Reference Handler" #2 daemon prio=10 os_prio=0 cpu=0.16ms elapsed=764.28s tid=0x00007f351004f800 nid=0xd229 waiting on condition [0x00007f3515797000]
java.lang.Thread.State: RUNNABLE
at java.lang.ref.Reference.waitForReferencePendingList(java.base@14.0.1/Native Method)
at java.lang.ref.Reference.processPendingReferences(java.base@14.0.1/Reference.java:241)
at java.lang.ref.Reference$ReferenceHandler.run(java.base@14.0.1/Reference.java:213)
"Finalizer" #3 daemon prio=8 os_prio=0 cpu=0.08ms elapsed=764.28s tid=0x00007f3510051800 nid=0xd22a in Object.wait() [0x00007f3515696000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(java.base@14.0.1/Native Method)
- waiting on <0x00000000eb419450> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(java.base@14.0.1/ReferenceQueue.java:155)
- locked <0x00000000eb419450> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(java.base@14.0.1/ReferenceQueue.java:176)
at java.lang.ref.Finalizer$FinalizerThread.run(java.base@14.0.1/Finalizer.java:170)
"Signal Dispatcher" #4 daemon prio=9 os_prio=0 cpu=2.26ms elapsed=764.28s tid=0x00007f3510059000 nid=0xd22b runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Service Thread" #5 daemon prio=9 os_prio=0 cpu=0.07ms elapsed=764.28s tid=0x00007f351005b000 nid=0xd22c runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" #6 daemon prio=9 os_prio=0 cpu=72.52ms elapsed=764.28s tid=0x00007f351005d000 nid=0xd22d waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
No compile task
"C1 CompilerThread0" #7 daemon prio=9 os_prio=0 cpu=30.19ms elapsed=764.28s tid=0x00007f351005f000 nid=0xd22e waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
No compile task
"Sweeper thread" #8 daemon prio=9 os_prio=0 cpu=1.11ms elapsed=764.28s tid=0x00007f3510060800 nid=0xd22f runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Notification Thread" #9 daemon prio=9 os_prio=0 cpu=0.03ms elapsed=764.25s tid=0x00007f351009b000 nid=0xd230 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Common-Cleaner" #10 daemon prio=8 os_prio=0 cpu=0.60ms elapsed=764.25s tid=0x00007f35100a4000 nid=0xd232 in Object.wait() [0x00007f34f7c8e000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(java.base@14.0.1/Native Method)
- waiting on <0x00000000eb419ef8> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(java.base@14.0.1/ReferenceQueue.java:155)
- locked <0x00000000eb419ef8> (a java.lang.ref.ReferenceQueue$Lock)
at jdk.internal.ref.CleanerImpl.run(java.base@14.0.1/CleanerImpl.java:148)
at java.lang.Thread.run(java.base@14.0.1/Thread.java:832)
at jdk.internal.misc.InnocuousThread.run(java.base@14.0.1/InnocuousThread.java:134)
"线程1111" #11 prio=5 os_prio=0 cpu=258676.86ms elapsed=764.23s tid=0x00007f35100b1000 nid=0xd233 runnable [0x00007f34f7b8d000]
java.lang.Thread.State: RUNNABLE
at java.io.FileOutputStream.writeBytes(java.base@14.0.1/Native Method)
at java.io.FileOutputStream.write(java.base@14.0.1/FileOutputStream.java:347)
at java.io.BufferedOutputStream.flushBuffer(java.base@14.0.1/BufferedOutputStream.java:81)
at java.io.BufferedOutputStream.flush(java.base@14.0.1/BufferedOutputStream.java:142)
- locked <0x00000000eb430e18> (a java.io.BufferedOutputStream)
at java.io.PrintStream.write(java.base@14.0.1/PrintStream.java:570)
- locked <0x00000000eb41e138> (a java.io.PrintStream)
at sun.nio.cs.StreamEncoder.writeBytes(java.base@14.0.1/StreamEncoder.java:242)
at sun.nio.cs.StreamEncoder.implFlushBuffer(java.base@14.0.1/StreamEncoder.java:321)
at sun.nio.cs.StreamEncoder.flushBuffer(java.base@14.0.1/StreamEncoder.java:110)
- locked <0x00000000eb41a0b8> (a java.io.OutputStreamWriter)
at java.io.OutputStreamWriter.flushBuffer(java.base@14.0.1/OutputStreamWriter.java:181)
at java.io.PrintStream.writeln(java.base@14.0.1/PrintStream.java:723)
- locked <0x00000000eb41e138> (a java.io.PrintStream)
at java.io.PrintStream.println(java.base@14.0.1/PrintStream.java:1028)
at PrintThread.lambda$main$0(PrintThread.java:16)
at PrintThread$$Lambda$1/0x0000000800b78840.run(Unknown Source)
at java.lang.Thread.run(java.base@14.0.1/Thread.java:832)
"线程2" #12 prio=5 os_prio=0 cpu=5961.55ms elapsed=764.23s tid=0x00007f35100b3800 nid=0xd234 waiting on condition [0x00007f34f7a8c000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(java.base@14.0.1/Native Method)
at java.lang.Thread.sleep(java.base@14.0.1/Thread.java:337)
at java.util.concurrent.TimeUnit.sleep(java.base@14.0.1/TimeUnit.java:446)
at PrintThread.print(PrintThread.java:49)
at PrintThread.lambda$main$1(PrintThread.java:26)
at PrintThread$$Lambda$2/0x0000000800b79040.run(Unknown Source)
at java.lang.Thread.run(java.base@14.0.1/Thread.java:832)
"线程3" #13 prio=5 os_prio=0 cpu=6548.75ms elapsed=764.23s tid=0x00007f35100b5800 nid=0xd235 waiting on condition [0x00007f34f798b000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(java.base@14.0.1/Native Method)
at java.lang.Thread.sleep(java.base@14.0.1/Thread.java:337)
at java.util.concurrent.TimeUnit.sleep(java.base@14.0.1/TimeUnit.java:446)
at PrintThread.print(PrintThread.java:49)
at PrintThread.lambda$main$2(PrintThread.java:35)
at PrintThread$$Lambda$3/0x0000000800b79440.run(Unknown Source)
at java.lang.Thread.run(java.base@14.0.1/Thread.java:832)
"DestroyJavaVM" #14 prio=5 os_prio=0 cpu=33.77ms elapsed=764.22s tid=0x00007f3510016800 nid=0xd227 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Attach Listener" #15 daemon prio=9 os_prio=0 cpu=0.39ms elapsed=267.33s tid=0x00007f34e0005000 nid=0xd2b5 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"VM Thread" os_prio=0 cpu=149.31ms elapsed=764.28s tid=0x00007f351004c800 nid=0xd228 runnable
"VM Periodic Task Thread" os_prio=0 cpu=194.27ms elapsed=764.25s tid=0x00007f351009d800 nid=0xd231 waiting on condition
JNI global refs: 4, weak refs: 0
使用jstack java进程id > a.stack将堆栈信息导入文件
然后将top -Hp 线程id 下消耗cpu最高的线程id转换成16进制
查询: gerp -20 0xd5f3 a.stack
这样就定位到了具体哪一行出问题了
image.png