`
hpjianhua
  • 浏览: 241670 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类

关于 Java 性能监控您不知道的 5 件事,第 2 部分

阅读更多
简介: 如果 JDK 中配置有全功能分析器 JConsole 对于您还是条新闻的话,本文中将介绍的 5 个独立分析实用程序可能会使您感到更加惊奇。您将了解轻量级(有时是实验型) Java™ 进程监控和分析工具如何帮助您应对线程饥饿、死锁及对象泄露等性能瓶颈问题。

全功能内置分析器,如 JConsole 和 VisualVM 的成本有时比它们的性能费用还要高 — 尤其是在生产软件上运行的系统中。因此,在聚焦 Java 性能监控的第 2 篇文章中,我将介绍 5 个命令行分析工具,使开发人员仅关注运行的 Java 进程的一个方面。

JDK 包括很多命令行实用程序,可以用于监控和管理 Java 应用程序性能。虽然大多数这类应用程序都被标注为 “实验型”,在技术上不受支持,但是它们很有用。有些甚至是特定用途工具的种子材料,可以使用 JVMTI 或 JDI(参见 参考资料)建立。

1. jps (sun.tools.jps)

很多命令行工具都要求您识别您希望监控的 Java 进程。这与监控本地操作系统进程、同样需要一个程序识别器的同类工具没有太大区别。

“VMID” 识别器与本地操作系统进程识别器(“pid”)并不总是相同的,这就是我们需要 JDK jps 实用程序的原因。

在 Java 进程中使用 jps与配置 JDK 的大部分工具及本文中提及的所有工具一样,可执行 jps 通常是一个围绕 Java 类或执行大多数工作的类集的一个薄包装。在 Windows® 环境下,这些工具是 .exe 文件,使用 JNI Invocation API 直接调用上面提及的类;在 UNIX® 环境下,大多数工具是一个 shell 脚本的符号链接,该脚本采用指定的正确类名称开始一个普通启动程序。

如果您希望在 Java 进程中使用 jps(或者任何其他工具)的功能 — Ant 脚本 — 仅在每个工具的 “主” 类上调用 main() 相对容易。为了简化引用,类名称出现在每个工具名称之后的括号内。
jps — 名称反映了在大多数 UNIX 系统上发现的 ps 实用程序 — 告诉我们运行 Java 应用程序的 JVMID。顾名思义,jps 返回指定机器上运行的所有已发现的 Java 进程的 VMID。如果 jps 没有发现进程,并不意味着无法附加或研究 Java 进程,而只是意味着它并未宣传自己的可用性。

如果发现 Java 进程,jps 将列出启用它的命令行。这种区分 Java 进程的方法非常重要,因为只要涉及操作系统,所有的 Java 进程都被统称为 “java”。在大多数情况下,VMID 是值得注意的重要数字。

使用分析器开始

使用分析实用程序开始的最简单方法是使用一个如在 demo/jfc/SwingSet2 中发现的 SwingSet2 演示一样的演示程序。这样就可以避免程序作为背景/监控程序运行时出现挂起的可能性。当您了解工具及其费用后,就可以在实际程序中进行试用。

加载演示应用程序后,运行 jps 并注意返回的 vmid。为了获得更好的效果,采用 -Dcom.sun.management.jmxremote 属性集启动 Java 进程。如果没有使用该设置,部分下列工具收集的部分数据可能不可用。


--------------------------------------------------------------------------------
2. jstat (sun.tools.jstat)

jstat 实用程序可以用于收集各种各样不同的统计数据。jstat 统计数据被分类到 “选项” 中,这些选项在命令行中被指定作为第一参数。对于 JDK 1.6 来说,您可以通过采用命令 -options 运行 jstat 查看可用的选项清单。清单 1 中显示了部分选项:


清单 1. jstat 选项

-class
-compiler
-gc
-gccapacity
-gccause
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcpermcapacity
-gcutil
-printcompilation 
 

实用程序的 JDK 记录(参见 参考资料)将告诉您清单 1 中每个选项返回的内容,但是其中大多数用于收集垃圾的收集器或者其部件的性能信息。-class 选项显示了加载及未加载的类(使其成为检测应用程序服务器或代码中 ClassLoader 泄露的重要实用程序,且 -compiler 和 -printcompilation 都显示了有关 Hotspot JIT 编译程序的信息。

默认情况下,jstat 在您核对信息时显示信息。如果您希望每隔一定时间拍摄快照,请在 -options 指令后以毫秒为单位指定间隔时间。jstat 将持续显示监控进程信息的快照。如果您希望 jstat 在终止前进行特定数量的快照,在间隔时间/时间值后指定该数字。

如果 5756 是几分钟前开始的运行 SwingSet2 程序的 VMID,那么下列命令将告诉 jstat 每 250 毫秒为 10 个佚代执行一次 gc 快照转储,然后停止:

jstat -gc 5756 250 10



请注意 Sun(现在的 Oracle)保留了在不进行任何预先通知的情况下更改各种选项的输出甚至是选项本身的权利。这是使用不受支持实用程序的缺点。请参看 Javadocs 了解 jstat 输出中每一列的全部细节。


--------------------------------------------------------------------------------
3. jstack (sun.tools.jstack)

了解 Java 进程及其对应的执行线程内部发生的情况是一种常见的诊断挑战。例如,当一个应用程序突然停止进程时,很明显出现了资源耗尽,但是仅通过查看代码无法明确知道何处出现资源耗尽,且为什么会发生。

jstack 是一个可以返回在应用程序上运行的各种各样线程的一个完整转储的实用程序,您可以使用它查明问题。

采用期望进程的 VMID 运行 jstack 会产生一个堆转储。就这一点而言,jstack 与在控制台窗口内按 Ctrl-Break 键起同样的作用,在控制台窗口中,Java 进程正在运行或调用 VM 内每个 Thread 对象上的 Thread.getAllStackTraces() 或 Thread.dumpStack()。jstack 调用也转储关于在 VM 内运行的非 Java 线程的信息,这些线程作为 Thread 对象并不总是可用的。

jstack 的 -l 参数提供了一个较长的转储,包括关于每个 Java 线程持有锁的更多详细信息,因此发现(和 squash)死锁或可伸缩性 bug 是极其重要的。


--------------------------------------------------------------------------------
4. jmap (sun.tools.jmap)

有时,您正在处理的问题是一个对象泄露,如一个 ArrayList (可能持有成千上万个对象)该释放时没有释放。另一个更普遍的问题是,看似从不会压缩的扩展堆,却有活跃的垃圾收集。

当您努力寻找一个对象泄露时,在指定时刻对堆及时进行拍照,然后审查其中内容非常有用。jmap 通过对堆拍摄快照来提供该功能的第一部分。然后您可以采用下一部分中描述的 jhat 实用程序分析堆数据。

与这里描述的其他所有实用程序一样,使用 jmap 非常简单。将 jmap 指向您希望拍快照的 Java 进程的 VMID,然后给予它部分参数,用来描述产生的结果文件。您要传递给 jmap 的选项包括转储文件的名称以及是否使用一个文本文件或二进制文件。二进制文件是最有用的选项,但是只有当与某一种索引工具 结合使用时 — 通过十六进制值的文本手动操作数百兆字节不是最好的方法。

随意看一下 Java 堆的更多信息,jmap 同样支持 -histo 选项。-histo 产生一个对象文本柱状图,现在在堆中大量引用,由特定类型消耗的字节总数分类。它同样给出了特定类型的总示例数量,支持部分原始计算,并猜测每个实例的相对成本。

不幸的是,jmap 没有像 jstat 一样的 period-and-max-count 选项,但是将 jmap(或 jmap.main())调用放入 shell 脚本或其他类的循环,周期性地拍摄快照相对简单。(事实上,这是加入 jmap 的一个好的扩展,不管是作为 OpenJDK 本身的源补丁,还是作为其他实用程序的扩展。)


--------------------------------------------------------------------------------
5. jhat (com.sun.tools.hat.Main)

将堆转储至一个二进制文件后,您就可以使用 jhat 分析二进制堆转储文件。jhat 创建一个 HTTP/HTML 服务器,该服务器可以在浏览器中被浏览,提供一个关于堆的 object-by-object 视图,及时冻结。根据对象引用草率处理堆可能会非常可笑,您可以通过对总体混乱进行某种自动分析而获得更好的服务。幸运的是,jhat 支持 OQL 语法进行这样的分析。

例如,对所有含有超过 100 个字符的 String 运行 OQL 查询看起来如下:

select s from java.lang.String s where s.count >= 100



结果作为对象链接显示,然后展示该对象的完整内容,字段引用作为可以解除引用的其他链接的其他对象。OQL 查询同样可以调用对象的方法,将正则表达式作为查询的一部分,并使用内置查询工具。一种查询工具,referrers() 函数,显示了引用指定类型对象的所有引用。下面是寻找所有参考 File 对象的查询:

select referrers(f) from java.io.File f



您可以查找 OQL 的完整语法及其在 jhat 浏览器环境内 “OQL Help” 页面上的特性。将 jhat 与 OQL 相结合是对行为不当的堆进行对象调查的有效方法。


--------------------------------------------------------------------------------
结束语

当您需要近距离观察 Java 进程内发生的事情时,JDK 的分析扩展会非常有用。本文中介绍的所有工具都可以从命令行中由其自己使用。它们还可以与 JConsole 或 VisualVM 有力地结合使用。JConsole 和 VisualVM 提供 Java 虚拟机的总体视图,jstat 和 jmap 等有针对性的工具支持您对研究进行微调。

转载自:http://www.ibm.com/developerworks/cn/java/j-5things8.html
分享到:
评论

相关推荐

    java虚拟机性能监控

    ### Java虚拟机性能监控 #### 一、引言 在当今快速发展的信息技术领域,Java作为最流行的编程语言之一,其虚拟机(Java Virtual Machine, JVM)的性能优化和监控成为了确保应用程序高效稳定运行的关键因素。Java...

    Java性能监控工具Jprofiler4.3.2

    Java性能监控工具JProfiler是Java开发中的重要辅助软件,它为开发者提供了深入的性能分析功能,帮助优化应用程序的运行效率。JProfiler 4.3.2版本是该工具的一个历史版本,虽然较新版本可能拥有更多特性,但4.3.2...

    Java生产环境下性能监控与调优详解课程笔记(完整版)

    一、Java性能监控工具 1. JVisualVM:集成在JDK中的一个多用途工具,可以进行内存分析、线程快照、CPU分析等,直观了解程序运行状态。 2. JConsole:同样是JDK自带的监控工具,提供了GUI界面来监视Java应用程序的...

    Java应用性能远程监控系统(使用CS架构)适用于监控所有Java应用.zip

    在JavaMonitor-master这个项目中,我们可以预期找到一个完整的Java性能监控系统的源代码,包括客户端代理和服务器端的实现。开发者可能会通过阅读和理解这些代码来学习如何构建自己的监控系统,或者将其作为起点进行...

    Java运行时监控第1部分Java系统运行时性能和可用性监控.pdf

    本篇文档聚焦于Java系统运行时的性能监控,旨在帮助开发者和运维人员理解如何有效地管理和优化Java应用程序。文档分为三个部分,分别关注不同的监控层面。 第一部分主要讨论了应用程序性能管理(APM)系统的特性,...

    java 远程监控程序JSN

    3. **VisualVM**: 另一个强大的Java性能分析工具,VisualVM提供了更丰富的功能,包括CPU和内存剖析、线程分析、JVM配置信息等。它也可以作为JSN的一部分,帮助识别性能瓶颈。 4. **JMX代理和服务**: 为了实现远程...

    java项目 监控

    在Java编程领域,"监控"通常指的是应用程序性能监控(APM)或系统监控。这个小型Java项目显然旨在提供一个解决方案,以便开发者或者运维人员能够实时跟踪和分析Java应用的运行状态。监控是至关重要的,因为它可以...

    java文件监控例子

    标题中的"java文件监控例子"就是关于如何使用JNotify来实现文件监控的示例。 JNotify库的核心在于提供了一个简单的API,让开发者能够轻松注册对特定文件或目录的监听,并在这些文件或目录发生变化时接收到回调通知...

    java虚拟机监控

    以下是一些关于Java虚拟机监控和jvisualvm应用的关键知识点: 1. **CPU监控**:jvisualvm能够显示Java应用的CPU使用情况,包括总体CPU负载和每个线程的CPU时间。这有助于发现长时间运行或者过度占用CPU资源的线程,...

    Java性能调优大全

    总的来说,这个“Java性能调优大全”涵盖了从基础的JVM配置到复杂的性能监控和问题诊断,是Java开发者提升应用性能的宝贵资源。通过深入学习和实践这些内容,可以显著提高Java应用程序的效率和稳定性。

    4本高清中文版Java性能优化经典书籍

    书中详细阐述了Java性能监控和调优的策略,包括性能测试、CPU使用率分析、内存泄漏检测、线程分析等。通过这些工具和方法,开发者可以找出程序的瓶颈,从而针对性地优化代码。此外,书中还讲解了JDK自带的性能分析...

    Java 系统运行时性能和可用性监控

    在第一部分中,作者将探讨APM系统的这些模式,描述如何监控JVM性能,以及如何有效地插入应用程序源代码进行监控。后续部分会进一步介绍如何在不修改原始源代码的情况下插装Java类和资源,以及如何监控JVM外部的资源...

    java 性能权威指南

    《Java性能权威指南》是一本深入探讨Java平台性能优化的专业书籍。这本书全面涵盖了从JVM(Java虚拟机)内部机制到应用程序级别的各种性能问题,旨在帮助开发者和系统管理员理解并解决Java应用程序中的性能瓶颈。 ...

    JAVA性能测试与调优案例

    Java堆的垃圾收集(GC)是Java性能调优的关键部分。GC负责回收不再使用的对象,释放内存空间。通过调整JVM启动参数可以对Java堆进行优化,比如设置合适的-Xmx和-Xms参数来调整Java堆的最大和初始内存大小。此外,还...

    java做的监控应用实例

    Java监控应用实例是一种用于观察和分析Java应用程序运行时性能、资源使用情况以及可能出现的问题的工具。在Java开发中,理解如何构建这样的应用是至关重要的,因为它可以帮助开发者优化代码,提高程序效率,及时发现...

    Java 运行时监控

    其次,"Java运行时监控,第2部分 编译后插装和性能监控"涉及到动态编译和AOP(面向切面编程)技术。编译后插装是一种在程序运行时动态插入监控代码的技术,例如使用ASM或ByteBuddy库。这种技术可以无侵入地收集代码...

    Java 性能调优 Java 性能调优 Java 性能调优

    ### Java性能调优概述 #### 一、性能优化的重要性与基本概念 在现代软件开发中,性能优化是一项至关重要的任务。对于Java开发者来说,优化...希望读者能够在实践中不断探索,掌握更多关于Java性能调优的知识和技巧。

    java远程屏幕监控系统

    Java远程屏幕监控系统是一种利用Java技术实现的,能够实时查看并控制远程计算机桌面的应用程序。这一系统基于网络通信,允许用户在一台设备上查看并操作另一台设备的屏幕,广泛应用于远程协助、系统管理以及教育等...

    java远程监控,有源码的

    - 性能监控:跟踪内存使用、CPU负载、线程活动等,确保应用高效运行。 - 错误检测与诊断:实时查看异常和错误日志,便于快速定位问题。 - 配置管理:远程更改应用配置,而无需重启服务。 - 自动化运维:通过脚本...

Global site tag (gtag.js) - Google Analytics