1.前言
现在我们的系统在上线后一般情况我们都不知道如何了解JVM的实际运行情况,同时对于系统性能等问题也没有一些好的手段进行监控,好在JDK提供了一些简单的工具,如JConsole、JStat、JMap等辅助我们来直观的了解JVM的运行情况,下面我们就重点看看JConsole如何帮助我们进行分析。
JDK1.5提供JMX remote的管理工具Jconsole,可以监控Java运行程序的内存使用情况、活动线程数量、类装载的数量、MBeans的状态、虚拟机的各种信息等,还可以执行MBean公开的方法或强制进行垃圾回收。只要应用服务器实现标准的JMX接口,就可以使用Jconsole进行监控。
需要远程服务器监控时需要在JAVA_OPTS中设置-Dcom.sun.management.jmxremote这个参数
可以直接运行java/bin/Jconsole [PID]启动监控界面,这个监控工具是Java 1.5以上版本自带的,其中的PID是运行的java程序进度ID,可以不填,运行Jconsole后在界面中选择。
测试环境为:
服务器:Tomcat 5.5.28
本机IP:192.168.1.12
2.启动JConsole
直接运行java/bin/Jconsole.exe,如下图:
监控本地运行的
tomcat
我们可以根据需要选择本地、远程、高级的监控。我们当前直接在服务器上进行监控,所以就直接选择本地的监控,连接以后如下图所示:
在启动的界面中:
1.概述:有关堆内存使用情况,线程,类加载和CPU使用情况的综述;
2.内存:内存的详细情况,堆和其他内存;
3.线程:峰值/活动线程,另外,各个线程的明细信息,检测死锁;
4.类:监控加载和卸载的类,这个需要结合其他的工具进行分析;
5.MBean:当前Java程序的MBean(如果有的话)的操作;
6.VM摘要:有关JVM的明细信息;
3.监控概要
从概要中我们可以直观的了解系统运行的总时间、线程数、内存与垃圾回收信息、装载类及操作系统内存的信息。
其中内存的信息对应我们配置的-Xms256m -Xmx512m
垃圾收集器对应我们配置的垃圾回收方式,每种方式的名称会有所不同,当我们没有配置垃圾回收方式时一般为UseParallelGC这种方式
(1)-XX:+UseConcMarkSweepGC 并行的CMS垃圾回收方式
GC名:
ParNew
ConcurrentMarkSweep
内存池名:
CMS Perm Gen
Par Eden Space
Par Survivor Space
Code Cache
CMS Old Gen
(2)-XX:+UseParallelGC 并行垃圾回收
GC名:
PS Scavenge
PS MarkSweep
内存池名:
PS Survivor Space
PS Perm Gen
PS Old Gen
PS Eden Space
Code Cache
(3)-XX:+UseParallelOldGC 并行垃圾回收 GC名:
PS Scavenge
PS MarkSweep
内存池名:
PS Survivor Space
PS Perm Gen
PS Old Gen
PS Eden Space
Code Cache
(4)-XX:+UseSerialGC 串行垃圾回收 GC名:
Copy
MarkSweepCompact
内存池名:
Survivor Space
Perm Gen
Tenured Gen
Eden Space
Code Cache
4.监控内存
对应SO、S1区,Eden,
old以及Perm和cache
对于内存的监控我们主要会关注JVM垃圾回收的三代区域:
年轻代:PS Eden Space和PS Survivor Space
对应配置参数:-Xmn256M -XX:MaxNewSize=256M -XX:SurvivorRatio=2 -XX:MaxTenuringThreshold=5等
老年代:PS Old Gen
其值是:Old = Heap - Young={Eden,from,to}
对应配置参数包括:-Xms512m -Xmx1024m和年轻代的配置参数,from,to 的值取决于SurvivorRatio这个参数的设置
持久代:PS Perm Gen
对应的配置参数:-XX:PermSize=256M -XX:MaxPermSize=512m
注:在观察内存的使用情况时首先保证相关的线条不是持续增长的,需要有
回收的动作出现,并且可以估计其回收的内存大小,如果回收始终没有增长的多,特别是内存增长很多的情况,这时系统很可能存在内存泄露。这时我们可能需要通过其他的更详细的工具对系统的类及内存进行分析,如JMap等。
5.监控线程
通过线程的监控可以查看系统中所有的线程数,同时可以点击单个的线程查看具体的线程运行情况,如:
可以结合windows命令netstat –na查看是否有CLOSE_WAIT的状态,有的话可以直接通过线程找到是否有对应的这个状态,这样就可以查出具体是什么线程存在泄露的情况。
6.监控VM
可以查看JVM的综合信息,其中个人认为比较重要的是JIT的编译时间,这个可以通过对经常使用的类进行机器码编译来提供系统性能,如调整-XX:CompileThreshold=10000这个参数设置成10000次调用则直接编译成机器码。