JConsole 在 Linux 上的使用指南
1. 启动 JConsole 远程监控 Linux 服务器上的 JVM 进程
1.1 修改 JMX 配置,允许远程访问
在 Linux 服务器 启动 Java 应用时,需要加上 -Djava.rmi.server.hostname=<服务器IP>
,完整的启动参数如下:
bash
java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9010 \
-Dcom.sun.management.jmxremote.rmi.port=9010 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=你的服务器IP \
-jar your-app.jar
参数说明:
-Djava.rmi.server.hostname=你的服务器IP
:指定 JMX 监听的 IP 地址,必须是服务器的外网/内网 IP,否则无法远程连接。-Dcom.sun.management.jmxremote.rmi.port=9010
:显式指定 RMI 端口,避免 RMI 端口随机化。
1.2 允许防火墙放行端口
如果你的服务器有 防火墙 ,需要放行 9010
端口:
bash
# Ubuntu/Debian
sudo ufw allow 9010
# CentOS
sudo firewall-cmd --add-port=9010/tcp --permanent
sudo firewall-cmd --reload
1.3 在本地 Windows/Mac 连接
在 本地电脑(Windows/Mac) 上运行:
bash
jconsole 你的服务器IP:9010
如果 JMX 正常工作,你会看到 Java 进程的监控界面。
1.4 使用 SSH 端口转发(更安全)
如果你不想直接暴露 9010
端口,可以使用 SSH 端口转发:
bash
ssh -L 9010:localhost:9010 user@你的服务器IP
然后在本地运行:
bash
jconsole localhost:9010
这样,远程服务器的 9010
端口被映射到本地,避免安全风险。
最后结果如下:
2. JConsole 监控的 JVM 指标和图表
JConsole 连接 Java 进程后,会展示 JVM 运行状态的多个图表和指标,主要包括以下几个部分:
2.1 概述(Overview)
- CPU 使用率(折线图)
- 线程(Threads) 数量变化
- 堆内存(Heap Memory Usage)(折线图)
- 类加载(Classes) 统计
2.2 内存(Memory)
- 堆(Heap)
- Eden Space(伊甸区):新对象存放,GC 频繁。
- Survivor Space(幸存者区):存活的对象从 Eden 复制到这里。
- Old Gen(老年代):长期存活的对象存放区域。
- 非堆(Non-Heap)
- Metaspace(元空间):存放类元数据。
- Code Cache(代码缓存区):存储 JIT 编译后的本地代码。

2.3 线程(Threads)
- 线程状态统计
- 线程堆栈(Thread Dump)

2.4 GC(Garbage Collection)
- GC 次数和耗时 (折线图)
- Minor GC(年轻代 GC)
- Major GC / Full GC(老年代 GC)
3. JDK 11 的 JVM 内存结构
3.1 堆(Heap)
- 年轻代(Young Gen)
- Eden 区:新对象存放,触发 Minor GC。
- Survivor 区(S0/S1):存活对象从 Eden 复制到 Survivor 区。
- 老年代(Old Gen)
- 存放长期存活的对象,触发 Full GC。
3.2 非堆(Non-Heap)
- Metaspace(元空间):JDK 8 移除了永久代(PermGen),改用 Metaspace 存放类元数据。
- Code Cache(代码缓存区):存放 JIT 编译后的机器码。
3.3 线程栈(Thread Stack)
- 栈帧(Stack Frame):存放方法调用的局部变量、操作数栈等。
- 本地方法栈(Native Stack):存放 JNI 方法。
3.4 直接内存(Direct Memory)
- 由
ByteBuffer.allocateDirect()
申请,避免堆内存复制,提高 IO 性能。