聊聊HotSpot VM的Native Memory Tracking

本文主要研究一下HotSpot VM的Native Memory Trackinghtml

Native Memory Tracking

java8給HotSpot VM引入了Native Memory Tracking (NMT)特性,能夠用於追蹤JVM的內部內存使用java

使用

開啓

-XX:NativeMemoryTracking=summary

使用-XX:NativeMemoryTracking=summary能夠用於開啓NMT,其中該值默認爲off,能夠設置爲summary或者detail來開啓;開啓的話,大概會增長5%-10%的性能消耗spring

查看

/ # jcmd 1 VM.native_memory summary
/ # jcmd 1 VM.native_memory summary scale=MB

使用jcmd pid VM.native_memory能夠查看,後面能夠加summary或者detail,若是是開啓summary的,就只能使用summary;其中scale參數能夠指定展現的單位,能夠爲KB或者MB或者GB緩存

建立baseline

/ # jcmd 1 VM.native_memory baseline
1:
Baseline succeeded

建立baseline以後能夠用summary.diff來對比oracle

查看diff

/ # jcmd 1 VM.native_memory summary.diff

使用summary.diff來查看跟baseline對比的統計信息jvm

shutdown時輸出

-XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics

使用上述命令能夠在jvm shutdown的時候輸出總體的native memory統計性能

關閉

/ # jcmd 1 VM.native_memory shutdown
1:
Native memory tracking has been turned off

使用jcmd pid VM.native_memory shutdown能夠用於關閉NMT;注意使用jcmd關閉以後貌似沒有對應jcmd命令來開啓spa

實例

/ # jcmd 1 VM.native_memory summary scale=MB
1:

Native Memory Tracking:

Total: reserved=2175MB, committed=682MB
-                 Java Heap (reserved=501MB, committed=463MB)
                            (mmap: reserved=501MB, committed=463MB)

-                     Class (reserved=1070MB, committed=50MB)
                            (classes #8801)
                            (  instance classes #8204, array classes #597)
                            (malloc=2MB #24660)
                            (mmap: reserved=1068MB, committed=49MB)
                            (  Metadata:   )
                            (    reserved=44MB, committed=43MB)
                            (    used=42MB)
                            (    free=1MB)
                            (    waste=0MB =0.00%)
                            (  Class space:)
                            (    reserved=1024MB, committed=6MB)
                            (    used=5MB)
                            (    free=0MB)
                            (    waste=0MB =0.00%)

-                    Thread (reserved=228MB, committed=27MB)
                            (thread #226)
                            (stack: reserved=227MB, committed=26MB)
                            (malloc=1MB #1139)

-                      Code (reserved=243MB, committed=17MB)
                            (malloc=1MB #5509)
                            (mmap: reserved=242MB, committed=16MB)

-                        GC (reserved=23MB, committed=15MB)
                            (malloc=8MB #11446)
                            (mmap: reserved=16MB, committed=7MB)

-                  Compiler (reserved=26MB, committed=26MB)
                            (malloc=2MB #1951)
                            (arena=24MB #13)

-                  Internal (reserved=5MB, committed=5MB)
                            (malloc=3MB #9745)
                            (mmap: reserved=2MB, committed=2MB)

-                     Other (reserved=2MB, committed=2MB)
                            (malloc=2MB #202)

-                    Symbol (reserved=10MB, committed=10MB)
                            (malloc=8MB #233939)
                            (arena=3MB #1)

-    Native Memory Tracking (reserved=5MB, committed=5MB)
                            (tracking overhead=5MB)

-               Arena Chunk (reserved=63MB, committed=63MB)
                            (malloc=63MB)
  • 能夠看到整個memory主要包含了Java Heap、Class、Thread、Code、GC、Compiler、Internal、Other、Symbol、Native Memory Tracking、Arena Chunk這幾部分;其中reserved表示應用可用的內存大小,committed表示應用正在使用的內存大小
  • Java Heap部分表示heap內存目前佔用了463MB;Class部分表示已經加載的classes個數爲8801,其metadata佔用了50MB;Thread部分表示目前有225個線程,佔用了27MB;Code部分表示JIT生成的或者緩存的instructions佔用了17MB;GC部分表示目前已經佔用了15MB的內存空間用於幫助GC;Code部分表示compiler生成code的時候佔用了26MB;Internal部分表示命令行解析、JVMTI等佔用了5MB;Other部分表示還沒有歸類的佔用了2MB;Symbol部分表示諸如string table及constant pool等symbol佔用了10MB;Native Memory Tracking部分表示該功能自身佔用了5MB;Arena Chunk部分表示arena chunk佔用了63MB
  • 一個arena表示使用malloc分配的一個memory chunk,這些chunks能夠被其餘subsystems作爲臨時內存使用,好比pre-thread的內存分配,它的內存釋放是成bulk的

小結

  • java8給HotSpot VM引入了Native Memory Tracking (NMT)特性,能夠用於追蹤JVM的內部內存使用
  • 使用-XX:NativeMemoryTracking=summary能夠用於開啓NMT,其中該值默認爲off,能夠設置summary、detail來開啓;開啓的話,大概會增長5%-10%的性能消耗;使用-XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics能夠在jvm shutdown的時候輸出總體的native memory統計;其餘的能夠使用jcmd pid VM.native_memory相關命令進行查看、diff、shutdown等
  • 整個memory主要包含了Java Heap、Class、Thread、Code、GC、Compiler、Internal、Other、Symbol、Native Memory Tracking、Arena Chunk這幾部分;其中reserved表示應用可用的內存大小,committed表示應用正在使用的內存大小

doc

相關文章
相關標籤/搜索