监控的和管理的Java SE 6平台应用
2009-09-12 12:36
573 查看
http://www.sun.com/bigadmin/hubs/multilingual/simp_chinese/content/monitoring.jsp
BigAdmin System Administration Portal
监控的和管理的Java SE 6平台应用
Print-friendly Version
Submit Link or Content to BigAdmin
| Tag This Page
Like this page? Tag it:
Submit a link or your own content to BigAdmin and earn BigAdmin Bucks!
* Submit Content
* Check BigAdmin Bucks
<div align="right" class="pad2x8">
<b class="small"><a class="small" href="/bigadmin/common/submittals.jsp">Submit Content</a></b> |
<b class="small"><a class="small" href="/bigadmin/giveaway/">Check BigAdmin Bucks</a></b>
</div>
翻译免责声明:
这篇文章由计算机软件程序翻译,并进行了一些人工处理和后编辑,以为读者提供方便。这篇翻译文章“按原样”提供,对于翻译文本或页面中所有内容的正确性或
完整性,Sun 公司不作任何陈述或保证,也不承担任何责任。有关使用本网站和工具的其他条款和条件,请参阅本网站的《使用条款》。
l10nKey='monitoring';l10nCurrentLocale='zh-CN';checkLocaleLinker();
BigAdmin System Administration Portal
监控的和管理的Java SE 6平台应用
Print-friendly Version
Submit Link or Content to BigAdmin
| Tag This Page
Like this page? Tag it:
'del.icio.us' | |
'digg' | |
'slashdot' | |
'technorati' |
* Submit Content
* Check BigAdmin Bucks
<div align="right" class="pad2x8">
<b class="small"><a class="small" href="/bigadmin/common/submittals.jsp">Submit Content</a></b> |
<b class="small"><a class="small" href="/bigadmin/giveaway/">Check BigAdmin Bucks</a></b>
</div>
翻译免责声明:
这篇文章由计算机软件程序翻译,并进行了一些人工处理和后编辑,以为读者提供方便。这篇翻译文章“按原样”提供,对于翻译文本或页面中所有内容的正确性或
完整性,Sun 公司不作任何陈述或保证,也不承担任何责任。有关使用本网站和工具的其他条款和条件,请参阅本网站的《使用条款》。
l10nKey='monitoring';l10nCurrentLocale='zh-CN';checkLocaleLinker();
a.l10n_selector_icon {border: 1px solid #E76F00;background-color:#fff;padding: 4px 0px 0px 2px;margin-left:3px;}a.l10n_selector_icon:hover {background-color: #FFC726;text-decoration:none;}#l10n_selector_block{float:right;padding:2px;margin:3px 3px 6px 3px;clear:right;display:none;} Compare Translations 文章索引 应用程序比预期的运行速度慢或比以前运行地慢,或者这个应用程序无响应或挂起。您在生产或在开发期间可能遇到这些情况。这些问题的根源是什么?通常,起因 -- 例如内存泄漏、死锁和同步问题 -- 是很难诊断的。第6版Java平台,标准版(Java SE) 提供了现成的监视和管理功能,以帮助您诊断许多共同的Java SE问题。 这篇文章是监视和管理Java SE 6应用程序的一个简短课程。它首先描述Java SE应用程序中共同的问题和它们的症状。其次,它提供了Java SE 6的监视和管理功能概要。最后,它描述如何使用各种各样的Java开发套件 (JDK)工具诊断这些问题。 注:针对Java SE平台规范的所有API附加项或其他改进都需要经过JSR 270专家组 的审核和批准。 Java SE应用程序共同的问题
内存不足 Java虚拟机(JVM)* 有以下类型的内存:堆内存 、非堆内存 和本机内存。 堆内存 是为所有类实例和数组分配内存的运行时数据区域。非堆内存 包括对JVM进行内部处理或优化所需的方法区域和内存。它存放每个类的结构,例如一个运行时常数池、字段和方法数据,以及方法和构造函数代码。本机内存 是操作系统处理的虚拟内存。当内存不足,无法分配给应用程序时,即抛出 java.lang.OutOfMemoryError 。 以下错误信息即为每种类型的内存可能抛出的 OutOfMemoryErrors 错误消息: 堆内存错误。 当应用程序创建一个新的对象,但是堆没有充足的空间,并且不可能进一步被扩展时,将抛出 OutOfMemoryError 与以下错误信息:
永久保存区 是HotSpot VM 实现中的一个非堆内存区,用于存放每个类结构和驻留的字符串 。当这个永久保存区充满时,这个应用程序将不能装载类或分配驻留的字符串,并且会抛出 OutOfMemoryError 与以下错误信息:
Java本机接口 (JNI)代码或应用程序的本机库以及JVM实施从本机堆分配内存。当分派在本机堆发生故障时,抛出 OutOfMemoryError 。例如,以下错误信息表明交换空间不足,这可能由于操作系统的配置问题所致,或由于系统中的另一个进程消耗过多内存:
(PDF)获取相关信息,或使用诸如NetBeans IDE Profiler 之类的分析工具。 内存泄漏 JVM负责自动管理内存,为应有程序索还尚未使用的内存。然而,如果应用程序持续引用它不再需要的对象,这个对象便不能被垃圾回收,它将继续占用空间,直到被删除为止。这种无意识的对象保留称为内存泄漏 。如果应用程序泄漏很多内存,它最终将用尽内存,并且抛出 OutOfMemoryError 。另外,垃圾回收也会常常发生,因为应用程序尝试释放空间,因而造成应用程序运行减慢。 Finalizer OutOfMemoryError 的另一个可能原因是对finalizer的过分使用。 java.lang.Object 类有一个被保护的方法叫finalize 。类可以忽略此 finalize 方法,以在该类的对象被垃圾回收之前处理系统资源或执行清理。可以被对象调用的 finalize 方法称为该对象的finalizer 。不保证finalizer何时运行,也不保证它可以运行。有finalizer的对象在其 finalizer 运行之前都不会被垃圾回收。因此,为最终完成而挂起的对象将保留内存,即使对象不再被该应用程序引用也是如此,这还可能导致与内存泄漏相似的问题。 死锁 当两个或多个线程都等待另一个线程释放锁时,就会发生死锁。Java编程语言使用监视器来同步线程。每个对象都同一个监视器联系在一起,也被称为对象监视器。如果线程在对象上调用一个 synchronized 方法,则该对象被锁定。另一个线程若在此相同对象上调用 synchronized 方法,则会被阻拦,直至锁被释放为止。除内置的同步支持以外,在 J2SE 5.0 中引入的java.util.concurrent.locks 包为锁定和等待条件提供了一个框架。死锁可能涉及对象监视器和 java.util.concurrent 锁。 一般情况下,死锁会导致这种应用程序或它的一部分变得无响应。例如,如果负责图形用户界面 (GUI)更新的进程被锁死, GUI应用程序则会冻结,并且不响应任何用户动作。 循环线程 循环线程也可能造成应用程序挂起。当一个或多个线程在一个死循环中执行时,这个循环也许会消耗所有可利用的CPU周期并造成这种应用程序的其余部分无响应。 严重的锁争用 同步在多线程应用程序中大量使用,这是为了保证对一种共享资源的独占访问或为了在多个线程间协调和完成任务。例如,应用程序在数据结构上使用一台对 象监视器同步更新。当两个线程试图同时更新数据结构时,只有一个线程能获取对象监视器和继续更新数据结构。同时,另一个线程被阻拦, 等待进入 synchronized 块,直到第一个线程完成它的更新并释放对象监视器。同步争用情况会影响应用程序的性能和可扩展性。 Java SE 6平台的监视和管理能力 。 JConsole是允许您监测各种各样的VM资源运行时使用情况的Java监视和管理控制台。它使您注意到前面部分描述的应用程序执行过程中出现的症状。您可以使用JConsole连接到在同一机器上本地运行的应用程序或在不同机器上远程运行的应用程序,监测以下信息: 内存使用和垃圾回收活动 线程状态、线程堆栈检索和锁 等待最终完成的对象数目 运行时信息,例如正常运行时间和进程消耗的CPU时间 VM信息,例如JVM的输入参数和应用程序类路径 另外, Java SE 6还包括其他命令行实用工具。 jstat 命令打印各种各样的VM统计数据,包括内存使用、垃圾回收时间、类加载和及时编译器统计。 jmap 命令允许您获得运行时的堆直方图和堆转储。 jhat 命令允许您分析堆转储。 jstack 命令允许您获得线程堆栈跟踪。这些诊断工具可以附加到任何应用程序,不需要以特别方式启动。 用JDK工具诊断 SE问题。JDK工具使您得到关于应用程序的更多诊断信息和帮助,以便确定应用程序是否按预想的正常运行。在某些情况下,诊断信息可能很充足,能够帮助您 诊断问题和辨认它的起因。其他情况下,您可能需要使用分析工具或调试器来调试问题。 关于每个工具的详情,参见Java SE 6工具文献。 诊断内存泄漏的方法 内存泄漏可能需要很长时间才能再现,特别是在它仅发生在非常罕见或稀少的情况下时。理想情况下,开发人员会在 OutOfMemoryError 发生前先诊断到内存泄漏。 首先,使用JConsole监测内存使用是否连续地增长。这是可能的内存泄漏的征兆。图1显示连接到应用程序MemLeak的JConsole内存选项卡,图中显示内存使用持续增长。您还可以在内存选卡的插入框中观察到垃圾回收(GC)活动。
jstat 命令监测如下内存使用和垃圾回收统计数据:
jstat - gcutil 选项打印所运行应用程序进程ID <pid> 在指定抽样间隔 <interval> 下, <count> 次的堆使用及垃圾回收时间摘要。这产生出以下样例输出:
jstat 输出和其他选项的详情,参见 jstat 手册页 。 堆直方图 当您怀疑应用程序出现内存泄漏时, jmap 命令将帮助您得到显示每类统计的堆直方图,包括事例的总数和每类事例所占的总字节数。使用以下命令行:
jmap - histo 选项请求所运行应用程序进程ID <pid> 的堆直方图。您可以指定 live 子选项,以便 jmap 只计入堆中的活动对象。要计入所有对象(包括不能获得的对象),使用以下命令行:
其实例占用异常大的内存。 类实例的数量以非常高的速率随着时间的推移增长。 您以为会是要回收垃圾的类实例并不是垃圾。 前面 jmap 实用工具得到的堆直方图表明 LeakingClass 和它的数组有最大的实例计数,因此它有泄漏嫌疑。 堆直方图有时可以提供您诊断内存泄漏所需的信息。例如,如果应用程序仅在几个地方使用泄漏类,便能容易地找出泄漏原代码。另一方面,如果泄漏类使用非常广泛,例如 java.lang.String 类,您将需要追踪对象的引用并通过分析堆转储来做进一步诊断。 堆转储 您可以用以下任何一种方式获得堆转储。首先,您可以使用 jmap 命令借助以下命令行得到堆转储:
jmap -dump 选项要求将运行中应用程序进程 <pid> 的堆转储写入指定的文件 heap.dump.out 。与 - histo 选项类似, live 子选项是可选的,它用于指定仅转储Live对象。 第二种方法是通过调用HotSpotDiagnostic MBean的 dumpHeap 操作从JConsole中获得堆转储,如图2所示。
现在您已了解了两种于运行时获得堆转储的方法。您还可以通过设置 HeapDumpOnOutOfMemoryError HotSpot VM选项,请求在第一次抛出 OutOfMemoryError 时创建堆转储。启动应用程序时,您可以在命令行中设置这个选项:
jinfo 命令,在应用程序运行时进行设置。
setVMOption 操作,用JConsole设置 HeapDumpOnOutOfMemoryError 选项,如图 3 所示。
OutOfMemoryError 时,将自动创建名为 java_pid<pid>.hprof 的堆转储文件:
一旦您具有了堆转储,即可以使用 jhat 命令进行堆分析和确定哪些引用使泄漏嫌疑一直存在:
jhat 实用程序(原 HAT 堆分析工具)读取堆转储,并在指定的端口上启动http服务器。然后您可以使用任何浏览器连接到服务器,并且针对指定的堆转储执行查询。图4显示了 jhat 分析的堆转储中除 java.* 和 javax.* 之外的所有类。这个工具支持许多查询,其中包括: 显示从根集到给定对象的所有引用路径。此查询对发现内存泄漏特别有用。 显示所有类的实例计数。 显示包括所有类的实例计数和大小的堆直方图。 显示finalizer摘要。
java.lang.String 对象,可以在 OQL 查询 页中输入以下查询:
诊断Finalizer被过分使用的方法 对finalizer的过分使用会保留内存,并阻止应用程序快速回收该内存。这种过分使用可能导致 OutOfMemoryError 。如图5所示,您可以使用JConsole监测待完成的暂挂对象的数量。
描述的 jhat 找出堆转储中有哪些可完成的对象。 另外,在Solaris和Linux操作系统上,您可以使用 jmap 实用程序查找可完成对象的类:
诊断死锁的方法 Java SE 6提供了两种非常方便的方式,可以发现应用程序中是否出现了死锁,并且还增强了死锁检测工具,以支持 java.util.concurrent 锁。JConsole和 jstack 命令都可以查找与对象监视器有关的死锁 -- 即使用 synchronized 关键字获得的锁 -- 或 java.util.concurrent 可拥有同步器 的死锁。 图6显示在Deadlock应用程序中有两个死锁,死锁2选项卡显示在对象监视器上被阻拦的三个死锁线程。每个死锁选项卡显示包含死锁的线程,标识线程在哪个锁上被阻拦,并且指明哪个线程拥有该锁。
jstack 实用程序得到线程转储和查出死锁:
jstack 样例输出的下半部分,该输出查出了一个涉及 java.util.concurrent 可拥有同步器的死锁。
诊断循还线程的方法 不断增长的CPU使用量是循还线程的一个征兆。JTop是显示应用程序每个线程的CPU时间使用情况的JDK演示。JTop按CPU使用量排序线程,从而允许您轻松查出CPU时间量非常高的线程。如果高线程CPU消耗与预期行为不符,那么该线程可能是循还线程。 您可以将JTop作为独立的GUI运行:
LoopingThread 使用的高CUP时间量在不断增加,这即是一个疑点。开发人员应该审查该线程的源代码,以查看它是否包含死循环。
诊断严重锁争用的方法 确定哪些锁是瓶颈的过程可能相当困难。JDK提供了每个线程的争用统计(如对象监视器上的锁阻拦或等待次数)及锁争用中花费的总累积时间。有关线程在对象监视器上阻拦或等待次数的信息,总是可以从JConsole线程选项卡中显示的线程信息中找到,如图8所示。
ThreadContentionMonitoringEnabled 属性设置为 true 来启用对线程争夺时间的监视,如图9所示。
getThreadInfo 操作,取得线程阻拦的总累积时间,如图10所示。
jstat 命令打印各种VM统计数据,其中包括内存使用情况和垃圾回收时间。 jmap 命令允许您获得运行时的堆直方图和堆转储。 jhat 命令允许您分析堆转储。 jstack 命令允许您获得线程堆栈跟踪。这些诊断工具可以附加到任何应用程序,不需要以特别方式启动。借助这些工具,您可以更加高效地诊断应用程序中的问题。 |
相关文章推荐
- 智能家居通用管理平台(九) – 监控程序的设计
- 文思海辉技术有限公司——流程管理架构平台应用
- 推荐新浪应用平台的项目在线管理软件-禅道管理
- 中国SOC安全管理平台市场应用现状调查
- 关于ceph监控管理平台的一点个人观点
- 实时应用监控平台cat——服务器启动流程(一)
- 浙江交通基础信息应用平台及公路信息管理系统建设项目
- 心得3--打包web应用 war 与 Tomcat服务器的管理平台
- 【VMCloud云平台】SCOM配置(四)-监控应用可用性
- 基于大数据分析的安全管理平台技术研究及应用
- 全球顶级应用性能监控管理服务商分析
- 蒲公英---高效安全的内侧应用发布、管理平台
- 基于大数据分析的安全管理平台技术研究及应用
- SpringBoot应用的监控与管理
- 实时应用系统监控平台
- 微软WCF应用高级进阶(分布式+异步调用+安全+通信模式)配销售管理平台项目实战
- Mocha BSM应用管理——J2EE应用服务器监控与管理
- 构建LAMP平台及应用系统 部署phpMyAdmin系统(用网页的形式管理MySQL)
- Dubbo管理平台和监控平台部署