JConsole 在 Linux 上的使用

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 性能。

相关推荐
jim写博客17 分钟前
linux进程概念(三)进程状态
linux·运维·服务器
维尔切1 小时前
Linux中ssh远程登录原理与配置
android·linux·ssh
jc06201 小时前
Linux c网络专栏第四章io_uring
linux·运维·服务器
大萌神Nagato1 小时前
如何修改VM虚拟机中的ip
linux·开发语言·ip·虚拟机·静态ip
吻等离子2 小时前
Linux ARM 平台 C 语言操作 Excel 文件的常用库与工具汇总(支持 xls 和 xlsx)
linux·c语言·arm开发
2401_858286112 小时前
OSE1.【Linux】练习题组1
linux·运维·服务器
维尔切2 小时前
Linux初学者在CentOS 7虚拟机中rpm、yum、dnf的操作练习
linux·运维·centos
liweiweili1263 小时前
在 Linux 中,定时任务(cron)
linux·运维·服务器
星期天要睡觉3 小时前
Linux零基础Shell教学全集(可用于日常查询语句,目录清晰,内容详细)(自学尚硅谷B站shell课程后的万字学习笔记,附课程链接)
linux·运维·shell
夕泠爱吃糖3 小时前
Linux虚拟内存
linux·运维·服务器