JVM メモリ解析ツール jstack、jstat、jmap

jstack、jstat、jmap は jdk に付属するメモリ分析ツールで、ヒープ、メモリ、スレッドの実行ステータスの分析に役立ちます。

jstack
1) スレッドのスタック情報、つまり JVM の現時点でのスレッド スナップショットを表示します。
2) 主に、スレッドのデッドロック、無限ループなどのスレッドの長期停止の理由、および過度に長い外部リクエストによって引き起こされるスレッドの一時停止の理由を特定するために使用されます。
3) 一定時間ごとに 1 回収集することを推奨し、3 ~ 5 回の収集を通じて常に実行状態のスレッドが存在するかどうかを確認すると、2 番目のポイントの特定が容易になります。

使用法:

jstack <PID>

jstack <PID> > test.txt   #输出到文件

例えば:

[root@root-36-70 ~]# jstack 7574

2022-08-03 12:00:46
Java HotSpot™ 64 ビット サーバー VM (25.211-b12 混合モード) のフル スレッド ダンプ:

「Keep-Alive-Timer」 #304 デーモン prio=8 os_prio=0 tid=0x00007fd3a4002800 nid=0x7a30 条件 [0x00007fd4282e1000] で待機中
java.lang.Thread.State: TIMED_WAITING (スリープ中)
at java.lang.Thread.sleep(Nativeメソッド)
at sun.net.www.http.KeepAliveCache.run(KeepAliveCache.java:172)
at java.lang.Thread.run(Thread.java:748)

「com.alibaba.nacos.client.Worker.longPolling.fixed-172.16.36.150_8848」 #75 デーモン prio=5 os_prio=0 tid=0x00007fd39c001000 nid=0x4d4f 条件 [0x00007fd4233f4000]
java.lang.Thread で待機しています.状態: 待機中(パーキング)
at sun.misc.Unsafe.park(Native Method) - <0x00000007028dc008> (java.util.concurrent.locks.AbstractQueuedSynchronizer条件オブジェクト) atjava
を待機するパーキング。ユーティリティ。同時進行。ロック。ロックサポート。park(ロックサポート.java:175)atjava. ユーティリティ。同時進行。ロック。抽象キュー シンクロナイザー ConditionObject) (java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) (java.util.concurrent.locks.AbstractQueuedSynchronizer))オブジェクト条件Java設定ます_ _ _ _ _ _ _ _ _ ユーティル_ _ _ 同時です_ _ _ _ _ ロックます_ ロックサポート_ _ _ _ _ _ パークロックサポート_ _ _ _ _ _ _ _ジャバ_ _:175 )ジャバ_ _ _ _ ユーティル_ _ _ 同時です_ _ _ _ _ ロックます_ java.util.concurrent.ScheduledThreadPoolExecutorトランザクションキュー同期ConditionObject.await ( AbstractQueuedSynchronizer.java:2039 ) _ _ _ _ _ _ _ _ _ _
_作業キューの遅延。take(Scheduled Thread Pool Executor.java:1081) atjava 。ユーティリティ。同時進行。スケジュールされたスレッド プールの実行者 DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081) (java.util.concurrent.ScheduledThreadPoolExecutor)W ork Queue遅延まし_ _ _ _ _ take (スケジュールスレッドプール実行または.java _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _:1081 )ジャバ_ _ _ _ ユーティル_ _ _ 同時です_ _ _ _ _ スケジュールスレッドプール実行またはDelayedWorkQueue.take ( ScheduledThreadPoolExecutor.java:809 ) ( java.util.concurrent.ThreadPoolExecutor.getTask ( ThreadPoolExecutor.java:1074 ) ) _ _ _ _ _
_
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
で java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) で
java.lang.Thread.run(Thread.java:748) )

Thread.State 説明
状態/アクション 説明
New スレッド オブジェクトの作成時に存在する状態です。この時点では、スレッドは
Runnable を実行できません。thread.start() を呼び出した後、スレッドは Runnable 状態、つまり準備完了状態になります。州。CPU を取得している限り、
実行中のスレッドが
待機中であることを実行したり、ロック オブジェクトに対して thread.join() を実行したり、obj.wait() を呼び出したりすることができます。この状態になり、スレッドが待機中であることを示します。特定のリソースまたは条件が起動するのを待っています。 Timed_Waiting は、 Thread.sleep(long) 、 thread.join(long) 、 obj.wait(long)などの実行後にこの状態に入ります。
Waiting との違いは、待機時間が異なることです。 Timed_Waiting には時間制限があります。
例外をキャッチした後、デッド状態になり、スレッドが終了したことを示します
。 デッドロック (デッドロックがあることを示します)

ステータス

1)主要用于统计堆内存、类相关和GC相关信息
2)可以时时监控资源和性能

使用法:

jstat -gc <pid>

jstat -gc <pid>  2s  100  #间隔2s连续输出100次

例如:
  [root@lsy-36-70 ~]# jstat -gc 7574 2s 10
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
    149760.0 149760.0 35129.5  0.0   749056.0 746427.7 1048576.0   222899.5  129280.0 122844.9 15104.0 14076.8    152    8.696   0      0.000    8.696
    149760.0 149760.0 35129.5  0.0   749056.0 746540.0 1048576.0   222899.5  129280.0 122844.9 15104.0 14076.8    152    8.696   0      0.000    8.696
    149760.0 149760.0 35129.5  0.0   749056.0 746687.8 1048576.0   222899.5  129280.0 122844.9 15104.0 14076.8    152    8.696   0      0.000    8.696
    149760.0 149760.0 35129.5  0.0   749056.0 746731.0 1048576.0   222899.5  129280.0 122844.9 15104.0 14076.8    152    8.696   0      0.000    8.696
    149760.0 149760.0 35129.5  0.0   749056.0 746745.0 1048576.0   222899.5  129280.0 122844.9 15104.0 14076.8    152    8.696   0      0.000    8.696
    149760.0 149760.0 35129.5  0.0   749056.0 746878.8 1048576.0   222899.5  129280.0 122844.9 15104.0 14076.8    152    8.696   0      0.000    8.696
    149760.0 149760.0  0.0   24516.0 749056.0  3428.4  1048576.0   223104.6  129280.0 122850.1 15104.0 14076.8    153    8.720   0      0.000    8.720
    149760.0 149760.0  0.0   24516.0 749056.0  3670.3  1048576.0   223104.6  129280.0 122850.1 15104.0 14076.8    153    8.720   0      0.000    8.720
    149760.0 149760.0  0.0   24516.0 749056.0  3734.9  1048576.0   223104.6  129280.0 122850.1 15104.0 14076.8    153    8.720   0      0.000    8.720
    149760.0 149760.0  0.0   24516.0 749056.0  3881.1  1048576.0   223104.6  129280.0 122850.1 15104.0 14076.8    153  
各指标描述:

S0C:年轻代中第一个survivor(幸存区)的容量 (字节 Capacity)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节 Used)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC:Old代的容量 (字节)
OU:Old代目前已使用空间 (字节)
MC:metaspace(元空间)的容量 (字节)
MU:metaspace(元空间)目前已使用空间 (字节)
CCSC:当前压缩类空间的容量 (字节)
CCSU:当前压缩类空间目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)

jmap

1)查看堆内存信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况,可以结合jhat使用

2)主要用于分析OOM

使用法:

jmap -heap <PID>

jmap -dump:format=b,file=HeapDump <pid>  #dump出内存信息,可用内存分析工具分析情况,format=b是通过二进制的意思

例えば:

1) ヒープメモリ情報を直接表示する

[root@lsy-36-70 ~]# jmap -heap 7574
Attaching to process ID 7574, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.211-b12
 
using thread-local object allocation.
Parallel GC with 8 thread(s)
 
Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 3183476736 (3036.0MB)
   NewSize                  = 66060288 (63.0MB)
   MaxNewSize               = 1061158912 (1012.0MB)
   OldSize                  = 133169152 (127.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)
 
Heap Usage:
PS Young Generation
Eden Space:
   capacity = 562561024 (536.5MB)
   used     = 386173616 (368.2838592529297MB)
   free     = 176387408 (168.2161407470703MB)
   68.64564012170172% used
From Space:
   capacity = 1048576 (1.0MB)
   used     = 720896 (0.6875MB)
   free     = 327680 (0.3125MB)
   68.75% used
To Space:
   capacity = 14155776 (13.5MB)
   used     = 0 (0.0MB)
   free     = 14155776 (13.5MB)
   0.0% used
PS Old Generation
   capacity = 108003328 (103.0MB)
   used     = 27321200 (26.055526733398438MB)
   free     = 80682128 (76.94447326660156MB)
   25.296627896503338% used
 
16408 interned Strings occupying 1561208 bytes.

2) ヒープメモリ情報をファイルにダンプします。

[root@lsy-36-70 ~]# jmap -dump:format=b,file=/tmp/dump01.dat 7574
Dumping heap to /tmp/dump01.dat ...
Heap dump file created

3) jhat ビュー、ブラウザ入力ポート 7000 アクセス

[root@lsy-36-70 ~]# jhat -port 7000 /tmp/dump01.dat

おすすめ

転載: blog.csdn.net/qq_34690003/article/details/130261158