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.

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值