jconsole+tomcat配置说明 基于jdk15.docx
《jconsole+tomcat配置说明 基于jdk15.docx》由会员分享,可在线阅读,更多相关《jconsole+tomcat配置说明 基于jdk15.docx(28页珍藏版)》请在冰豆网上搜索。
jconsole+tomcat配置说明基于jdk15
JConsole是JDK自带的东西,功能虽然没有一些商业软件那么强大,但是稳定性好,在大压力情况下也不会发生什么问题。
而且提供了相对全面的系统监控功能,还是值得一用的。
JConsole
JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,不过此JVM需要使用可管理的模式启动。
如果要把一个应用以可管理的形式启动,可以在启动是设置com.sun.management.jmxremote。
例如,启动一个可以在本地监控的J2SE的应用Java2Demo,需输入以下命令:
JDK_HOME/bin/java-Dcom.sun.management.jmxremote-jar
JDK_HOME/demo/jfc/Java2D/Java2Demo.jar
JDK_HOME需要是一个含有JDK5.0的目录。
要启动JConsole,运行JDK_HOME/bin/jconsole一个用于连接的对话框将会打开。
对话框的Local标签列出了所有本地正在运行的JVM,还包含进程的ID等信息。
Figure2:
LocalTab.
JConsole可以以三种方式连接正在运行的JVM:
Local:
使用JConsole连接一个正在本地系统运行的JVM,并且执行程序的和运行JConsole的需要是同一个用户。
JConsole使用文件系统的授权通过RMI连接器连接到平台的MBean服务器上。
这种从本地连接的监控能力只有Sun的JDK具有
Remote:
使用下面的URL通过RMI连接器连接到一个JMX代理:
service:
jmx:
rmi:
///jndi/rmi:
//hostName:
portNum/jmxrmi
hostName填入主机名称,portNum为JMX代理启动时指定的端口。
JConsole为建立连接,需要在环境变量中设置mx.remote.credentials来指定用户名和密码从而进行授权。
Advanced:
使用一个特殊的URL连接JMX代理。
一般情况使用自己定制的连接器而不是RMI提供的连接器来连接JMX代理,或者是一个使用JDK1.4的实现了JMX和JMXRmote的应用。
当JConsole成功建立连接,它从连接上的JMX代理处获取信息,并且以下面几个标签页呈现信息。
Summarytab.监控JVM和一些监控变量的信息。
Memorytab.内存使用信息
Threadstab.线程使用信息
Classestab.类调用信息
VMtab.JVM的信息
MBeanstab.所有MBeans的信息
MBeanstab展示了所有以一般形式注册到JVM上的MBeans。
MBeanstab允许你获取所有的平台信息,包括那些不能从其他标签页获取到的信息。
注意,其他标签页上的一些信息也在MBeans这里显示。
另外,你可以使用MBeans标签管理你自己的应用的MBeans
使用MBeansTab监控和管理MBean
注册到JMX代理的平台或者应用的MBeans,可以通过MBeans标签获取。
例如,内存的MBeans如下面定义
Java代码
1.public interface MemoryMXBean {
2. public MemoryUsage getHeapMemoryUsage();
3. public MemoryUsage getNonHeapMemoryUsage();
4. public int getObjectPendingFinalizationCount();
5. public boolean isVerbose();
6. public void setVerbose(boolean value);
7. public void gc();
8.}
publicinterfaceMemoryMXBean{
publicMemoryUsagegetHeapMemoryUsage();
publicMemoryUsagegetNonHeapMemoryUsage();
publicintgetObjectPendingFinalizationCount();
publicbooleanisVerbose();
publicvoidsetVerbose(booleanvalue);
publicvoidgc();
}
内存的MBean包括四个属性:
HeapMemoryUsage.用于描述当前堆内存使用情况的只读属性
NonHeapMemoryUsage.用于描述当前的非堆内存的使用情况的只读属性
ObjectPendingFinalizationCount.用于描述有多少对象被挂起以便回收。
Verbose.用于动态设置GC是否跟着详细的堆栈信息,为一个布尔变量,内存的MBean支持一个操作——GC,此操作可以发送进行实时的垃圾回收请求。
Figure3:
MBeansTab.
左边的树形结构以名字的方式展示了所有MBeans的列表。
一个MBean对象的名字由一个域的名字和一串关键字属性组成。
例如,JVM的平台的MBeans是在“java.lang”域下的一组,而日志的MBeans则在"java.util.logging"域下。
MBean对象的名字在javax.management.ObjectName规范中定义。
当你在树中选中一个MBean,属性,方法,或者通知等一些信息会再右边显示出来。
如果属性是可写的(属性被标志为蓝色),你可以进行设置。
你可以操作在Operationstab中列出的操作。
你也可以看到由MBean发送出来的通知:
默认情况,如果你不订阅通知的话,JConsole不会收到MBean发生过来的通知。
你可以点击"Subscribe"(订阅)按钮来堆通知进行定义,而使用"Unsubscribe"按钮来取消订阅
Figure4:
MBeansNotification.
监控内存
内存标签页通过读取内存系统、内存池、垃圾回收的MBean来获取对内存消耗、内存池、垃圾回收的情况的统计。
图:
上图展示了内存随时间变化的使用情况。
有对堆的、非堆的以及特殊内存池的统计。
内存池信息是否能被获取,取决与使用的Java虚拟机。
下面列表展示了HotSpot虚拟机的内存池情况。
EdenSpace(heap):
内存最初从这个线程池分配给大部分对象。
SurvivorSpace(heap):
用于保存在edenspace内存池中经过垃圾回收后没有被回收的对象。
TenuredGeneration(heap):
用于保持已经在survivorspace内存池中存在了一段时间的对象。
PermanentGeneration(non-heap):
保存虚拟机自己的静态(refective)数据,例如类(class)和方法(method)对象。
Java虚拟机共享这些类数据。
这个区域被分割为只读的和只写的,
CodeCache(non-heap):
HotSpotJava虚拟机包括一个用于编译和保存本地代码(nativecode)的内存,叫做“代码缓存区”(codecache)
详细信息区域给出一些当前线程的信息:
Used:
已使用:
当前的内存使用量。
使用的内存包括所有对象(能被获取和不能被获取的)所占用的内存。
Committed:
分配量:
Java虚拟机保证能够获取到的内存量。
分配内存(committedmemory)的量可能随时间改变。
Java虚拟机可能释放部分这里的内存给系统,相应的分配的内存这时可能少于初始化时分配的给它的量。
分配量总数大于或等于已使用的内存量。
Max:
内存管理系统可以使用的最大内存量。
这个值可以被改变或者不做设定。
如果JVM试图增加使用的内存到大于分配量(committedmemory)的情况,内存分配可能失败,即便想使用的内存量小于或者等于最大值(如:
系统虚拟内存比较低时)
UsageThresholdTheusagethresholdofamemorypool.Thisfieldwillonlybeshownifthememorypoolsupportsusagethreshold.
GCtime:
垃圾回收使用的总时间和调用垃圾回收的次数。
它可能有好几行,每行代表JVM使用的垃圾回收算法。
(
右下角的棒状图表显示了被JVM的内存池消耗的内存。
如果内存使用超过usagethreshold,则棒会变红。
usagethreshold是用于支持内存检查的MemoryPoolMBean的一个属性。
MemoryPoolMXBean定义了一系列方法用于检查内存。
Java代码
1. public interface MemoryPoolMXBean {
2.....
3.// Usage threshold
4.public long getUsageThreshold();
5.public void setUsageThreshold(long threshold);
6.public boolean isUsageThresholdExceeded();
7.public boolean isUsageThresholdSupported();
8.// Collection usage threshold
9.public long getCollectionUsageThreshold();
10.public void setCollectionUsageThreshold(long threshold);
11.public boolean isCollectionUsageThresholdSupported();
12.public boolean isCollectionUsageThresholdExceeded();
13.}
publicinterfaceMemoryPoolMXBean{
....
//Usagethreshold
publiclonggetUsageThreshold();
publicvoidsetUsageThreshold(longthreshold);
publicbooleanisUsageThresholdExceeded();
publicbooleanisUsageThresholdSupported();
//Collectionusagethreshold
publiclonggetCollectionUsageThreshold();
publicvoidsetCollectionUsageThreshold(longthreshold);
publicbooleanisCollectionUsageThresholdSupported();
publicbooleanisCollectionUsageThresholdExceeded();
}
每种内存池可能有两种内存初始话支持:
usagethreshold和collectionusagethreshold特殊的内存池可能两种都不支持。
UsageThreshold
usagethreshold是内存池中一个可管理的属性。
它使用低负荷的内存监控。
设置usagethreshold为正值则usagethreshold检查内存池。
设置usagethreshold为零,则关闭检查。
默认值由JVM设置。
JVM一般让usagethreshold在最合适的时候检查内存,典型的在GC的过程中和某些分配内存的时候。
如果JVM发现当前的内存使用超过了usagethreshold,它将会把UsageThresholdExceeded属性设置为true
有些内存池可能不支持usagethreshold。
你可以使用UsageThresholdSupported属性来判断一个内存池是否支持usagethreshold。
例如,一个比较完善(generationalgarbagecollector)的垃圾回收器(如HotSpot的虚拟机),mostoftheobjectsareallocatedintheyounggeneration,从eden内存池中产生。
edenpool被设计成可以被装满;再edenpool中执行垃圾回收将会释放他
CollectionUsageThreshold
Collectionusagethreshold是可进行垃圾回收的内存池的一个可配置属性。
JVM堆一个内存池进行垃圾回收以后,此内存池中的一些内存仍然被那些没有被回收的对象占用。
collectionusagethreshold仅允许你在垃圾回收后对内存进行检查。
如果JVM发现可用内存超出collectionusagethreshold,它将会设置CollectionUsageThresholdExceeded属性为true。
你可以使用CollectionUsageThresholdSupported属性来控制内存池释放支持collectionusagethreshold.
usagethreshold和collectionusagethreshold是MBean标签中的一组。
例如,在左边的树形结构中选择TenuredGen,设置tenuredgenerationmemorypool的usagethreshold为6m。
如下图所示
Figure6:
SettingUsageThreshold.
当TenuredGenmemorypool的内存使用超过6MBytes时,代表TenuredGenmemorypool的柱状图将会呈现红色来代表使用的内存超过了usagethreshold。
代表堆内存的柱状图也将变为红色。
你可以选择柱状图或者在图表中指定内存池来查看某个指定内存池的信息。
如果把鼠标房子柱状图上,将会显示出内存池的名字
Figure7:
LowMemory.
开启/关闭虚拟机的详细跟踪
如上所述,内存系统的MBean定义了一个叫做Verbose布尔变量,让你能动态的打开或关闭详细的GC跟踪。
详细的GC跟踪,将会在JVM启动时显示。
默认的HotSpot的GC详细输出为stdout.
Figure8:
SettingVerboseGC.死锁检查
线程标签页提供关于应用的线程运行信息
Figure9:
ThreadsTab.
左下角列出了所以正在运行的线程。
如果你在过滤器中输入一个字符,线程列表将仅显示线程名字包含你输入字符的线程。
通过点击某个线程,你可以获取这个线程的相关信息。
线程的MBean标签提供了一些Thread标签没有提供有用的操作。
Xml代码
1.findMonitorDeadlockedThreads. 如果发生线程死锁,可以通过这个检查出来。
操作返回一组死锁的线程ID.
2.
3.getThreadInfo. 返回线程的信息。
包括线程的名称、堆栈信息,导致当前线程阻塞的锁,如果有的话,还返回哪儿线程持有这个锁,和这个线程信息的统计.
4.
5.getThreadCpuTime.返回指定线程消耗的CPU时间.
findMonitorDeadlockedThreads.如果发生线程死锁,可以通过这个检查出来。
操作返回一组死锁的线程ID.
getThreadInfo.返回线程的信息。
包括线程的名称、堆栈信息,导致当前线程阻塞的锁,如果有的话,还返回哪儿线程持有这个锁,和这个线程信息的统计.
getThreadCpuTime.返回指定线程消耗的CPU时间.
为使用上面这些属性,可以到MBeans标签下,在MBeans树上选择ThreadingMBean。
它列出了当前监控的JVM所有属性的操作。
Figure10:
MBeansTabThreading.
为检查你的应用是否进入死锁(例如,你的应用挂起),你可以使用findMonitorDeadlockedThreads操作。
Figure11:
FindDeadlockedThreads.
一旦你选择了findMonitorDeadlockedThreads按钮,将会有一个弹出窗口显示结果。
在上面例子中,JConsole连接了一个存在3个死锁线程的示例应用SampleTest。
如上所示,检查出ID为12,10和11的线程死锁。
想查询更多的线程信息,可以使用getThreadInfo操作。
线程的MBean支持getThreadInfo操作的四种形式:
对一个给定的线程ID,给出最深的堆栈情况
对一系列的线程ID,给出最深的堆栈情况
OfagiventhreadIDwithnostacktrace.
OfanarrayofthreadIDswithnostacktrace.
对应死锁情况,你一般会比较关系堆栈情况。
你可以在getThreadInfo操作的第一个参数中输入死锁的线程ID和你想跟踪的堆栈深度。
Figure12:
ThreadInfoforThreadID=12.
双击stackTrace属性的值域将会显示一个复合对话框,你可以在堆栈中来回查看。
图13,14显示了死锁线程-1的复合对话框中的第一层堆栈和第二层堆栈。
Figure13:
TopFrameoftheStackTraceofDeadlockedThread-1.
Figure14:
SecondFrameoftheStackTraceofDeadlockedThread-1.
线程标签页提供了一个友好的界面供查看线程的堆栈。
你可以找到死锁线程的名字,使用getThreadInfo查找线程信息。
然后又可以使用线程标签页来分析死锁。
控制日志等级
LoggingMBean定义了LoggerNames属性,用于描述日志名称。
为找到你的应用的日志,可以选择在MBeans树中java.util.logging下的LoggingMBean,双击LoggerNames属性
Figure15:
ListofAllLoggerNames.
LoggingMBean也支持三种操作:
∙getParentLoggerName.返回指定logger的父logger
∙getLoggerLevel.返回指定logger的日志等级
∙setLoggerLevel.设置指定logger到一个新的等级
所有三个操作都把日志名称作为第一个参数。
Figure16:
SettingLogLevel.
获取操作系统资源信息-Sun平台下的扩展
JDK5.0扩展了操作系统的MBean,以此可以获取一下系统资源的信息,如:
∙处理的CPU
∙总共的和空闲的物理内存
∙可获得的虚拟内存。
(即保证可以分配给运行的进程的虚拟内存)
∙总共的和空闲的交换区
∙打开的文件总数(只能在Unix下使用)
当打开MBeans标签下的OperatingSystemMBean,你可以看到平台可以执行的所有属性和操作。
你可以监控任何一个属性随时间的变化——如,CPU时间-双击属性的值域部分。
Figure17:
MBeansTabOS.
除此之外,VM标签和Summary标签提供了操作系统资源的一些信息
管理应用的MBean
被监控的SampleTest应用有它自己的HelloMBean:
com.sun.example:
type=Hello如果CacheSize属性发生改变,HelloMBean将会发送一个通知。
你可以和管理平台的MBeans一样使用MBeans标签页来管理你的应用的MBean。
例如,当CacheSize属性变化的时候你想监控。
你首先可以在Notification标签页中订阅。
如果你改变CacheSize,你可以看到一个通知被发送。
Figure18:
Notifications.
相关信息
∙MonitoringandManagementfortheJavaPlatform
∙MonitoringandManagementTools
配置tomcat使用jconsole
修改catalina脚本
Windows平台:
修改catalina.bat,在dorun和dostart段开头增加一行(注意是一行):
setJAVA_OPTS=%JAVA_OPTS%-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port="9004"
-Dcom.sun.management.jmxremote.authenticate="false"-Dcom.sun.management.jmxremote.ssl="false"
Unix/Linux平台:
修改catalina.sh,在dorun和dostart段开头增加一行(注意是一行):
JAVA_OPTS="$JAVA_OPTS"-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port="9004"
-Dcom.sun.management.jmxremote.authenticate="false"-Dcom.sun.management.jmxremote.ssl="false"
启动jconsole
启动tomcat之后,根据上文中的jconsole简介中的命令启动jconsole,如果是在服务器本地运行jconsole,会出现如下界面:
直接进行连接即可。
如果是远程监控,需要点击远程选项卡并输入相关信息,示例如下:
“主机名或ip”处填写需要监视的主机ip,端口