JVM本地内存追踪中malloc与mmap内存大小含义问询
JVM本地内存追踪(NMT)中malloc与mmap字段的说明
核心结论
你猜的没错——NMT里的malloc和mmap确实对应JVM底层调用的内核内存分配函数,二者共同构成了JVM的全部本地已提交内存。
各字段详细解释
malloc: 69218KB #667376
这行统计的是JVM通过malloc()/calloc()/realloc()等内核函数分配的已提交本地内存总和,后面的#667376是累计的分配操作次数。这类内存多用于小块、零散的内存需求,比如:- JVM内部的小元数据对象、辅助数据结构
- JNI调用时的临时内存块
- 类加载过程中部分小内存分配(比如你示例里Class类别下的malloc部分)
- 线程栈的部分零散分配(依JVM实现而定)
mmap: reserved=1674952KB, committed=330528KB
这部分统计的是JVM通过mmap()内核函数申请的内存,分为两个状态:reserved:仅向操作系统申请了一段虚拟地址空间,未占用实际物理/交换内存,只是占位用,不会消耗系统资源。committed:已经从操作系统实际获取的内存,对应真实的物理内存或交换空间,是实际被使用的部分。
mmap多用于大块、连续的内存分配,比如:- Java堆的完整分配(你的示例里Heap完全基于mmap实现)
- 元数据区(Metadata)、类空间(Class space)的预留与提交
- 大对象的内存分配
总已提交内存的计算逻辑
你观察到的malloc大小 + mmap已提交大小 = 总已提交内存是完全合理的——JVM的所有本地内存分配只会通过这两种内核途径:小块零散内存用malloc,大块连续内存用mmap。所以总已提交内存就是这两部分的总和,对应你示例里的69218KB + 330528KB = 399746KB。
你提供的NMT报告示例
Native Memory Tracking: (Omitting categories weighting less than 1KB) Total: reserved=1744170KB, committed=399746KB malloc: 69218KB #667376 mmap: reserved=1674952KB, committed=330528KB - Java Heap (reserved=131072KB, committed=131072KB) (mmap: reserved=131072KB, committed=131072KB) - Class (reserved=1050819KB, committed=16515KB) (classes #23646) ( instance classes #22064, array classes #1582) (malloc=2243KB #51615) (mmap: reserved=1048576KB, committed=14272KB) ( Metadata: ) ( reserved=131072KB, committed=92160KB) ( used=91882KB) ( waste=278KB =0.30%) ( Class space:) ( reserved=1048576KB, committed=14272KB) ( used=13897KB) ( waste=375KB =2.63%)
内容的提问来源于stack exchange,提问作者Jakub Zilinek
相关产品推荐
相关产品推荐

