jstack&jmap&jhat-爱代码爱编程
1、top查看进程
Processes: 511 total, 4 running, 507 sleeping, 2354 threads 16:07:48
Load Avg: 5.63, 5.64, 5.09 CPU usage: 68.82% user, 30.2% sys, 1.15% idle
SharedLibs: 356M resident, 87M data, 91M linkedit.
MemRegions: 362886 total, 6887M resident, 155M private, 2280M shared.
PhysMem: 16G used (2335M wired), 259M unused.
VM: 45T vsize, 3136M framework vsize, 54832(0) swapins, 63680(0) swapouts.
Networks: packets: 381723/167M in, 317874/34M out.
Disks: 991190/19G read, 208341/7317M written.
PID COMMAND %CPU TIME #TH #WQ #PORT MEM PURG CMPRS PGRP
1515 idea 235.5 46:14.11 105/2 7/1 637+ 2542M+ 166M 442M- 1515
1759 java 105.0 14:51.13 27/2 1 125 22M 0B 0B 1515
154 WindowServer 23.6 12:56.99 14 6 1809- 456M- 12M+ 42M 154
1038 Terminal 11.4 00:21.21 11 5 356 42M- 3112K+ 12M- 1038
0 kernel_task 7.6 05:34.25 184/4 0 0 475M- 0B 0B 0
1866 top 6.9 00:07.00 1/1 0 27 4484K 0B 0B 1866
316 TouchBarServ 1.6 00:56.39 8 4 392+ 27M+ 2688K- 996K 316
665 WeChat 0.7 00:38.80 52 5 569 175M 0B 112M 665
776 QQ ScreenCap 0.4 00:02.73 4 1 195 10M+ 0B 5704K- 776
1134 Google Chrom 0.2 00:17.30 15 1 395 139M+ 0B 20M 614
625 Google Chrom 0.2 00:35.32 12 1 118 30M- 0B 14M 614
643 QQ 0.2 00:35.50 57 1 529 93M+ 0B 42M 643
1713 java 0.2 00:05.69 31 1 137 89M+ 0B 0B 1515
2、 jps [options] [hostid]
java虚拟机进程状态
admin@admindeMacBook-Pro /Applications % jps
1713 RemoteMavenServer36
1076
1515
1758 Launcher
1870 Jps
1759 PrintHelloWord
3、printf "%x\n" 1759 得到1759的十六进制值为6df,下面会用到。
4、jstack 1759 | grep 6df
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。
Full thread dump Java HotSpot(TM) 64-Bit Server VM (14+36-1461 mixed mode, sharing):
Threads class SMR info:
_java_thread_list=0x0000600003a1cb80, length=14, elements={
0x00007fc13d856000, 0x00007fc13f836000, 0x00007fc13e86d000, 0x00007fc13e86a000,
0x00007fc13d857000, 0x00007fc13f039000, 0x00007fc13d863000, 0x00007fc13e86b000,
0x00007fc13f03a000, 0x00007fc13e86e000, 0x00007fc13e85a800, 0x00007fc13d8de800,
0x00007fc13f86c800, 0x00007fc13f064000
}
"Reference Handler" #2 daemon prio=10 os_prio=31 cpu=0.26ms elapsed=955.09s tid=0x00007fc13d856000 nid=0x4503 waiting on condition [0x00007000102ae000]
java.lang.Thread.State: RUNNABLE
at java.lang.ref.Reference.waitForReferencePendingList(java.base@14/Native Method)
at java.lang.ref.Reference.processPendingReferences(java.base@14/Reference.java:241)
at java.lang.ref.Reference$ReferenceHandler.run(java.base@14/Reference.java:213)
"Finalizer" #3 daemon prio=8 os_prio=31 cpu=0.26ms elapsed=955.09s tid=0x00007fc13f836000 nid=0x4303 in Object.wait() [0x00007000103b1000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(java.base@14/Native Method)
- waiting on <0x00000007000005c8> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(java.base@14/ReferenceQueue.java:155)
- locked <0x00000007000005c8> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(java.base@14/ReferenceQueue.java:176)
at java.lang.ref.Finalizer$FinalizerThread.run(java.base@14/Finalizer.java:170)
"Signal Dispatcher" #4 daemon prio=9 os_prio=31 cpu=0.37ms elapsed=955.08s tid=0x00007fc13e86d000 nid=0x5603 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Service Thread" #5 daemon prio=9 os_prio=31 cpu=0.10ms elapsed=955.08s tid=0x00007fc13e86a000 nid=0xa703 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" #6 daemon prio=9 os_prio=31 cpu=293.70ms elapsed=955.08s tid=0x00007fc13d857000 nid=0xa403 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
No compile task
"C1 CompilerThread0" #8 daemon prio=9 os_prio=31 cpu=98.55ms elapsed=955.07s tid=0x00007fc13f039000 nid=0xa203 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
No compile task
"Sweeper thread" #9 daemon prio=9 os_prio=31 cpu=2.20ms elapsed=955.06s tid=0x00007fc13d863000 nid=0x5b03 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Common-Cleaner" #10 daemon prio=8 os_prio=31 cpu=0.91ms elapsed=955.02s tid=0x00007fc13e86b000 nid=0x5d03 in Object.wait() [0x0000700010ac9000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(java.base@14/Native Method)
- waiting on <0x0000000700001a10> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(java.base@14/ReferenceQueue.java:155)
- locked <0x0000000700001a10> (a java.lang.ref.ReferenceQueue$Lock)
at jdk.internal.ref.CleanerImpl.run(java.base@14/CleanerImpl.java:148)
at java.lang.Thread.run(java.base@14/Thread.java:832)
at jdk.internal.misc.InnocuousThread.run(java.base@14/InnocuousThread.java:134)
"Monitor Ctrl-Break" #11 daemon prio=5 os_prio=31 cpu=30.99ms elapsed=954.87s tid=0x00007fc13f03a000 nid=0x5f03 runnable [0x0000700010bcc000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.SocketDispatcher.read0(java.base@14/Native Method)
at sun.nio.ch.SocketDispatcher.read(java.base@14/SocketDispatcher.java:47)
at sun.nio.ch.NioSocketImpl.tryRead(java.base@14/NioSocketImpl.java:261)
at sun.nio.ch.NioSocketImpl.implRead(java.base@14/NioSocketImpl.java:312)
at sun.nio.ch.NioSocketImpl.read(java.base@14/NioSocketImpl.java:350)
at sun.nio.ch.NioSocketImpl$1.read(java.base@14/NioSocketImpl.java:803)
at java.net.Socket$SocketInputStream.read(java.base@14/Socket.java:982)
at sun.nio.cs.StreamDecoder.readBytes(java.base@14/StreamDecoder.java:297)
at sun.nio.cs.StreamDecoder.implRead(java.base@14/StreamDecoder.java:339)
at sun.nio.cs.StreamDecoder.read(java.base@14/StreamDecoder.java:188)
- locked <0x00000007000025e8> (a java.io.InputStreamReader)
at java.io.InputStreamReader.read(java.base@14/InputStreamReader.java:181)
at java.io.BufferedReader.fill(java.base@14/BufferedReader.java:161)
at java.io.BufferedReader.readLine(java.base@14/BufferedReader.java:326)
- locked <0x00000007000025e8> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine(java.base@14/BufferedReader.java:392)
at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:53)
"Notification Thread" #12 daemon prio=9 os_prio=31 cpu=0.06ms elapsed=954.87s tid=0x00007fc13e86e000 nid=0x9e03 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Thread-0" #13 prio=5 os_prio=31 cpu=472108.66ms elapsed=954.87s tid=0x00007fc13e85a800 nid=0x9d03 runnable [0x0000700010ed5000]
java.lang.Thread.State: RUNNABLE
at java.lang.Thread.yield(java.base@14/Native Method)
at PrintHelloWord$MyThread1.run(PrintHelloWord.java:12)
at java.lang.Thread.run(java.base@14/Thread.java:832)
"Thread-1" #14 prio=5 os_prio=31 cpu=485772.02ms elapsed=954.86s tid=0x00007fc13d8de800 nid=0x6703 runnable [0x0000700010fd8000]
java.lang.Thread.State: RUNNABLE
at java.lang.Thread.yield(java.base@14/Native Method)
at PrintHelloWord$MyThread2.run(PrintHelloWord.java:25)
at java.lang.Thread.run(java.base@14/Thread.java:832)
"DestroyJavaVM" #15 prio=5 os_prio=31 cpu=138.41ms elapsed=954.86s tid=0x00007fc13f86c800 nid=0x1703 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Attach Listener" #16 daemon prio=9 os_prio=31 cpu=4.07ms elapsed=542.31s tid=0x00007fc13f064000 nid=0x6c03 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"VM Thread" os_prio=31 cpu=687.30ms elapsed=955.10s tid=0x00007fc13f835000 nid=0x4803 runnable
"GC Thread#0" os_prio=31 cpu=221.08ms elapsed=955.11s tid=0x00007fc13e80f000 nid=0x4d03 runnable
"GC Thread#1" os_prio=31 cpu=225.19ms elapsed=951.80s tid=0x00007fc13f03c800 nid=0x6903 runnable
"GC Thread#2" os_prio=31 cpu=224.03ms elapsed=951.80s tid=0x00007fc13f041800 nid=0x9c03 runnable
"GC Thread#3" os_prio=31 cpu=218.33ms elapsed=951.80s tid=0x00007fc13f009000 nid=0x6b03 runnable
"G1 Main Marker" os_prio=31 cpu=0.07ms elapsed=955.11s tid=0x00007fc13f819000 nid=0x3103 runnable
"G1 Conc#0" os_prio=31 cpu=0.04ms elapsed=955.11s tid=0x00007fc13f81a000 nid=0x4b03 runnable
"G1 Refine#0" os_prio=31 cpu=0.08ms elapsed=955.11s tid=0x00007fc13e857000 nid=0x3403 runnable
"G1 Young RemSet Sampling" os_prio=31 cpu=97.08ms elapsed=955.11s tid=0x00007fc13e857800 nid=0x3503 runnable
"VM Periodic Task Thread" os_prio=31 cpu=288.51ms elapsed=954.87s tid=0x00007fc13d8de000 nid=0x6203 waiting on condition
JNI global refs: 15, weak refs: 0
5、jmap(Memory Map)和jhat(Java Heap Analysis Tool)
5.1 jmap -histo:live 1759 | more 实时:查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象
No dump file specified
WARNING: Ran out of C-heap; undercounted 342 total instances in data below
num #instances #bytes class name (module)
-------------------------------------------------------
1: 7666 377984 [B (java.base@14)
2: 7487 179688 java.lang.String (java.base@14)
3: 1413 174456 java.lang.Class (java.base@14)
4: 1179 114592 [Ljava.lang.Object; (java.base@14)
5: 1962 62784 java.util.HashMap$Node (java.base@14)
6: 12 50104 [C (java.base@14)
7: 365 37664 [Ljava.util.HashMap$Node; (java.base@14)
8: 1061 33952 java.util.concurrent.ConcurrentHashMap$Node (java.base@14)
9: 503 32904 [I (java.base@14)
10: 382 18336 java.util.HashMap (java.base@14)
11: 762 18288 java.lang.module.ModuleDescriptor$Exports (java.base@14)
12: 25 15632 [Ljava.util.concurrent.ConcurrentHashMap$Node; (java.base@14)
13: 544 13056 java.util.ImmutableCollections$Set12 (java.base@14)
14: 133 10640 java.net.URI (java.base@14)
15: 320 10240 java.lang.module.ModuleDescriptor$Requires (:
5.2 jmap -dump:format=b,file=/tmp/dump.dat 1759 离线分析 jhat -port 9998 /tmp/dump.dat 然后就可以在浏览器中输入主机地址:9998查看了。
admin@admindeMacBook-Pro /Applications % jmap -dump:format=b,file=/tmp/dump1.dat 1759
Dumping heap to /private/tmp/dump1.dat ...
Heap dump file created [7851845 bytes in 0.083 secs]
admin@admindeMacBook-Pro /Applications % jhat -port 9998 /tmp/dump1.dat
Reading from /tmp/dump1.dat...
Dump file created Thu May 25 16:05:46 CST 2023
Snapshot read, resolving...
Resolving 125807 objects...
Chasing references, expect 25 dots.........................
Eliminating duplicate references.........................
Snapshot resolved.
Started HTTP server on port 9998
Server is ready.