一、背景

某XX生产环境,内存使用率总是居高不下,怀疑是内存溢出,现使用visualVM对其进行内存与线程分析,并反馈给研发部门。

二、jvisualvm

image-20250313155207499

jVisualVM 是 Oracle 提供的免费 Java 监控和性能分析工具,内置于 JDK 中(JDK 1.6+ 至 JDK 8,JDK9以上不再自带visualVM,需要手动安装)。以下是它的主要功能、应用场景和示例说明:

2.1核心功能:

  1. 实时监控
    • 资源消耗:动态展示堆内存、CPU 使用率、类加载数量、线程数等。
    • 线程状态:实时查看线程运行/阻塞/等待状态,标注死锁。
    • JVM 参数:显示启动参数、系统属性、垃圾回收策略等。
  2. 内存与线程分析
    • Heap Dump:生成堆快照,分析对象数量及内存占用(如 java.lang.String 实例占比)。
    • Thread Dump:捕捉线程堆栈,定位死锁(直接标记阻塞的线程及代码位置)。
  3. 性能分析(Profiling)
    • CPU Profiler:统计方法执行时间,识别热点方法(如频繁调用的算法)。
    • 内存 Profiler:追踪对象分配,发现内存泄漏(如未释放的集合缓存)。
  4. 远程与多JVM管理
    • 通过 JMX 或 jstatd 监控远程服务器 JVM(需配置 -Dcom.sun.management.jmxremote)。
    • 批量管理本地/远程 Java 进程,支持强制结束无响应应用。
  5. 可视化工具
    • 图表化展示 CPU/内存趋势,对比不同时间点的堆快照(如修复内存泄漏后的内存变化)。
  6. 插件扩展
    • Visual GC:动态展示各代内存(Eden/Survivor/Old Gen)的垃圾回收状态。
    • BTrace:动态注入诊断代码(如记录方法入参/返回值)。

2.2访问方式

  • 访问本地 JVM 【调试开发环境或本地运行的 Java 应用】

  • 访问远程 JVM 【监控生产环境或服务器上的 Java 应用】

    • 通过 JMX 连接
    • 通过 jstatd 连接
    • 通过 SSH 隧道,X11 转发 连接

2.2访问远程 JVM方式对比

方式 功能完整性 安全性 配置复杂度 适用场景
JMX 完整 中(需手动加固) 生产环境(需远程深入分析)
jstatd 基础监控 低(RMI 明文传输) 快速查看基础指标
SSH + X11 完整 高(加密隧道) 低(需 GUI 支持) 服务器无端口开放但允许 SSH + GUI

三、环境信息

IP地址 jdk版本 系统版本
172.22.33.20 jdk8 openeuler 22.03 LTS SP4

四、安装所需软件包

用于 SSH 的 X11 转发

yum install  xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Type1 xclock xterm -y

修改配置文件,支持X11 转发

  • [root@openeuler ~]# vim /etc/ssh/sshd_config
AllowTcpForwarding yes
X11Forwarding yes
X11UseLocalhost no

image-20250313102807190

  • sshd 检测配置文件,是否正确
[root@openeuler ~]# sshd -t
  • 重启ssh
[root@openeuler ~]# systemctl restart sshd

五、通过X11隧道的方式使用Xshell+Xmanager打开jvisualvm

  • 创建一个会话

image-20250313152323995

  • 隧道,X11 转移,选择转发到X DISPLAY localhost:0.0

image-20250313152445111

  • 打开xmanger 软件,保持后台运行

image-20250313153112894

  • 测试打开一个xclock, 观察能不能打开一个图形化的钟出来

image-20250313152820346

  • 使用jvisualvm

image-20250313153326907

image-20250313153426711

六、通过X11隧道的方式使用MobaXterm上打开jvisualvm

  • 创建一个会话

image-20250313153906093

  • X11 保持默认配置即可

image-20250313154308722

  • 测试打开一个xclock, 观察能不能打开一个图形化的钟出来

image-20250313154341152

  • 使用jvisualvm

image-20250313153426711

七、高版本jdk使用jvisualvm

7.1 下载jvisualvm

  • 下载地址: https://visualvm.github.io/

下载最新的就好,下载完了之后,解压到服务器上

7.2 修改配置文件指定JDK 路径

image-20250313161453024

visualvm_jdkhome="/home/application/jdk-11.0.22"

7.3 运行 jvisualvm

image-20250313161642000

[root@openeuler ~]# /root/visualvm_2110/bin/visualvm

image-20250313161745004

八、jvisualvm 定位问题

参考下面的👇的文章:

  • https://blog.csdn.net/zuozewei/article/details/141724179
  • https://zhuanlan.zhihu.com/p/685289577