聊聊jvm的direct buffer统计
序
本文主要研究一下jvm的direct buffer统计
spring boot metrics
jvm.memory.used
{"name": "jvm.memory.used","description": "The amount of used memory","baseUnit": "bytes","measurements": [{"statistic": "VALUE","value": 137868592}],"availableTags": [{"tag": "area","values": ["heap","nonheap"]},{"tag": "id","values": ["Compressed Class Space","PS Survivor Space","PS Old Gen","Metaspace","PS Eden Space","Code Cache"]}]
}
jvm.memory.used包括heap和nonheap两大类
heap
http://localhost:8080/actuator/metrics/jvm.memory.used?tag=area:heap
{"name": "jvm.memory.used","description": "The amount of used memory","baseUnit": "bytes","measurements": [{"statistic": "VALUE","value": 84724536}],"availableTags": [{"tag": "id","values": ["PS Eden Space","PS Survivor Space","PS Old Gen"]}]
}
heap的话根据具体的垃圾收集器类型有不同的区分
nonheap
http://localhost:8080/actuator/metrics/jvm.memory.used?tag=area:nonheap
{"name": "jvm.memory.used","description": "The amount of used memory","baseUnit": "bytes","measurements": [{"statistic": "VALUE","value": 54874872}],"availableTags": [{"tag": "id","values": ["Metaspace","Compressed Class Space","Code Cache"]}]
}
nonheap这里包括3个,分别是Metaspace、Compressed Class Space、Code Cache
jvm.buffer.memory.used
http://localhost:8080/actuator/metrics/jvm.buffer.memory.used?tag=id:direct
{"name": "jvm.buffer.memory.used","description": "An estimate of the memory that the Java virtual machine is using for this buffer pool","baseUnit": "bytes","measurements": [{"statistic": "VALUE","value": 81920}],"availableTags": [{"tag": "id","values": ["direct","mapped"]}]
}
jvm.buffer.memory.used包含了direct、mapped两大类
direct
http://localhost:8080/actuator/metrics/jvm.buffer.memory.used?tag=id:direct
{"name": "jvm.buffer.memory.used","description": "An estimate of the memory that the Java virtual machine is using for this buffer pool","baseUnit": "bytes","measurements": [{"statistic": "VALUE","value": 81920}],"availableTags": []
}
mapped
http://localhost:8080/actuator/metrics/jvm.buffer.memory.used?tag=id:mapped
{"name": "jvm.buffer.memory.used","description": "An estimate of the memory that the Java virtual machine is using for this buffer pool","baseUnit": "bytes","measurements": [{"statistic": "VALUE","value": 0}],"availableTags": []
}
jvm.buffer.count
http://localhost:8080/actuator/metrics/jvm.buffer.count
{"name": "jvm.buffer.count","description": "An estimate of the number of buffers in the pool","baseUnit": "buffers","measurements": [{"statistic": "VALUE","value": 10}],"availableTags": [{"tag": "id","values": ["direct","mapped"]}]
}
jvm.buffer.count分direct和mapped两大类
direct
http://localhost:8080/actuator/metrics/jvm.buffer.count?tag=id:direct
{"name": "jvm.buffer.count","description": "An estimate of the number of buffers in the pool","baseUnit": "buffers","measurements": [{"statistic": "VALUE","value": 10}],"availableTags": []
}
mapped
http://localhost:8080/actuator/metrics/jvm.buffer.count?tag=id:mapped
{"name": "jvm.buffer.count","description": "An estimate of the number of buffers in the pool","baseUnit": "buffers","measurements": [{"statistic": "VALUE","value": 0}],"availableTags": []
}
jvm.buffer.total.capacity
http://localhost:8080/actuator/metrics/jvm.buffer.total.capacity
{"name": "jvm.buffer.total.capacity","description": "An estimate of the total capacity of the buffers in this pool","baseUnit": "bytes","measurements": [{"statistic": "VALUE","value": 81920}],"availableTags": [{"tag": "id","values": ["direct","mapped"]}]
}
jvm.buffer.total.capacity分direct和mapped两大类
direct
http://localhost:8080/actuator/metrics/jvm.buffer.total.capacity?tag=id:direct
{"name": "jvm.buffer.total.capacity","description": "An estimate of the total capacity of the buffers in this pool","baseUnit": "bytes","measurements": [{"statistic": "VALUE","value": 81920}],"availableTags": []
}
mapped
http://localhost:8080/actuator/metrics/jvm.buffer.total.capacity?tag=id:mapped
{"name": "jvm.buffer.total.capacity","description": "An estimate of the total capacity of the buffers in this pool","baseUnit": "bytes","measurements": [{"statistic": "VALUE","value": 0}],"availableTags": []
}
Native Memory Tracking
summary
jcmd 6878 VM.native_memory summary scale=MB
6878:Native Memory Tracking:Total: reserved=5625MB, committed=844MB
- Java Heap (reserved=4096MB, committed=577MB)(mmap: reserved=4096MB, committed=577MB)- Class (reserved=1066MB, committed=46MB)(classes #7027)(malloc=10MB #10535)(mmap: reserved=1056MB, committed=37MB)- Thread (reserved=36MB, committed=36MB)(thread #37)(stack: reserved=36MB, committed=36MB)- Code (reserved=246MB, committed=15MB)(malloc=2MB #3834)(mmap: reserved=244MB, committed=12MB)- GC (reserved=160MB, committed=148MB)(malloc=10MB #220)(mmap: reserved=150MB, committed=138MB)- Internal (reserved=10MB, committed=10MB)(malloc=10MB #10055)- Symbol (reserved=9MB, committed=9MB)(malloc=8MB #74319)(arena=2MB #1)- Native Memory Tracking (reserved=2MB, committed=2MB)(tracking overhead=2MB)
其中Internal部分包含了jvm中使用的directBuffer的大小
示例
public void run(String... args) throws Exception {// 分配一个256MB的直接缓冲区ByteBuffer buffer = ByteBuffer.allocateDirect(256 * 1024 * 1024);// 填充数据Random random = new Random();while (buffer.remaining() >= 4) {buffer.putInt(random.nextInt());}System.out.println("Allocated direct buffer with capacity " + buffer.capacity());}
VM.native_memory
jcmd 8077 VM.native_memory summary scale=MB
8077:Native Memory Tracking:Total: reserved=5881MB, committed=1099MB
- Java Heap (reserved=4096MB, committed=576MB)(mmap: reserved=4096MB, committed=576MB)- Class (reserved=1066MB, committed=46MB)(classes #7028)(malloc=10MB #10794)(mmap: reserved=1056MB, committed=37MB)- Thread (reserved=36MB, committed=36MB)(thread #37)(stack: reserved=36MB, committed=36MB)- Code (reserved=246MB, committed=16MB)(malloc=2MB #3889)(mmap: reserved=244MB, committed=13MB)- GC (reserved=160MB, committed=148MB)(malloc=10MB #220)(mmap: reserved=150MB, committed=138MB)- Internal (reserved=266MB, committed=266MB)(malloc=266MB #10055)- Symbol (reserved=9MB, committed=9MB)(malloc=8MB #74324)(arena=2MB #1)- Native Memory Tracking (reserved=2MB, committed=2MB)(tracking overhead=2MB)
可以看到Internal部分由之前的10MB增大到了266MB
jvm.buffer.memory.used
http://localhost:8080/actuator/metrics/jvm.buffer.memory.used?tag=id:direct
{"name": "jvm.buffer.memory.used","description": "An estimate of the memory that the Java virtual machine is using for this buffer pool","baseUnit": "bytes","measurements": [{"statistic": "VALUE","value": 268476416}],"availableTags": []
}
可以看到jvm.buffer.memory.used的direct部分也变大了
小结
jvm的direct buffer可以通过springboot的jvm.buffer.memory.used?tag=id:direct来统计,也可以通过MNT的Internal部分反应出来。
doc
- 聊聊HotSpot VM的Native Memory Tracking
- 聊聊jvm的-XX:MaxDirectMemorySize
- 聊聊openjdk的BufferPoolMXBean
- 聊聊jvm的Code Cache
- 聊聊jvm的CompressedClassSpace
- 聊聊jvm的Stack Memory
- 聊聊jvm的StringTable及SymbolTable