Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >高级技能包:JVM Non-Heap堆外内存跟踪监控的五种工具实践总结

高级技能包:JVM Non-Heap堆外内存跟踪监控的五种工具实践总结

作者头像
用户9421738
发布于 2025-06-15 03:25:52
发布于 2025-06-15 03:25:52
25000
代码可运行
举报
文章被收录于专栏:大数据从业者大数据从业者
运行总次数:0
代码可运行

前言

前几天写过一篇关于排查Flink写ES作业堆外内存OOM故障分析的文章,其中提到堆外内存的跟踪监控方法,有朋友微信联系咨询相关技术。本文总结了大数据场景经常遇到的堆外内存溢出用到的五种常用跟踪监控方法的实践记录,希望能够帮助开发者诊断和优化JVM 内存性能。

Native Memory Tracking

本地内存跟踪(Native Memory Tracking,NMT)就是JVM支持的特性参数-XX:NativeMemoryTracking,可选值为off|sumary|detail,默认值为off。开启方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ java -XX:NativeMemoryTracking=summary -Xms300m -Xmx300m -XX:+UseG1GC -jar app.jar

查找上述进程pid,然后通过jcmd命令跟踪该进程堆外内存情况:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ jcmd <pid> VM.native_memory

如图所示为部分监控项内容,其中,Internal对应的就是DirectMemory占用的内存,可以通过-XX:MaxDirectMemorySize限制其上限值。

图片
图片

JConsole

jconsole是符合JMX规范的监控工具,无需额外安装,仅需JDK即可使用,支持实时监控内存、线程、CPU 消耗及 MBeans 等信息。要运行 jconsole,请从 JDK 的 bin 文件夹中执行以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<JDK_PATH>\bin\jconsole

在启动界面选择本地或远程 Java 进程,如图所示:

图片
图片

在“Memory”选项卡中选择“Non-Heap Memory Usage”图表,实时查看非堆内存使用趋势,如图所示:

图片
图片

VisualVM

VisualVM 是功能更强大的可视化 JVM 监控工具,支持 CPU 负载、内存使用、线程活动监控及堆转储分析,还可通过插件扩展功能。在 VisualVM 的“Monitor”选项卡中,可直接查看Metaspace(元空间)的大小,如图所示:

图片
图片

若需监控其他非堆区域,需安装插件,插件地址如下:

https://visualvm.github.io/plugins.html

安装MBeans插件后,在“MBeans”选项卡中可查看整体及特定非堆内存区域的使用情况,如图所示:

图片
图片

安装Buffer Monitor插件后,在“Buffer Pools”选项卡中可查看直接缓冲区(Direct Buffer)和内存映射文件的使用情况,如图所示:

图片
图片

JMC

JMC,即Java Mission Control,是专业JVM监控与诊断工具,支持性能分析、内存监控、线程检查及垃圾回收行为分析,还可通过飞行记录(Flight Recording)深入追踪内存问题。

连接应用的 MBean Server 后,在“MBeans Browser”中可查看非堆内存总占用(不包含直接缓冲区),如图所示:

图片
图片

在“BufferPool”组中可查看直接缓冲区的使用情况,如图所示:

图片
图片

从Java 20开始,可通过JFR持续记录NMT数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -XX:NativeMemoryTracking=detail -XX:StartFlightRecording=name=Profiling,filename=nmt-recording.jfr,settings=profile -jar path/ourapp.jar

使用JMC打开飞行记录文件后,在“Event Browser”中可查看Total Native Memory Usage:包含堆和非堆的总提交内存,如图所示:

图片
图片

也可以查看Native Memory Usage Per Type:非堆内存各类型的详细占用情况,如图所示:

图片
图片

JMX-DExporter

JMX-DExporter是一款以与Prometheus兼容的格式公开JMX指标的工具。可以收集JVM指标,例如内存使用情况、线程活动、垃圾回收统计信息等。需要下载JAR包,设置配置文件 jmx_exporter_config.yml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jmx_exporter_config.yml:
startDelaySeconds: 0
lowercaseOutputName: true
lowercaseOutputLabelNames: true

rules:
  - pattern: "java.lang:type=Memory"
    name: "jvm_memory_usage_bytes"
    labels:
      area: "$2"
type: GAUGE

启动进程即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -javaagent:.path-to-agent-jar\jmx_prometheus_javaagent.jar=port:path-to-agent-jar\jmx_exporter_config.yml -jar .path-to-app\app.jar

然后,修改Prometheus配置文件prometheus.yml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scrape_configs:
  - job_name: "our_app"
    static_configs:
      - targets: ["localhost:port"]

重启Prometheus,即可查看采集到的内存信息,如图所示:

图片
图片

总结

本文介绍五种JVM非堆内存监控工具,适用于不同场景:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
简单场景:若只需基础监控,使用jcmd或jconsole。
深度分析:若需详细持续监控特定内存类型,使用VisualVM插件或JMC。
云原生集成:若需将监控纳入Prometheus,JMX-DExporter是最佳选择。

注意:所有工具均会产生额外资源消耗,需根据实际场景评估性能影响,合理选择监控粒度和工具组合。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据从业者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【JAVA】如何监控和诊断JVM堆内和堆外内存使用?
在上一篇博文:【JAVA】JVM 内存区域的划分 中介绍了 JVM 内存区域的划分,总结了相关的一些概念,本博文将结合 JVM 参数、工具等方面,进一步分析 JVM 内存结构,包括外部资料相对较少的堆外部分。
sidiot
2023/08/31
2.5K0
【JAVA】如何监控和诊断JVM堆内和堆外内存使用?
JVM堆外内存问题排查
JVM 堆内存一般分析的比较多,本篇谈谈堆外内存问题排查,通常我们需要排查堆外内存的原因是系统整个内存使用飙高,但是堆内内存使用正常。这时候就需要分析堆外内存了
方丈的寺院
2019/08/05
5.9K0
一次完整的JVM堆外内存泄漏故障排查记录
记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些「JVM内存分配的原理分析」以及「常用的JVM问题排查手段和工具分享」,希望对大家有所帮助。
Rude3Knife的公众号
2020/08/28
5.1K0
一次完整的JVM堆外内存泄漏故障排查记录
【JVM进阶之路】九:性能监控工具-可视化工具篇
在前面已经学习了JVM性能监控的命令行工具,接下来学习JVM性能监控的命令行工具,通过可视化工具可以更直观地监控JVM性能、处理JVM相关问题。
三分恶
2021/04/13
1.5K0
内存异常-JVM内存故障排查方法
系统的故障诊断是一个一步一步排除可能疑点最后找到问题所在的过程。今天测者和你一起学习JVM内存的故障排查方法。
Criss@陈磊
2019/08/02
2K0
内存泄漏排查攻略之:Show me your Memory
java 语言有个神奇的地方,那就是你时不时会去关注下内存。(当然了,任何牛逼的同学都应该关注内存)
烂猪皮
2021/04/07
1.1K0
内存泄漏排查攻略之:Show me your Memory
JVM 本地内存跟踪(Native Memory Tracking in JVM)
翻译:https://www.baeldung.com/native-memory-tracking-in-jvm
崔认知
2025/07/31
1900
JVM 本地内存跟踪(Native Memory Tracking in JVM)
干货 | 高效线上问题排查——套路化和工具化
线上问题排查相比于coding,是一个低频的工作,很多人不会经常遇到。一旦需要进行问题排查的时候,往往是重要且紧急的,因此问题排查的效率,就显得尤为重要。有些线上问题,比较直观,比如磁盘使用率高、网络流量高这种,借助合适的工具很快能定位到原因;但对于一些复杂的问题,如系统Load高、RSS占用高、内存溢出等,需要结合多方面的数据才能定位到原因。这时候,需要有正确的解题思路,并辅以合适的工具,才能高效地解决问题。
携程技术
2021/08/13
1.3K0
6 款 Java 8 自带工具,轻松分析定位 JVM 问题!
这篇文章中介绍下如何使用 JDK 自带工具来分析和定位 Java 程序的问题。 使用 JDK 自带工具查看 JVM 情况 JDK 自带了很多命令行甚至是图形界面工具,帮助我们查看 JVM 的一些信息。比如,在我的机器上运行 ls 命令,可以看到 JDK 8 提供了非常多的工具或程序: 图片 接下来,我会与你介绍些常用的监控工具。你也可以先通过下面这张图了解下各种工具的基本作用: 图片 为了测试这些工具,我们先来写一段代码:启动 10 个死循环的线程,每个线程分配一个 10MB 左右的字符串,然后休眠 1
程序猿DD
2022/03/14
7020
解读 Java 云原生实践中的内存问题(必看)
Java 凭借着自身活跃的开源社区和完善的生态优势,在过去的二十几年一直是最受欢迎的编程语言之一。步入云原生时代,蓬勃发展的云原生技术释放云计算红利,推动业务进行云原生化改造,加速企业数字化转型。
用户1107783
2023/12/11
6800
解读 Java 云原生实践中的内存问题(必看)
JVM-监控及诊断工具
ps(Java Process Status):显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息),可用于查询正在运行的虚拟机进程。
才疏学浅的木子
2023/10/17
7810
JVM-监控及诊断工具
JVM性能监控工具推荐
随着现代应用程序的复杂性不断增加,Java应用程序的性能监控和分析变得尤为重要。JVM性能监控工具是我们的得力助手,它们可以帮助我们追踪内存使用、线程情况、垃圾回收等关键指标,从而更好地了解应用程序的健康状况。本文将介绍一些常用的JVM性能监控工具,并详细展示它们的用法,以便帮助你更好地监控和优化Java应用程序。
疯狂的KK
2023/09/25
1.6K0
JVM性能监控工具推荐
JVM 问题排查和性能优化常用的 JDK 工具
JDK 提供了一系列用于监控、诊断 Java 进程的工具,它们在 JDK 安装目录的 bin 目录下,有 jps、jcmd、jstack、jinfo、jmap 等。其中jmc、jconsole、jvisualvm 是 GUI 工具,其他大部分都是命令行工具。
古时的风筝
2019/11/26
1.4K0
【干货】JVM 优化、内存泄露排查、gc.log 分析方法等
本文讲解了 JVM 的内存划分和分配策略,并以截图和脚本展示常用可视化和命令行工具的使用方法,完整演示了 JVM 优化、内存泄露排查、gc.log 分析方法等。
IT技术小咖
2019/06/26
5.9K0
【干货】JVM 优化、内存泄露排查、gc.log 分析方法等
排查Java的内存问题
核心要点 排查Java的内存问题可能会非常困难,但是正确的方法和适当的工具能够极大地简化这一过程; Java HotSpot JVM会报告各种OutOfMemoryError信息,清晰地理解这些错误信息非常重要,在我们的工具箱中有各种诊断和排查问题的工具,它们能够帮助我们诊断并找到这些问题的根本原因; 在本文中,我们会介绍各种诊断工具,在解决内存问题的时候,它们是非常有用的,包括: HeapDumpOnOutOfMemoryError和PrintClassHistogram JVM选项 Eclipse MA
用户1263954
2018/04/08
3K0
排查Java的内存问题
JVM活学活用——调优工具
概述  ----   工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题,长长可以到达事半功倍的效果来。   jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具。jdk自带工具一般在jdk bin目录下面,以exe的形式直接点击就可以使用,其中包含分析工具已经很强大,几乎涉及了方方面面,但是我们最常使用的只有两款:jconsole
Janti
2018/04/10
1K0
JVM活学活用——调优工具
Java堆外内存排查小结
这几天遇到一个比较奇怪的问题,觉得有必要和大家分享一下。我们的一个服务,运行在docker上,在某个版本之后,占用的内存开始增长,直到docker分配的内存上限,但是并不会OOM。版本的更改如下:
xjjdog
2019/09/24
5K0
Java堆外内存排查小结
jvm系列(七):jvm调优-工具篇
16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化。工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题,长长可以到达事半功倍的效果来。 jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具。jdk自带工具一般在jdk bin目录下面,以exe的形
纯洁的微笑
2018/04/19
1.5K0
jvm系列(七):jvm调优-工具篇
JDK自带工具介绍
VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。在JDK_HOME/bin(默认是C:\Program Files\Java\jdk1.6.0_13\bin)目录下面,有一个jvisualvm.exe文件,双击打开,从UI上来看,这个软件是基于NetBeans开发的了。
朝雨忆轻尘
2019/06/19
2.6K0
JDK自带工具介绍
Java 程序该怎么优化?工具篇
工欲善其事必先利其器,为你呈上一箩筐性能优化工具,必有一款满足你,废话不多说,直奔主题。
一猿小讲
2020/03/26
1.1K0
相关推荐
【JAVA】如何监控和诊断JVM堆内和堆外内存使用?
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档