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

相关推荐
xbd_zc13 分钟前
【Linux Nano Vim快捷键大全】
linux·运维·vim
Mapleay32 分钟前
ubuntu 更新华为源
运维·服务器·ubuntu
shane-u1 小时前
Dockerfile实战:从零构建自定义CentOS镜像
linux·运维·centos
XiaoCCCcCCccCcccC1 小时前
Linux 的 UDP 网络编程 -- 回显服务器,翻译服务器
linux·网络·udp
风暴智能1 小时前
获取相机图像(ROS2)
linux·机器人·无人机
中国lanwp1 小时前
使用Maven和Ant上传文件到Linux服务器
linux·服务器·maven
孙克旭_1 小时前
day016-系统负载压力测试-磁盘管理
linux·运维·压力测试
liuyunluoxiao2 小时前
进程间通信--共享内存【Linux操作系统】
linux
qq_454175792 小时前
gcc/g++常用参数
linux·运维·服务器
sun0077003 小时前
windows 10 做服务器 其他电脑无法访问,怎么回事?
运维·服务器·网络