聊聊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

相关推荐
淡海水4 小时前
01-07-运行时-GC深度剖析-内存分配回收与结构选择
jvm·windows·unity·gc
2602_959960927 小时前
电商大厂Java面试:从Spring Boot、JPA、微服务到Redis、Kafka、Spring Security与监控,谢飞机的爆笑三轮问答
java·jvm·spring boot·redis·面试题
一水8 小时前
AI 时代审查思维:审查第一篇
java·jvm·数据库·spring
それども15 小时前
JVM MetaspaceSize 参数作用
jvm
java_upp1 天前
JVM内存溢出和内存泄漏的区别及排查方法
jvm·内存泄漏·内存溢出
城管不管1 天前
MySQL 慢查询完整排查
java·服务器·jvm·数据库·mysql·spring·面试
mister_guo2 天前
JVM 内存管理原理及生产配置实战:从“参数能启动”到“内存可控”
java·jvm
名字还没想好☜3 天前
Go 的 strings.Builder 实战:拼接性能、Grow 预分配与何时该用 bytes.Buffer
java·jvm·后端·golang·go
wear工程师3 天前
Java 类初始化到底何时触发?别把加载、连接和 static 执行混在一起
java·jvm
程序员雷欧3 天前
线上频繁触发各种 GC 的原因排查与处理指南
java·jvm·算法