openjdk platform binary占内存_JVM 解剖公园(12): 本地内存跟踪

(给ImportNew加星标,提高Java技能)

编译:ImportNew/唐尤华

shipilev.net/jvm/anatomy-quarks/12-native-memory-tracking/

1. 写在前面

“JVM 解剖公园”是一个持续更新的系列迷你博客,阅读每篇文章一般需要5到10分钟。限于篇幅,仅对某个主题按照问题、测试、基准程序、观察结果深入讲解。因此,这里的数据和讨论可以当轶事看,不做写作风格、句法和语义错误、重复或一致性检查。如果选择采信文中内容,风险自负。

Aleksey Shipilёv,JVM 性能极客

推特 @shipilev

问题、评论、建议发送到 aleksey@shipilev.net"">aleksey@shipilev.net

2. 问题

有 512MB 可用内存,参数设为 -Xms512m -Xmx512m,为什么虚拟机会报告“内存不足无法继续”启动失败?

3. 理论

JVM 是本地应用程序,维持和存储内部数据结构需要占用内存,包括程序代码、生成的机器代码、堆元数据、类元数据、内部统计数据等等。这些没有包括在 Java 堆中,因为大多数是本地程序,用 C 语言在堆中申请或者通过 mmap 进行内存映射。JVM 做了很多工作,期望应用程序在长时间运行过程中能加载更多类、支持更多的生成代码。在内存受限的情况下,这些默认值对运行时间较短的应用显得过高。

从 OpenJDK 8 开始加入了一个很好的虚拟机内部特性,称为“本地内存跟踪(Native Memory Tracking NMT)”:监测所有虚拟机内部分配的内存,包括分类信息、内存分配者等等。对于理解虚拟机如何使用内存非常有价值。

配置 -XX:NativeMemoryTracking=summary 选项可以启用 NMT。可以使用 jcmd 转储当前 NMT 数据,也可以使用 -XX:+PrintNMTStatistics 在 JVM 中止时请求数据转储。加上 -XX:NativeMemoryTracking=detail 选项可以获取 mmap 内存映射和 malloc 回调。

大多数时候 summary 信息就足够了。当然也可以通过 detail 查看详细日志,了解由谁分配了内存以及用途,阅读虚拟机源代码,配合虚拟机不同选项查看带来的影响。以 “Hello World” 为例:

public class Hello {
    
public static void main(String... args) {
System.out.println("Hello");
}
}

很明显,在已分配的内存中 Java 堆占了很大一部分,让我们配置 -Xmx16m -Xms16m 查看具体使用情况:

Native Memory Tracking:
Total: reserved=1373921KB, committed=74953KB
- Java Heap (reserved=16384KB, committed=16384KB)
(mmap: reserved=16384KB, committed=16384KB)
- Class (reserved=1066093KB, committed=14189KB)
(classes #391)
(malloc=9325KB #148)
(mmap: reserved=1056768KB, committed=4864KB)
- Thread (reserved=19614KB, committed=19614KB)
(thread #19)
(stack: reserved=19532KB, committed=19532KB)
(malloc=59KB #105)
(arena=22KB #38)
- Code (reserved=249632KB, committed=2568KB)
(malloc=32KB #297)
(mmap: reserved=249600KB, committed=2536KB)
- GC (reserved=10991KB, committed=10991KB)
(malloc=10383KB #129)
(mmap: reserved=608KB, committed=608KB)
- Compiler (reserved=132KB, committed=132KB)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值