Java8給HotSpot VM引入了Native Memory Tracking (NMT)特性,可以用於追蹤JVM的內部內存使用,一般在壓測調參的時候使用,生產環境不要引入。
參考資料:
https://www.jianshu.com/p/1e65d4d973cd
https://www.cnblogs.com/liululee/p/11143623.html
https://my.oschina.net/foxty/blog/1934968
1、啟用:-XX:NativeMemoryTracking=detail:
-XX:NativeMemoryTracking=[off | summary | detail] # off: 默認關閉 # summary: 只統計各個分類的內存使用情況. # detail: Collect memory usage by individual call sites.
打開NMT會帶來5%-10%的性能損耗
2、查看:
jcmd命令隨時獲取本機內存信息:
2.1、 jcmd <pid> VM.native_memory
2.2、jcmd <pid> VM.native_memory scale=MB
其中scale參數可以指定展示的單位,可以為KB或者MB或者GB
jcmd <pid> VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB]
# summary: 分類內存使用情況.
# detail: 詳細內存使用情況,除了summary信息之外還包含了虛擬內存使用情況。
# baseline: 創建內存使用快照,方便和后面做對比
# summary.diff: 和上一次baseline的summary對比
# detail.diff: 和上一次baseline的detail對比
# shutdown: 關閉NMT
3、創建baseline:
3.1、 NMT允許我們跟蹤內存分配如何隨時間變化。首先,我們應該將應用程序的當前狀態標記為基線:
jcmd <pid> VM.native_memory baseline
成功:Baseline succeeded
3.2、NMT使用+和 - 符號將告訴我們在此期間內存使用情況如何變化:
查看diff:然后,過了一會兒,我們可以將當前的內存使用情況與該基線(baseline)進行比較:
jcmd <pid> VM.native_memory summary.diff
示例:
Total: reserved=1771487KB +3373KB, committed=491491KB +6873KB
- Java Heap (reserved=307200KB, committed=307200KB)
(mmap: reserved=307200KB, committed=307200KB)
- Class (reserved=1084300KB +2103KB, committed=39356KB +2871KB)
// Truncated
保留和提交的總內存分別增加了3 MB和6 MB。可以很容易地發現內存分配的其他波動。