0

0

怎么使用VisualVM监控Java进程_CPU、内存、GC与线程池实时图形化分析

P粉602998670

P粉602998670

发布时间:2026-03-12 11:24:40

|

527人浏览过

|

来源于php中文网

原创

visualvm连不上本地java进程主因是jps不可用或tools.jar缺失(jdk9+需用自带jvisualvm);远程监控须配全jmx参数,尤其-djava.rmi.server.hostname;内存泄漏看classes/instances曲线同步上涨;线程问题结合thread dump与cpu采样定位。

怎么使用visualvm监控java进程_cpu、内存、gc与线程池实时图形化分析

VisualVM 连不上本地 Java 进程?先查 jpstools.jar 是否就位

VisualVM 启动后空白,看不到任何本地进程——这不是软件坏了,而是它根本没拿到进程列表。核心原因只有两个:jps 命令不可用,或 JDK 版本不匹配导致 tools.jar 缺失(JDK 9+ 已移除该 jar,改用模块化方式提供)。

  • JDK 8 及以下:确认 $JAVA_HOME/lib/tools.jar 存在,且 VisualVM 启动时能加载到它(通常随 JDK 自带的 VisualVM 没问题;独立下载的需手动配置 -J-Djava.ext.dirs=...
  • JDK 9+:必须使用 JDK 自带的 VisualVM(路径如 $JAVA_HOME/bin/jvisualvm),独立版默认不兼容;若硬要用独立版,得搭配 visualvm-jmx 插件 + 手动开启 JMX(见下一条)
  • Linux/macOS 下 jps 不显示进程?检查是否以同一用户运行;Windows 上杀毒软件可能拦截 jps 的本地 socket 通信

远程监控 Java 应用必须开 JMX,但别裸奔 -Dcom.sun.management.jmxremote

远程连接失败,90% 出在 JMX 配置漏项或权限放得太宽。VisualVM 通过 JMX 协议拉取数据,但 JDK 默认关闭远程 JMX,且旧式参数组合极易被拒绝连接或认证失败。

  • 必须启用的最小参数集(JDK 8u191+ / JDK 11+):
    -Dcom.sun.management.jmxremote
    -Dcom.sun.management.jmxremote.port=9999
    -Dcom.sun.management.jmxremote.authenticate=false
    -Dcom.sun.management.jmxremote.ssl=false
    -Djava.rmi.server.hostname=你的服务器IP
  • -Djava.rmi.server.hostname 是关键:缺了它,RMI 注册会返回 localhost,VisualVM 连过去却连不到真实地址,报错 Connection refused 或卡在“Connecting...”
  • 生产环境禁用 authenticate=false;真要开认证,得配 jmxremote.passwordjmxremote.access 文件,且文件权限必须是 600(否则 JDK 直接忽略)

内存泄漏看 ClassesInstances 曲线,别只盯堆内存数字

堆内存曲线缓慢上涨 ≠ 内存泄漏;真正可疑的是类加载数持续增加、或某类实例数长期不降。VisualVM 的“监视”页堆内存图太笼统,容易误判。

智川X-Agent
智川X-Agent

中科闻歌推出的一站式AI智能体开发平台

下载
  • 打开 Monitor 标签页,重点观察三条线:Loaded Classes(红色)、Instances(蓝色)、Used Heap(绿色)——三者同步涨,大概率是类加载器泄漏(如热部署、OSGi、自定义 ClassLoader 未释放)
  • 右键进程 → “Heap Dump”,生成快照后用“Classes”视图按实例数排序,找异常多的类(比如 byte[]HashMap$Node、或你自己的业务类);点进去看“References to GC Roots”,看谁在强引用它
  • 注意:频繁 Full GC 但堆内存没明显上涨?可能是元空间(Metaspace)满,去“VM Summary”里查 Metaspace Usage,不是堆内存那块

线程池积压看 Threads 实时堆栈 + Sampler 抓热点方法

线程数飙升、CPU 高,但 Threads 标签页只显示“RUNNABLE”一堆线程,看不出哪段代码卡住——这时候不能只刷线程列表,得结合采样和堆栈定位。

立即学习Java免费学习笔记(深入)”;

  • Threads 标签 → 点“Thread Dump”按钮,立刻抓当前快照;反复点几次,对比哪些线程总在同一个方法(如 SocketInputStream.readLinkedBlockingQueue.take)停着
  • 切到 Sampler 标签 → 点“CPU”开始采样 10–20 秒 → 查“Hot Spots”表格,排第一的方法就是实际耗 CPU 最多的;如果全是 Unsafe.parkObject.wait,说明线程在等锁或队列,再回线程堆栈找持有锁者
  • 线程池任务堆积?看 Executor 相关 MBean(需插件或 JMX 显式暴露);没暴露的话,直接 dump 线程,搜 ThreadPoolExecutor 关键字,看 workQueue.size() 在堆栈里有没有泄露出来
VisualVM 的图形化很直观,但真正难的是把曲线变化对应到具体类、方法、甚至 GC Roots 引用链。很多人卡在“看到异常曲线”和“定位到代码行”之间——这中间差的不是工具,是每次 dump 后多点两下“Merge”、“Show in Instances View”、“Go to Source”的习惯。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

99

2025.12.01

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1496

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1170

2023.07.27

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.1万人学习

Java 教程
Java 教程

共578课时 | 80.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号