序
本文主要研究一下HotSpot VM的Native Memory Tracking
Native Memory Tracking
java8給HotSpot VM引入了Native Memory Tracking (NMT)特性,可以用於追蹤JVM的內部記憶體使用
使用
開啟
-XX:NativeMemoryTracking=summary
複製程式碼
使用-XX:NativeMemoryTracking=summary可以用於開啟NMT,其中該值預設為off,可以設定為summary或者detail來開啟;開啟的話,大概會增加5%-10%的效能消耗
檢視
/ # 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來對比
檢視diff
/ # jcmd 1 VM.native_memory summary.diff
複製程式碼
使用summary.diff來檢視跟baseline對比的統計資訊
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命令來開啟
例項
/ # 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表示應用正在使用的記憶體大小