序
本文主要研究一下 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 表示应用正在使用的内存大小
doc
Native Memory Tracking
Native Memory Tracking diagnostic-tools
NMT Memory Categories
Memory footprint of the JVM
Native Memory Tracking in JVM