JConsole-的使用


一、简介

JConsole 是一种 Java 监控和管理控制台工具,可以用于监视 Java 虚拟机(JVM)的性能和资源利用情况。它提供了一种图形化界面,可以实时查看 JVM 的运行状态、内存使用情况、线程活动、垃圾回收等信息,以及执行一些管理操作。

使用 JConsole 可以帮助开发人员和系统管理员进行性能调优、内存泄漏排查和故障诊断,从而提高应用程序的可靠性和性能。

在这里插入图片描述

总之,JConsole 是一个强大的 Java 监控和管理工具,可以帮助开发人员和系统管理员实时监控和管理 Java 应用程序的性能和资源利用情况。


二、使用

如果你没有安装 JDK ,可参见博客:

下面是 JConsole 的使用步骤:

  1. 启动 JConsole:JConsole 是包含在 JDK 中的一个工具,因此首先要确保已经安装了 JDK。然后,在命令行中输入 jconsole 命令或者双击 jconsole.exe 启动 JConsole 。

  2. 连接到 Java 进程:启动 JConsole后,会弹出一个界面,显示所有正在运行的 Java 进程。选择要监控的 Java 进程,并点击 连接 按钮。

  3. 监控 JVM:连接成功后,JConsole 提供了多个选项卡,用于监控各种 JVM 资源。常用的选项卡包括:

    • 概览(Overview):显示 JVM 的概览信息,如内存使用情况、线程数、类加载器信息等。

    • 内存(Memory):显示 JVM 的内存使用情况,包括堆内存、非堆内存、内存池等。

    • 线程(Threads):显示 JVM 中的线程活动情况,包括线程数、线程状态、死锁等。

    • 类(Classes):显示 JVM 加载的类信息,包括已加载类的数量、被卸载的类数量等。

    • VM 概要(VM Summary):显示JVM的基本信息,如 JVM 的启动参数、命令行参数等。

    • MBean:显示了所有在 platform. MBeanserver 上注册的 MBeans 的信息。

    • 执行操作:除了监控功能外,JConsole 还可以执行一些管理操作。例如,可以通过 JConsole 执行垃圾回收、线程Dump、线程死锁检测等操作。

这些操作可以通过点击相应的按钮执行。


2.1 启动 JConsole

在 windows 下我们可以直接找到 JDK 的所在目录,去 /bin 目录下找到 jconsole.exe 双击运行即可

在这里插入图片描述

如果你正确的配置好 Java 环境的话,win + R 打开 命令提示符 窗口,输入 jconsole 命令也是能打开的

在这里插入图片描述


2.2 连接到 Java 进程

启动之后可以看到界面上有两个选择,一个是 本地进程 ,另一个是 远程进程

  • 本地进程:相对于开启 JConsole 的计算机,无需设置任何参数就可以被本地开启的 JConsole 连接(Java SE 6 之后无需设置,之前还要设置运行时参数 -Dcom.sun.management.jmxremote
  • 远程进程:输入远程连接地址,格式是 ip:port(注意 port 是监听端口不是服务端口)和用户名、口令(如果需要)即可连接进入监听界面。

2.2.1 本地连接

在这里插入图片描述

在本地进程中会展示出当前计算机所有正在运行的 Java 程序,只需选中双击进入,再点击 不安全的连接

在这里插入图片描述

即可进入到监听界面

在这里插入图片描述


2.2.2 远程连接

远程连接要到服务器上,加入以下启动参数之后,重启项目

# 远程服务器ip,即本机ip,不建议用 localhost、127.0.0.1
-Djava.rmi.server.hostname=XXX.XXX.XXX.XXX 
# 允许 JMX 远程调用
-Dcom.sun.management.jmxremote
# 自定义 JMX 端口号
-Dcom.sun.management.jmxremote.port=8899
# 是否需要 ssl 安全连接方式
-Dcom.sun.management.jmxremote.ssl=false
# 是否需要密钥
-Dcom.sun.managent.jmxremote.authenticate=false

例如:

java 
-Dcom.sun.management.jmxremote.port=8899 
-Dcom.sun.managent.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-jar xxx.jar

注意:这个端口号不能与程序端口一样,需要单独的,不重复的端口号,否则会报端口被占用 的错误,还有就是你服务器的防火墙没关的话还要在防火墙中开发该端口,其次如果你使用的服务器是云服务器的话,还需要在云服务器上开发该端口。

其次还需要创建 jmxremote.password 文件,用于控制远程连接用户名和密码的。

可以在 %JAVA_HOME%/jre/lib/management 目录下查看是否有 jmxremote.password 文件,如果没有的话可以通过该目录下的jmxremote.password.template 文件为原型复制一个

cp jmxremote.password.template jmxremote.password

然后编辑 jmxremote.password 文件

vim jmxremote.password

修改最下面的两行,把注释 # 去掉

# monitorRole  QED
# controlRole   R&D

在这里插入图片描述

monitorRole 是查看角色(也是登录用户名,在 access 文件中),拥有只读权限,QED 是设置的密码。
controlRole 是控制用户(也是登录用户名,在 access 文件中),拥有读写权限,R&D 是设置的密码。

最后对该文件赋权即可:

chmod 600 jmxremote.password

连接:

在这里插入图片描述

在这里插入图片描述

连接成功如图所示:

在这里插入图片描述


2.3 监控 JVM 资源

概览:

连接成功之后,JConsole 将会显示应用程序的概览信息,在概览标签页可以查看程序的垃圾回收、类加载、线程等信息。

在这里插入图片描述

内存:

显示 JVM 的内存使用情况,包括堆内存、非堆内存、内存池等。

在这里插入图片描述

内存 界面具有 执行GC 按钮,可以随时单击该按钮以执行垃圾回收。同时还能通过点击 图表-下拉选项 或者单击 右下角内存图 切换所要监控的内存区。

Java VM 管理两种内存:堆内存和非堆内存,这两种内存都是在 Java VM 启动时创建的。

  • (1)堆内存:是运行时数据区,在虚拟机启动时就会被创建,它存储了被自动内存管理系统(Automatic Storage Management System,也就是常说的 Garbage Collector 垃圾收集器)所管理的各种对象,这些受管理的对象无需也无法显式地被销毁。堆的容量可以是固定大小的,也可以随着程序执行的需求动态扩展,并在不需要过多空间时自动收缩,堆所使用的内存亦不需要保证是连续的。

    • 内存模型:
      在这里插入图片描述

    • 堆内存可被分为两大区域:

      • 新生代(Young/New Generation):新生对象放置在新生代中,新生代由 EdenSurvivor Space 组成。EdenSurvivor Space 的空间大小比例默认为 8:1,即当 Young/New Generation 区域的空间大小总数为 10M 时,Eden 的空间大小为 8M,两块 Survivor Space 则各分配 1M,这个比例可以通过 -XX:SurvivorRatio 参数来修改。Young/New Generation 的大小则可以通过 -Xmn 参数来指定。
        • Eden:伊甸区,对象被创建的时候首先放到 Eden 区中,进行垃圾回收后,不能被回收的对象被放入到空的 Survivor 区域。
        • Survivor Space:幸存者区,用于保存在 Eden 内存区域中经过垃圾回收后没有被回收的对象。Survivor Space 分为两个空间大小一样的区域,分别是 s0s1 ,当触发 Minor GC 后将仍然存活的对象移动到 s0 中去(From Eden To s0),这样 Eden 就被清空可以分配给新的对象;当再一次触发 Minor GC 后,s0Eden 中存活的对象被移动到 s1 中(From s0 To s1),s0 即被清空,在同一时刻,只有 Eden 和一个 Survivor Space 同时被操作,所以 s0s1 这两块 Survivor 区同时会至少有一个为空闲的。
      • 老年代(Old/Tenured Generation):老年代用于存放程序中经过几次垃圾回收后还存活的对象,也可能是新生代分配不了内存的大对象会直接进入老年代,例如缓存的对象等,老年代所占用的内存大小为 -Xmx-Xmn 两个参数之差。
    • 默认情况下,新生代(Young)与老年代(Old)的比例值为 1:2 (该值可以通过参数 -XX:NewRato 来指定),即:新生代(Young)= 1/3 的堆内存空间大小,老年代(Old) = 2/3 的堆空间大小。其中,新生代(Young)被细分为 Eden 和两个 Survivor 区域,默认 Eden:s0:s1 = 8:1:1(可以通过参数 -XX:SurvivorRatio 来设定)。堆内存的整个大小 = 年轻代大小 + 老年代大小,堆内存默认为物理内存的 1/64(<1GB),在默认情况下空余堆内存小于 40% 时,JVM 就会增大堆直到 -Xmx 的最大限制,可以通过 MinHeapFreeRatio 参数进行调整;默认空余堆内存大于 70% 时,JVM 会减少堆直至 -Xms 的最小限制,可以通过 MaxHeapFreeRatio 参数进行调整。

  • (2)非堆内存:包括在 Java VM 的内部处理或优化所需的所有线程和内存之间共享的方法区,它存储每类结构,例如运行时常量池,字段和方法数据,以及方法和构造函数的代码,方法区在逻辑上是堆的一部分,但是根据实现,Java VM 可能不会垃圾收集或压缩它,跟堆存储器一样,方法区可以是固定的或可变的大小,方法区的内存不需要是连续的。

    • 可分为:
      • Metaspace:元空间,是方法区在 HotSpot jvm 中的实现,方法区主要用户存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫 非堆
      • Code Cache:HotSpot Java VM 还包括代码缓存,其中包含用于编译和存储本机代码的内存。
      • Compressed Class Space:压缩类空间

线程:

显示 JVM 中的线程活动情况,包括线程数、线程状态、死锁等。

在这里插入图片描述

红色:峰值线程数
蓝色:活动线程数

左下角的线程列表列出了所有活动线程,选中 线程 单击,会显示有关该线程的信息,包括线程名称,状态和堆栈跟踪。

点击 检测死锁 可以检测出死锁

在这里插入图片描述

类:

显示 JVM 加载的类信息,包括已加载类的数量、被卸载的类数量等。

在这里插入图片描述

红色:加载的类的总数(包括随后卸载的类)
蓝色:当前加载的类的数量

详细信息 部分显示自 Java VM 启动以来加载的类的总数,当前加载的数量和卸载的数量。

可以通过选择 时间范围-下拉框 来查询指定时间范围的类加载情况。

VM 概要:

显示JVM的基本信息,如 JVM 的启动参数、命令行参数等。

在这里插入图片描述

MBean:

显示了所有在 platform. MBeanserver 上注册的 MBeans 的信息。

在这里插入图片描述

左边的树形结构显示了所有的 MBean,选择了一个 MBean 之后,其属性、操作、通知和其他信息会在右边显示。


参考博客:

java 性能分析 jconsole 详解:https://jishu.zuankewang.com/24934/
Jconsole 使用:https://www.cnblogs.com/walkersss/p/17476083.html
jconsole 远程连接的使用:https://blog.csdn.net/interestANd/article/details/127390435
Jconsole 使用 - 慕尘:https://www.cnblogs.com/baby123/p/11395760.html
Java 堆内存 (Heap):https://www.pianshen.com/article/1576134841/

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值