自学内容网 自学内容网

理解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 命令的计划任务来实现。


原文地址:https://blog.csdn.net/zypqqgc/article/details/142410374

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!