NativeMemoryTracking与jstat堆内存统计差异原因及查询方法
为什么堆内存统计结果差异巨大?
两者的统计维度完全不同,这是正常现象:
jcmd VM.native_memory中的Java Heap committed统计的是JVM已经向操作系统申请并成功获取的堆内存总量,这部分是JVM堆的可用空间上限,不管有没有被实际分配给对象使用。你的输出里6.6GB就是JVM已经拿到手的堆内存,大部分处于空闲状态。jstat -gc计算的S0U+S1U+EU+OU是堆中当前被对象实际占用的内存大小,也就是真正在使用的堆内存,剩下的committed内存是空闲的,可供后续对象分配使用。
另外你用到的Apache Arrow和Netty Direct Buffers属于堆外内存,不在Java Heap统计范围内,所以本次差异和堆外内存无关。
如何查询当前实际使用的堆内存?
可以通过以下几种方式获取:
- 继续使用
jstat -gc:计算S0U(Survivor0区已用)+ S1U(Survivor1区已用)+ EU(Eden区已用)+ OU(Old区已用),结果就是当前堆内存实际使用量,你的例子中约400MB就是这个值。 - 执行
jmap -heap <pid>:输出堆的详细配置和使用情况,包括各个内存区域的已用、总大小,以及堆的初始(-Xms)和最大(-Xmx)配置。 - 执行
jcmd <pid> GC.heap_info:输出堆的简要统计信息,直接包含已用内存和提交的内存大小。 - 使用JDK自带图形化工具:如
jconsole或jvisualvm,连接到EC2上的JVM后,可实时查看堆内存的使用趋势、已用/空闲/提交的大小,更直观。
内容的提问来源于stack exchange,提问作者Somesh Dhal
相关产品推荐
相关产品推荐

