- 浏览: 682238 次
- 性别:
- 来自: 北京
最新评论
-
sparksun007:
licoolxue 写道选择封装元素那个快捷键太帅了,谢了不就 ...
我的Eclipse快捷键 -
sparksun007:
skying007 写道CTL+SHIFT+R查找资源,博主为 ...
我的Eclipse快捷键 -
sparksun007:
licoolxue 写道选择封装元素那个快捷键太帅了,谢了具体 ...
我的Eclipse快捷键 -
sparksun007:
lseeo 写道第五张图,复制好的在To里,为啥第六章图就全部 ...
JVM调优总结(六)-分代垃圾回收详述2 -
sparksun007:
284885166 写道xj20305 写道请问第2个图到第三 ...
JVM调优总结(六)-分代垃圾回收详述2
一篇Sun官方网站上介绍JConsole使用的文章,前段时间性能测试的时候大概翻译了一下以便学习,今天整理一下发上来,有些地方也不知道怎么翻,就保留了原文,可能还好理解点,呵呵,水平有限,翻的不好,大家多多包涵。
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等信息。
Figure 2: Local Tab.
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和JMX Rmote的应用。
当JConsole成功建立连接,它从连接上的JMX代理处获取信息,并且以下面几个标签页呈现信息。
- Summary tab. 监控JVM和一些监控变量的信息。
- Memory tab. 内存使用信息
- Threads tab. 线程使用信息
- Classes tab. 类调用信息
- VM tab. JVM的信息
- MBeans tab.所有MBeans的信息
MBeans tab展示了所有以一般形式注册到JVM上的MBeans。MBeans tab允许你获取所有的平台信息,包括那些不能从其他标签页获取到的信息。注意,其他标签页上的一些信息也在MBeans这里显示。另外,你可以使用 MBeans标签管理你自己的应用的MBeans
使用MBeans Tab监控和管理MBean
注册到JMX代理的平台或者应用的MBeans,可以通过MBeans标签获取。例如,内存的MBeans如下面定义
public interface MemoryMXBean { public MemoryUsage getHeapMemoryUsage(); public MemoryUsage getNonHeapMemoryUsage(); public int getObjectPendingFinalizationCount(); public boolean isVerbose(); public void setVerbose(boolean value); public void gc(); }
内存的MBean包括四个属性:
-
HeapMemoryUsage
. 用于描述当前堆内存使用情况的只读属性 -
NonHeapMemoryUsage
. 用于描述当前的非堆内存的使用情况的只读属性 -
ObjectPendingFinalizationCount
.用于描述有多少对象被挂起以便回收。 -
Verbose
.用于动态设置GC是否跟着详细的堆栈信息,为一个布尔变量
Figure 3: MBeans Tab.
左边的树形结构以名字的方式展示了所有MBeans的列表。一个MBean对象的名字由一个域的名字和一串关键字属性组成。例如,JVM的平台的MBeans是在“java.lang”域下的一组,而日志的MBeans则在"java.util.logging
"域下。MBean对象的名字在javax.management.ObjectName
规范中定义。
当你在树中选中一个MBean,属性,方法,或者通知等一些信息会再右边显示出来。如果属性是可写的(属性被标志为蓝色),你可以进行设置。你可以操作在Operations
tab中列出的操作。你也可以看到由MBean发送出来的通知:默认情况,如果你不订阅通知的话,JConsole不会收到MBean发生过来的通知。你可以点击"Subscribe
"(订阅)按钮来堆通知进行定义,而使用"Unsubscribe
"按钮来取消订阅
Figure 4: MBeans Notification.
监控内存
内存标签页通过读取内存系统、内存池、垃圾回收的MBean来获取对内存消耗、内存池、垃圾回收的情况的统计。
图:
上图展示了内存随时间变化的使用情况。有对堆的、非堆的以及特殊内存池的统计。内存池信息是否能被获取,取决与使用的Java虚拟机。下面列表展示了HotSpot虚拟机的内存池情况。
Eden Space (heap): 内存最初从这个线程池分配给大部分对象。
Survivor Space (heap):用于保存在eden space内存池中经过垃圾回收后没有被回收的对象。
Tenured Generation (heap):用于保持已经在 survivor
space内存池中存在了一段时间的对象。
Permanent Generation (non-heap):
保存虚拟机自己的静态(refective)数据,例如类(class)和方法(method)对象。Java虚拟机共享这些类数据。这个区域被分割为只读的和只写的,
Code Cache (non-heap):HotSpot Java虚拟机包括一个用于编译和保存本地代码(native
code)的内存,叫做“代码缓存区”(code cache)
详细信息区域给出一些当前线程的信息:
Used
:已使用:当前的内存使用量。使用的内存包括所有对象(能被获取和不能被获取的)所占用的内存。
Committed
:分配量:Java虚拟机保证能够获取到的内存量。分配内存(committedmemory)的量可能随时间改变。Java虚拟机可能释放部分这里的内存给系统,相应的分配的内存这时可能少于初始化时分配的给它的量。分配量总数大于或等于已使用的内存量。
Max
:内存管理系统可以使用的最大内存量。这个值可以被改变或者不做设定。如果JVM试图增加使用的内存到大于分配量(committedmemory)的情况,内存分配可能失败,即便想使用的内存量小于或者等于最大值(如:系统虚拟内存比较低时)
Usage Threshold The usage threshold of a memory pool.
This field will only beshown if the memory pool supports usage threshold.
GC time
:垃圾回收使用的总时间和调用垃圾回收的次数。它可能有好几行,每行代表JVM使用的垃圾回收算法。(
右下角的棒状图表显示了被JVM的内存池消耗的内存。如果内存使用超过 usage
threshold,则棒会变红。usagethreshold是用于支持内存检查的Memory Pool
MBean的一个属性。MemoryPoolMXBean定义了一系列方法用于检查内存。
public interface MemoryPoolMXBean
{
....
// Usage threshold
public long getUsageThreshold();
public void setUsageThreshold(long threshold);
public boolean
isUsageThresholdExceeded();
public boolean isUsageThresholdSupported();
// Collection usage threshold
public long
getCollectionUsageThreshold();
public void
setCollectionUsageThreshold(long threshold);
public boolean
isCollectionUsageThresholdSupported();
public boolean
isCollectionUsageThresholdExceeded();
}
每种内存池可能有两种内存初始话支持: usage threshold和collection usage
threshold特殊的内存池可能两种都不支持。
usage threshold是内存池中一个可管理的属性。它使用低负荷的内存监控。设置usage
threshold为正值则usage threshold检查内存池。设置usage
threshold为零,则关闭检查。默认值由JVM设置。JVM一般让usage
threshold在最合适的时候检查内存,典型的在GC的过程中和某些分配内存的时候。如果JVM发现当前的内存使用超过了usage
threshold,它将会把UsageThresholdExceeded
属性设置为true
有些内存池可能不支持usage
threshold。你可以使用UsageThresholdSupported属性来判断一个内存池是否支持
usage
threshold。例如,一个比较完善(generational garbage collector)的垃圾回收器(如HotSpot的虚拟机),most
of the objects are allocated in the young generation,从eden内存池中产生。eden
pool被设计成可以被装满;再eden pool中执行垃圾回收将会释放他
Collection usage
threshold是可进行垃圾回收的内存池的一个可配置属性。JVM堆一个内存池进行垃圾回收以后,此内存池中的一些内存仍然被那些没有被回收的对象占用。collection
usage threshold仅允许你在垃圾回收后对内存进行检查。如果JVM发现可用内存超出collection usage
threshold,它将会设置CollectionUsageThresholdExceeded
属性为true。
你可以使用CollectionUsageThresholdSupported
属性来控制内存池释放支持 collection
usage threshold.
usage threshold 和collection usage
threshold是MBean标签中的一组。例如,在左边的树形结构中选择TenuredGen,设置tenured generation memory
pool的usage threshold为6m。如下图所示
Figure 6: Setting Usage Threshold.
当 TenuredGen
memory pool的内存使用超过6MBytes时,代表
TenuredGen
memory pool的柱状图将会呈现红色来代表使用的内存超过了usage
threshold。代表堆内存的柱状图也将变为红色。你可以选择柱状图或者在图表中指定内存池来查看某个指定内存池的信息。如果把鼠标房子柱状图上,将会显示出内存池的名字
Figure 7: Low Memory.
开启/关闭虚拟机的详细跟踪
如上所述,内存系统的MBean定义了一个叫做Verbose布尔变量,让你能动态的打开或关闭详细的GC跟踪。详细的GC跟踪,将会在JVM启动时显示。默认的HotSpot的GC详细输出为stdout
.
Figure 8: Setting Verbose GC.
死锁检查
线程标签页提供关于应用的线程运行信息
Figure 9: Threads Tab.
左下角列出了所以正在运行的线程。如果你在过滤器中输入一个字符,线程列表将仅显示线程名字包含你输入字符的线程。通过点击某个线程,你可以获取这个线程的相关信息。
线程的MBean标签提供了一些Thread标签没有提供有用的操作。
-
findMonitorDeadlockedThreads
. 如果发生线程死锁,可以通过这个检查出来。操作返回一组死锁的线程ID -
getThreadInfo
. 返回线程的信息。包括线程的名称、堆栈信息,导致当前线程阻塞的锁,如果有的话,还返回哪儿线程持有这个锁,和这个线程信息的统计。 -
getThreadCpuTime
.返回指定线程消耗的CPU时间。
Figure 10: MBeans Tab Threading.
为检查你的应用是否进入死锁(例如,你的应用挂起),你可以使用findMonitorDeadlockedThreads
操作。
Figure 11: Find Deadlocked Threads.
一旦你选择了findMonitorDeadlockedThreads
按钮,将会有一个弹出窗口显示结果。在上面例子中,JConsole连接了一个存在3个死锁线程的示例应用SampleTest。如上所示,检查出ID为12,10和11的线程死锁。想查询更多的线程信息,可以使用getThreadInfo
操作。线程的MBean支持getThreadInfo
操作的四种形式,
- 对一个给定的线程ID,给出最深的堆栈情况
- 堆一系列的线程ID,给出最深的堆栈情况
- Of a given thread ID with no stack trace.
- Of an array of thread IDs with no stack trace.
Figure 12: ThreadInfo for Thread ID = 12.
双击stackTrace属性的值域将会显示一个复合对话框,你可以在堆栈中来回查看。图13,14显示了死锁线程-1的复合对话框中的第一层堆栈和第二层堆栈。
Figure 13: Top Frame of the Stack Trace of DeadlockedThread-1.
Figure 14: Second Frame of the Stack Trace of DeadlockedThread-1.
线程标签页提供了一个友好的界面供查看线程的堆栈。你可以找到死锁线程的名字,使用getThreadInfo
查找线程信息。然后又可以使用线程标签页来分析死锁。
控制日志等级
Logging
MBean定义了LoggerNames
属性,用于描述日志名称。为找到你的应用的日志,可以选择在MBeans树中java.util.logging
下的Logging MBean,双击LoggerNames属性
Figure 15: List of All Logger Names.
Logging MBean也支持三种操作:
-
getParentLoggerName
. 返回指定logger的父logger -
getLoggerLevel
. 返回指定logger的日志等级 -
setLoggerLevel
.设置指定logger到一个新的等级
Figure 16: Setting Log Level.
获取操作系统资源信息-Sun平台下的扩展
JDK5.0扩展了操作系统的MBean,以此可以获取一下系统资源的信息,如:
- 处理的CPU
- 总共的和空闲的物理内存
- 可获得的虚拟内存。(即保证可以分配给运行的进程的虚拟内存)
- 总共的和空闲的交换区
- 打开的文件总数(只能在Unix下使用)
Figure 17: MBeans Tab OS.
除此之外,VM标签和Summary标签提供了操作系统资源的一些信息
管理应用的MBean
被监控的SampleTest应用有它自己的Hello MBean:
com.sun.example:type=Hello 如果CacheSize 属性发生改变,Hello MBean将会发送一个通知。你可以和管理平台的MBeans一样使用MBeans标签页来管理你的应用的MBean。例如,当CacheSize 属性变化的时候你想监控。你首先可以在 Notification标签页中订阅。如果你改变CacheSize,你可以看到一个通知被发送。
Figure 18: Notifications.
相关信息
评论
这句也只是说内存池是不是支持内存使用阈值(内存使用超过一定比例,就显示红色)
发表评论
-
说说IO(九)- 伟大的Cache
2011-06-06 21:21 0伟大的Cache Cache的身影在整个计算机体系中无 ... -
说说IO(八)- 三分天下
2011-06-06 21:18 4914DAS、SAN和NAS 为了满足人们不 ... -
说说IO(七)- RAID
2011-03-01 21:33 5587Raid很基础,但是在存储系统中占据非常重要的 ... -
说说IO(六)- Driver & IO Channel
2011-03-01 21:32 4762这部分值得一说的是多路径问题。IO部分的高可用性在整 ... -
说说IO(五)- 逻辑卷管理
2011-02-20 21:09 5731LVM(逻辑卷管理),位于操作系统和硬盘之间,LVM ... -
说说IO(六)- Driver & IO Channel
2011-02-20 21:06 0这部分值得一说的是多路径问题。IO部分的高可用性在整个 ... -
说说IO(七)- RAID
2011-02-20 20:53 0Raid很基础,但是在存储系统中占据非常重要的地位,所有 ... -
说说IO(五)- 逻辑卷管理
2011-02-20 19:49 0LVM(逻辑卷管理),位 ... -
说说IO(四)- 文件系统
2011-01-09 21:33 7820文件系统各有不同,其最主要的目标就是解决磁 ... -
说说IO(三)- IO性能的重要指标
2010-12-26 12:45 19519最重要的三个指标 IOPS IOPS,即每秒钟 ... -
说说IO(二)- IO模型
2010-12-20 22:52 15175这部分的东西在网络编程经常能看到,不过在所有IO处理中都 ... -
说说IO(一)- IO的分层
2010-12-20 22:06 13157IO性能对于一个系统的影响是至关重要的。一个系统经过多项 ... -
淘宝iDataForum归来
2010-12-12 21:42 4164今天参加了淘宝的iDa ... -
一次诡异的调优
2010-10-24 14:06 3612最近碰到的一个Java应用,费了半天劲还是没定位到是哪儿的问。 ... -
JVM调优总结(十二)-参考资料
2009-12-28 21:07 12168能整理出上面一些东西,也是因为站在巨人的肩上。下面是一 ... -
JVM调优总结(十一)-反思
2009-12-28 21:06 18085垃圾回收的悖论 所谓“成也萧何败萧何”。Java的垃 ... -
JVM调优总结(十)-调优方法
2009-12-20 21:03 167983JVM调优工具 Jconsole,jPr ... -
JVM调优总结(九)-新一代的垃圾回收算法
2009-12-14 22:11 23804垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一 ... -
JVM调优总结(八)-典型配置举例2
2009-12-09 20:15 19565常见配置汇总 堆 ... -
JVM调优总结(七)-典型配置举例1
2009-12-01 22:11 29694以下配置主要针对分代垃圾回收算法而言。 堆大小设 ...
相关推荐
jconsole使用手册中文版,详细描述了如何配置使用jconsole进行java程序的性能监控
### JConsole中文手册 #### 一、概述 JConsole是一款由Oracle公司提供的、基于Java Management Extensions (JMX) 的图形用户界面(GUI)工具。它主要用于监控和管理正在运行的Java虚拟机(JVM)。与一些商业软件...
**JConsole使用手册** 在Java开发和运维过程中,性能监控是一项至关重要的任务。JConsole是Java官方提供的一款强大的性能监视工具,它可以帮助我们实时监控Java应用程序的运行状态,包括内存使用、线程状态、类加载...
### jconsole远程监控配置手册(经典) #### 一、引言 本文档旨在提供一份详细的jconsole远程监控配置指南,适用于需要对生产环境中的Tomcat应用服务器进行远程监控的场景。通过本指南,用户可以了解到如何正确配置...
NULL 博文链接:https://see-you-again.iteye.com/blog/2369626
8. **故障排除**:当遇到问题时,手册会提供一系列步骤和工具,如JConsole、JFR(Java Flight Recorder)和JMC(Java Mission Control),帮助管理员定位和解决故障。 9. **数据源和JMS(Java Message Service)**...
当遇到问题时,手册提供了排查步骤和故障解决策略,包括日志分析、使用Diagnostic Framework收集诊断信息、使用JConsole等工具进行远程诊断。 九、备份与恢复策略 定期备份和恢复策略是防止数据丢失和灾难恢复的...
1. **JDK Mission Control**:JDK 1.8包含了强大的性能分析和诊断工具,如JConsole、VisualVM等,帮助开发者监控和调试Java应用。 2. **JFR(Java Flight Recorder)**:提供了一个低开销的飞行记录器,可以收集...
在Java世界中,jconsole、jvisualvm、jstack、jmap和jmc这些JDK自带的工具提供了全面的监控和诊断能力,如内存管理、线程状态、飞行记录等。 监控指标部分,手册特别强调了在Windows环境下测试过程中的关键指标。...
同时,理解JDK中的各种工具,如jconsole、jmap、jstack等,对于诊断和解决问题也至关重要。 总的来说,《JDK开发手册》是一份全面且深入的Java开发指南,无论是在项目初期的学习阶段,还是在后期的优化调整过程中,...
7. **Java可视化工具集(JConsole、VisualVM等)**:这些工具提供了一种图形化的方式来监控和分析Java应用程序的性能,包括内存使用、线程状态、CPU消耗等。 8. **Java Mission Control(JMC)**:这是一个高级的...
安装后,用户可通过TongWeb6.1的开始向导熟悉服务器目录结构、启动服务器、访问管理控制台、JConsole以及如何停止服务器。手册中还提供了卸载TongWeb6.1的详细步骤。 应用管理部分,手册讲解了TongWeb6.1支持的应用...
JConsole的引入,提供了图形化的性能监控和管理工具。 总的来说,《Java JDK6.0 API参考手册》涵盖了这个版本中的所有核心API,包括基本类型、类库、异常处理、多线程、反射、注解等,是Java开发人员不可或缺的工具...
例如,通过`jstat`或`jconsole`工具可以分析Java应用的内存使用和GC行为。 然后是"WEB服务器",如Apache或Nginx。运维人员需要配置和管理服务器的虚拟主机,确保网站的正常访问,同时要关注服务器的访问日志,如`/...
WebLogic Server提供了各种监控工具,如JConsole、WLST(WebLogic Scripting Tool)和日志文件,用于诊断和解决问题。这些工具可以帮助管理员监控服务器状态、跟踪性能瓶颈和调试应用程序。 11. **Oracle培训教材*...
8. **故障排查**:学习如何读取和分析WebLogic的日志文件,以及使用诊断工具如JConsole、VisualVM等定位和解决问题。 9. **集群与高可用性**:理解WebLogic集群的概念,配置负载均衡,了解故障转移和恢复机制。 10...
这部分内容可能涉及如何使用JConsole、VisualVM等工具来监控Java虚拟机(JVM)的性能,包括CPU使用率、内存消耗、线程状态等。 - JVM查看工具可以帮助管理员识别性能瓶颈,优化应用配置,以及诊断可能出现的错误或...
《VisualVM操作手册》 VisualVM是一款强大的Java应用程序性能分析工具,它整合了多种JDK命令行工具,如jstat、JConsole、jstack、jmap和jinfo,提供了丰富的功能,包括数据生成与分析、内存泄漏追踪、垃圾回收监控...