JConsole 远程监控 Tomcat 服务1、概述JConsole是一个基于JMX的GUI工具,用于连接正在运行的 JVM不过此JVM需要使用可管 理的模式启动如果要把一个应用以可管理的形式启动, 可以在启动是设置 com.sun.management.jmxremoteJConsole 能够提供被监控虚拟机的内存、线程、类的加 载以及MBean等信息,从而能够对服务器的运行情况进行实时监控其实在 JDK 5 中已经新加入了这个功能了 . 现在的 JDK 已经内置了对 VM 的监控功能 . JDK 6 中这个工具变的更加好用了 . 关于 JDK 5 中如何使用这个工具可以参考这里 : CentOS 5 + JDK6 + Tomcat6ip 地址: 192.168.1.101客户机: Windows + JDK 62、 配置修改 java 虚拟机启动参数在 %TOMCAT_HOME%\bin\catalina.sh 文件中将JAVA_OPTS”= -Xms256m -Xmx512m -XX:MaxPermSize=128m” 修改为:JAVA_OPTS”= -Xms256m -Xmx512m -XX:MaxPermSize=128m-Dcom.sun.management.jmxremote.port=1090-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false ”注意: 1090 表示监控的端口号,确保指定的端口不被占用;可以采用 netstat -an 来查看已经占用的端口;配合 lsof -i:portnum 来查看占用端口的具体应用程序;另外如果开启 了防火墙服务,请确保端口能够透过防火墙访问;启动 Tomcat 服务器./catalina.sh run&连接远程虚拟机启动%JAVA_HOME%\bi目录下的jeon sole ,弹出对话框在“远程进程”中输入 192.168.1.101:1090 ,点击“连接”,就能查看到远程 Tomcat服务器的运行情况了。
当JConsole成功建立连接,它从连接上的 JMX代理处获取信息,并且以下面几个标签页呈现信息« 概述:监控JVM和一些监控变量的信息内在:内存使用信息*线程:线程使用信息*类:类调用信息* VM概要:JVM的信息* MBean:所有MBeans的信息MBean标签页展示了所有以一般形式注册到 JVM上的MBeans MBeans tab允许你获取所有的平台信息,包括那些不能从其他标签页获取到的信息 注意,其他标签页上的一些信息也在MBeans这里显示另外,你可以使用 MBeans标签管理你自己的应用的 MBeans3、使用 MBean标签监控和管理 MBean注册到JMX代理的平台或者应用的 MBeans可以通过MBeans标签获取例如,内存的MBeans 如下面定义public in terface MemoryMXBea n {public MemoryUsage getHeapMemoryUsage();public MemoryUsage getN onH eapMemoryUsage();public int getObjectPe ndingFin alizati onCoun t();public boolea n isVerbose();public void setVerbose(boolea n value);public void gc();}内存的MBean包括四个属性:* HeapMemoryUsage.用于描述当前堆内存使用情况的只读属性« NonHeapMemoryUsage.用于描述当前的非堆内存的使用情况的只读属性« ObjectPe ndi ngFi nalizatio nCou nt. 用于描述有多少对象被挂起以便回收。
・Verbose.用于动态设置 GC是否跟着详细的堆栈信息,为一个布尔变量内存的MBean支持一个操作一一GC此操作可以发送进行实时的垃圾回收请求图3: MBean标签左边的树形结构以名字的方式展示了所有 MBea ns的列表一个 MBean对象的名字由一个域 的名字和一串关键字属性组成 例如,JVM的平台的MBeans是在"java.lang ”域下的一组, 而日志的 MBeans则在"java.util.logging" 域下MBean对象的名字在javax.ma nageme nt.ObjectName 规范中定义当你在树中选中一个 MBean属性,操作,或者通知等一些信息会再右边显示出来如果属 性是可写的(属性被标志为蓝色),你可以进行设置图4: MBean操作你可以操作在”操作”节点中列出的操作口口冈订阖 未订圈 清除— 八…」 ||Hjava监视和青輝揑制合-152,168,1,101:1090口连接窗口帮助搐主讥I荷比程熒VJI \W 怔沁八± J Catalina■t _JJMInplsjientaticn a Users* D con. sun. nanasenent -_J Java, lang± ■书 ClassLoading 申■母 Conpilatlon 幻 _3 G arb agsCol1a ct oi -辔 Meitory*居性a-LJ Memoryllaniager 白谭 C^deCacheKana 、*属性+ _J MenoryFool■+ ,J QperatinsSysteft + 心 Runtime±. ® Threading t _j Java. utiL. logging-叹 Loggingi膚It图5: MBean通知你也可以看到由 MBean发送出来的通知:默认情况,如果你不订阅通知的话, JConsole不会收到MBean发生过来的通知。
你可以点击”订阅”按钮来堆通知进行定义, 而使用”末订阅” 按钮来取消订阅4、监控内存内存标签页通过读取内存系统、 内存池、垃圾回收的MBean来获取对内存消耗、内存池、垃圾回收的情况的统计□口冈Hjava监视和青輝揑制合-152,168,1,101:1090上图展示了内存随时间变化的使用情况 有对堆的、非堆的以及特殊内存池的统计 内存池信息是否能被获取,取决与使用的 Java虚拟机下面列表展示了 HotSpot虚拟机的内存池 情况内存池"Eden Space ” (heap):内存最初从这个线程池分配给大部分对象内存池"Survivor Space ” (heap):用于保存在eden space内存池中经过垃圾回收后没 有被回收的对象内存池"Tenured Generation ” (heap):用于保持已经在 survivor space 内存池中存在 了一段时间的对象内存池"Perm Gen eratio n ”(non-heap): 保存虚拟机自己的静态 (refective) 数据,例如类(class )和方法(method)对象Java虚拟机共享这些类数据这个区域被分割为只读 的和只写的内存池"Code Cache”(non-heap): HotSpot Java虚拟机包括一个用于编译和保存本地代码(native code )的内存,叫做"代码缓存区”( code cache ) 详细信息区域给出一些当前线程的信息: 已使用:当前的内存使用量。
使用的内存包括所有对象(能被获取和不能被获取的)所占用 的内存分配: Java 虚拟机保证能够获取到的内存量分配内存( committed memory )的量可能随 时间改变 Java 虚拟机可能释放部分这里的内存给系统,相应的分配的内存这时可能少于 初始化时分配的给它的量分配量总数大于或等于已使用的内存量最大值 : 内存管理系统可以使用的最大内存量这个值可以被改变或者不做设定如果 JVM 试图增加使用的内存到大于分配量( committed memory的情况,内存分配可能失败,即便想使用的内存量小于或者等于最大值(如:系统虚拟内存比较低时)GC 时间 : 垃圾回收使用的总时间和调用垃圾回收的次数它可能有好几行,每行代表 JVM使用的垃圾回收算法Usage Threshold The usage threshold of a memory pool. This field will only beshownif the memory pool supports usage threshold.右下角的棒状图表显示了被 JVM的内存池消耗的内存如果内存使用超过 usage threshold,则棒会变红。
usagethreshold 是用于支持内存检查的 Memory Pool MBean 的一个属性MemoryPoolMXBean定义了一系列方法用于检查内存public interface MemoryPoolMXBean {// Usage thresholdpublic long getUsageThreshold();public void setUsageThreshold(long threshold);public boolean isUsageThresholdExceeded();public boolean isUsageThresholdSupported();// Collection usage thresholdpublic long getCollectionUsageThreshold();public void setCollectionUsageThreshold(long threshold);public boolean isCollectionUsageThresholdSupported();public boolean isCollectionUsageThresholdExceeded();}每种内存池可能有两种内存初始话支持: usage threshold 和 collection usage threshold 特殊的内存池可能两种都不支持。
Usage Thresholdusage threshold 是内存池中一个可管理的属性它使用低负荷的内存监控设置 usage threshold 为正值则 usage threshold 检查内存池设置 usage threshold 为零,则关闭检 查默认值由JVM设置JVM—般让usage threshold 在最合适的时候检查内存,典型的在GC的过程中和某些分配内存的时候如果JVM发现当前的内存使用超过了 usage threshold ,它将会把 UsageThresholdExceeded 属性设置为 true有些内存池可能不支持 usage threshold 你可以使用 UsageThresholdSupporte。