前言
我们在测试java项目的需要对应用程序的资源消耗和性能指标进行监控,特别是进行性能测试的时候,监控尤为重要。今天我们介绍的jconsole工具就是一个JDK自带的监控工具,可以直接启动并监控本地或者远程的JVM。它提供了大量的图标,并画出大量的图标,提供强大的可视化界面。
1、jconsole的介绍
Jconsole,Java Monitoring and Management Console,个内置 Java 性能分析器。因为是jdk自带的,所以安装好jdk并配置好环境后,两种方式可以启动jconsole工具:
1)cmd里直接输入jconsole回车启动:
2)找到JDK的安装目录下的bin目录下的jconsole.exe,双击打开
启动后可以看到jconsole的图形化界面:
它可以监控本地的jvm,也可以监控远程的jvm,也可以同时监控几个jvm。会展示JVM中内存,线程和类等的监控。这款工具的好处在于,占用系统资源少,在项目追踪内存泄露问题时,很实用。
2、jconsole本地监控
Jconsole可以监控本地的java进程,会自动列出来本地所有jvm进程,双击这个进程可以进入这个进程监控页面:
可以监控这个进程的内存,线程使用情况等信息:
3、jconsole远程监控
我们更多的时候会使用这个工具来监控远程的java进程。比如做性能测试项目部署在云服务器上或者某个虚拟机上,并不是你本地电脑运行的程序,那么就需要使用jconsole进行远程连接并监控。
比如远程Linux服务器上运行了一个tomcat的进程,要监控它就需要再tomcat的配置文件进行修改和配置:
- 修改 tomcat主目录\bin\ catalina.sh文件,增加一行:
CATALINA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=192.168.61.136 -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
以上配置解释如下:
- -Dcom.sun.management.jmxremote.port=8999 : 提供给jconsole连接的端口
- -Djava.rmi.server.hostname=192.168.61.136: 这个地方写你用于远程访问的IP;确保jconsole所在客户端能访问这个IP的服务器;
- -Dcom.sun.management.jmxremote.ssl=false :取消SSL加密
- -Dcom.sun.management.jmxremote.authenticate=false : 取消用户名密码验证
然后,重启Tomcat,接着进入JDK下的bin目录下运行“jconsole.exe”,输入对应的IP+端口进行远程连接:
连接成功后可以监控远程的tomcat进程的资源使用情况:
4、jconsole监控页面详情介绍
当Jconsole连接成功后,它从JMX获取信息,我们便可以在里面监控具体的内容。
Jconsole能捕获到以下信息:
- 概述 - JVM概述和一些监控变量的信息
- 内存 - 内存的使用信息
- 线程 - 线程的使用信息
- 类 - 加载java类的信息
- VM - JVM摘要
- MBeans - 所有MBeans的信息
我们做性能测试过程中需要重点关注的是:内存栏、线程栏、类栏,另外概述栏和VM栏次之,MBeans栏在追踪具体问题时用到。
JConsole的在右上角的绿色连接状态图标,断开或重新连接到正在运行的Java虚拟机。 从下拉菜单中选择连接,然后新建连接,您可以同时连接到任何数量运行中的Java虚拟机。
以下以本地监控jconsole进程为例讲解。
1、 查看概述信息
概述选项卡中显示CPU使用率,内存使用率,线程数,Java VM中加载的类的监控信息。
2、监控内存消耗
Memory选项卡提供了内存消耗和内存池的信息。下拉可以选择更加详细的堆内存使用信息:
内存标签功能“执行GC”的按钮,可以单击执行垃圾回收。 图表动态显示内存使用的堆和非堆内存的内存池。 可用的内存池取决于正在使用的Java VM的配置。
垃圾回收的内存池有以下几种:
- 伊甸园空间(堆): 大多数对象最初分配内存的池。
- 生存空间(堆): 包含伊甸园空间垃圾收集后生存的对象。
- 年老代(堆): 池包含已经存在一段时间的对象。
- 元空间(非堆): 池包含的所有虚拟机本身的反射的数据,如类和方法的对象。 Java虚拟机,使用类数据共享,这一代分为只读和读写区域。
- 代码缓存(非堆):HotSpot Java虚拟机的还包括一个代码缓存,包含内存,使用本机代码的编译和存储。
- Compressed Class Pointers(压缩类指针):压缩类指针则用于指向方法区(Metaspace)中的类元数据。
可以从图表下拉菜单中的选项选择不同的图表显示图表这些内存池的消费;此外,点击在右下角的角落堆和非堆图标,将切换显示图表(与下拉框选择不同类型图表功能相同)。
“详细信息” 区域显示了当前内存信息:
- 已使用 :目前使用的内存量,包括所有对象,可达和不可达占用的内存。
- 分配 :保证由Java虚拟机使用的内存量。 提交的内存量可能会随时间而改变。 Java虚拟机可能会释放系统内存,并已提交的内存量可能会少于最初启动时分配的内存量。 提交的内存量将始终大于或等于使用的内存量。
- 最大值,可用于内存管理的最大内存量。 它的价值可能会发生变化,或者是不确定的。 如果Java虚拟机试图增加使用的内存要大于提交的内存,内存分配可能失败,即使使用量小于或等于最大值(例如,当系统上的虚拟内存不足)。
- GC时间 :累计时间花在垃圾收集和调用的总数。 它可能有多个行,其中每一个代表一个垃圾收集器算法在Java虚拟机使用时间。
MarkSweepCompact:Full GC
Copy:Young GC
3、监视线程使用
线程“选项卡上提供了有关线程使用的信息
在左下角的“线程”列表列出了所有的活动线程。 如果你输入一个“过滤器”字段中的字符串,线程列表将只显示其名称中包含你输入字符串线程。 点击一个线程在线程列表的名称,显示该线程的信息的权利,包括线程的名称,状态、阻塞和等待的次数、堆栈跟踪。
图表显示活动线程的数量随着时间的推移。 两行显示。
- 红色 :峰值线程数
- 蓝 :活动线程数。
线程选项卡提供了几个有用的操作。
- 检测死锁:检测,如果任何线程对象监视器锁定陷入死锁。 此操作返回一个死锁的线程ID数组。
4、监视类载入中
“类”标签显示关于类加载的信息。
图表曲线加载的类的数量随着时间的推移。
- 红线总数(包括后来卸载的)加载的类。
- 蓝线是当前的类加载。
在选项卡底部的详细信息部分显示类的加载,因为Java虚拟机开始的总数,当前加载和卸载的数量。 跟踪类加载详细的输出,您可以勾选在顶部的右上角复选框。
5、查看VM信息
VM摘要“选项卡提供了对Java虚拟机的信息。
在此选项卡中提供的信息包括以下内容:
- 摘要:运行时间 :开始以来,Java虚拟机的时间总额;
- 进程的CPU时间 :Java VM的开始,因为它消耗的CPU时间总量。
- 编译总时间 :累计时间花费在JIT编译。
- 主题
- 活动线程 :目前现场守护线程,加上非守护线程数量。
- 峰值 :活动线程的最高数目,因为Java虚拟机开始。
- 守护线程 :当前的活动守护线程数量。
- 总线程 :开始自Java虚拟机启动的线程总数,包括非守护进程,守护进程和终止的线程。
- 内存
- 当前的堆大小 :目前所占用的堆的千字节数。
- 分配的内存 :堆分配的内存总量。
- 最大堆最大值 :堆所占用的千字节的最大数目。
- 待最后确定的对象:待最后确定的对象的数量。
- 花在执行GC的垃圾收集器 :包括垃圾收集,垃圾收集器的名称,进行藏品的数量和总时间的信息。
- 操作系统
- 总物理内存
- 空闲物理内存
- 分配的虚拟内存
- 其他信息
- VM参数 :输入参数的应用程序通过Java虚拟机,不包括的主要方法的参数。
- 类路径是由系统类加载器用于搜索类文件的类路径。
- 库路径 :加载库时要搜索的路径列表。
- 引导类路径 :引导类路径是由引导类加载器用于搜索类文件
欢迎来到testingpai.com!
注册 关于