文章目录
- 一、简介
- 二、使用
- 2.1 启动 JConsole
- 2.2 连接到 Java 进程
- 2.2.1 本地连接
- 2.2.2 远程连接
- 2.3 监控 JVM 资源
一、简介
JConsole
是一种 Java
监控和管理控制台工具,可以用于监视 Java
虚拟机(JVM)的性能和资源利用情况。它提供了一种图形化界面,可以实时查看 JVM
的运行状态、内存使用情况、线程活动、垃圾回收等信息,以及执行一些管理操作。
使用 JConsole
可以帮助开发人员和系统管理员进行性能调优、内存泄漏排查和故障诊断
,从而提高应用程序的可靠性和性能。
总之,JConsole
是一个强大的 Java
监控和管理工具,可以帮助开发人员和系统管理员实时监控和管理 Java
应用程序的性能和资源利用情况。
二、使用
如果你没有安装 JDK ,可参见博客:
- windows:java-环境配置(详细教程)
- linux:Linux-java环境配置
下面是 JConsole
的使用步骤:
-
启动 JConsole:JConsole 是包含在 JDK 中的一个工具,因此首先要确保已经安装了 JDK。然后,在命令行中输入 jconsole 命令或者双击
jconsole.exe
启动 JConsole 。 -
连接到 Java 进程:启动 JConsole后,会弹出一个界面,显示所有正在运行的 Java 进程。选择要监控的 Java 进程,并点击
连接
按钮。 -
监控 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):新生对象放置在新生代中,新生代由
Eden
与Survivor Space
组成。Eden
与Survivor 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
分为两个空间大小一样的区域,分别是s0
和s1
,当触发Minor GC
后将仍然存活的对象移动到s0
中去(From Eden To s0),这样 Eden 就被清空可以分配给新的对象;当再一次触发Minor GC
后,s0
和Eden
中存活的对象被移动到s1
中(From s0 To s1),s0
即被清空,在同一时刻,只有Eden
和一个Survivor Space
同时被操作,所以s0
和s1
这两块Survivor
区同时会至少有一个为空闲的。
- Eden:伊甸区,对象被创建的时候首先放到 Eden 区中,进行垃圾回收后,不能被回收的对象被放入到空的
- 老年代(Old/Tenured Generation):老年代用于存放程序中经过几次垃圾回收后还存活的对象,也可能是新生代分配不了内存的大对象会直接进入老年代,例如缓存的对象等,老年代所占用的内存大小为
-Xmx
与-Xmn
两个参数之差。
- 新生代(Young/New Generation):新生对象放置在新生代中,新生代由
-
默认情况下,新生代(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:压缩类空间
- Metaspace:元空间,是方法区在
- 可分为:
线程:
显示 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/