理解JAVA中的Native内存追踪(NMT)机制

JVM 具有多个内部内存区域。本机内存(native)跟踪 (NMT) 通过提供每个内存区域的详细信息,帮助 Java 开发人员识别这些内部内存区域上的内存泄漏、内存过度使用和其他相关问题。在本文中,让我们学习如何使用 NMT 来解决与 JVM 内存相关的问题。

什么是本机内存(native)跟踪 (NMT)?

图:JVM 内存区域
JVM 内存具有以下内部区域:

  • 堆内存(年轻代、老一代)
  • 元空间
  • 线程
  • 代码缓存
  • 直接缓冲
  • GC
  • JNI
  • NMT
  • 其它

如果您有兴趣的话呢,可以观看此视频片段来了解有关这些JVM 内部内存区域的更多信息。

NMT 是 Java 虚拟机 (JVM) 的一项功能,可跟踪和报告所有 JVM 内存区域的使用情况。通过启用 NMT,开发人员可以获得有关每个内存区域的以下见解:

  1. 当前分配的内存大小是多少?
  2. 当前使用的内存大小是多少?
  3. 其他信息(例如活动加载类数、线程数)

使用 NMT 的好处

NMT 主要用于识别本机内存区域中的内存泄漏。通过分析 NMT 数据,我们可以隔离本机内存中哪个区域始终在增长且未被释放。这将有助于隔离 OutOfMemoryError 的根本原因。

垃圾收集日志(GC log)和 NMT 有什么区别?
垃圾收集日志包含有关 Java 堆空间(即年轻代、老一代)和元空间使用情况以及垃圾收集指标(运行时间、每次 GC 事件运行的时间、每次 GC 事件后恢复的内存量……)的最详细信息。但是,它不包含有关本机内存区域的详细信息。
另一方面,NMT 仅包含有关本机内存区域大小的详细信息。

何时使用垃圾收集日志(GC log)和 NMT?
如果您尝试优化垃圾收集性能或排除 Java 堆空间或元空间中的内存泄漏故障,则需要使用 GC 日志。
如果您尝试隔离本机内存区域中的内存泄漏,则需要使用 NMT 数据。

如何启用 NMT

JVM 默认不启用 NMT,因此您需要明确启用它。您可以通过将 -XX:NativeMemoryTracking 选项以摘要或详细信息级别传递给 JVM 来启用 NMT。摘要级别提供高级概述,而详细信息级别提供更详细的信息。

java -XX:NativeMemoryTracking=summary -jar YourApplication.jar

或查看详细追踪:

java -XX:NativeMemoryTracking=detail -jar YourApplication.jar

捕获 NMT 数据

启用 NMT 后,您可以通过多种方式捕获和分析本机内存使用情况数据:

1.使用jcmd

jcmd 实用程序是 JDK 附带的一个功能强大的工具。您可以使用它从正在运行的 JVM 请求各种诊断信息,包括 NMT 统计信息。

jcmd <pid> VM.native_memory summary > nmt_report.txt

或了解详细信息:

jcmd <pid> VM.native_memory detail > nmt_report.txt

将 替换为您正在运行的 Java 应用程序的进程 ID。

2. 定期捕获数据

对于长时间运行的应用程序,定期捕获 NMT 数据可能会很有用。这可以通过设置 cron 作业或定期运行 jcmd 命令的计划任务来实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

国通快递驿站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值