文档章节

Java命令行分析工具

疯狂的艺术家
 疯狂的艺术家
发布于 2011/12/14 15:05
字数 3079
阅读 805
收藏 2
点赞 0
评论 0

本文向各位介绍一下Java性能监控小技巧:“JDK附带分析器、远程连接进程、跟踪统计、为离线分析创建一个堆转储、JConsole并不是高深莫测的。”

5个命令行分析工具

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

JDK包括很多命令行实用程序,可以用于监控和管理Java应用程序性能。虽然大多数这类应用程序都被标注为“实验型”,在技术上不受支持,但是它们很有用。

1.jps(sun.tools.jps)

查看进程ID

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

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

在Java进程中使用jps

与配置JDK的大部分工具及本文中提及的所有工具一样,可执行jps通常是一个围绕Java类或执行大多数工作的类集的一个薄包装。在Windows®环境下,这些工具是.exe文件,使用JNIInvocationAPI直接调用上面提及的类;在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选项

1.

2.

3. -class

4. -compiler

5. -gc

6. -gccapacity

7. -gccause

8. -gcnew

9. -gcnewcapacity

10. -gcold

11. -gcoldcapacity

12. -gcpermcapacity

13. -gcutil

14. -printcompilation

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

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

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

15. jstat -gc 5756 250 10

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

http://xueliang880107.iteye.com/blog/954073

  1. S0  — Heap上的 Survivor space 0 区已使用空间的百分比  
  2. S1  — Heap上的 Survivor space 1 区已使用空间的百分比  
  3. E   — Heap上的 Eden space 区已使用空间的百分比  
  4. O   — Heap上的 Old space 区已使用空间的百分比  
  5. P   — Perm space 区已使用空间的百分比  
  6. YGC — 从应用程序启动到采样时发生 Young GC 的次数  
  7. YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)  
  8. FGC — 从应用程序启动到采样时发生 Full GC 的次数  
  9. FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)  
  10. GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)  

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本身的源补丁,还是作为其他实用程序的扩展。)

Eclipse Memory Analyzer是Eclipse提供的一个用于分析jvm堆dump文件的插件,借助这个插件可查看对象的内存占用状况、引用关系、分析内存泄露等。

Eclipse Memory Analyzer(MAT)的网站为:http://www.eclipse.org/mat/,在eclipse中可以直接远程安装此插件。不过由于此插件在分析堆dump文件时比较耗内存,因此在分析前最好先将eclipse的jvm的内存设置大一点,MAT分析dump文件后的对象占用内存及引用关系如图3.23所示。

相对而言MAT功能比jhat强大很多,分析的速度也快一些,因此,如果要分析jvm堆dumap文件,首选推荐的是MAT。

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

与jmap配合使用,用于浏览jmao生成的文件

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

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

16. select s from java.lang.String s where s.count 》= 100

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

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

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

--------------------------------------------------------------------------------------------

./jps

./jstat -gcutil -h20 12834 1s

./jstack 12834 > /home/jstack1.logc

./jmap -dump:live,file=/mnt/dump11.out,format=b 12834

jhat -J-mx1024m dump11.out

为什么会"well-known file is not secure" ?

最近一段时间经常使用JDK自带工具jmap和jstack来dump JVM heap和JVM 线程栈的log来分析问题,执行这两个命令当时让我最摸不着头脑的就是碰到这个问题:well-known file is not secure

eg:

    

  上网google了一把,在stackoverflow上找到答案:http://stackoverflow.com/questions/9100149/jstack-well-known-file-is-not-secure?rq=1,大概意思是:

 

     我们可以在机器上找到 /tmp/hsperfdata_$USER/$PID一个这样的文件,当我们执行jmap或者jstack出现上叙信息时,先检查执行该命令的用户是否和hsperfdata_$USER这个文件所属的用户一致,如果不一致,切换至成一致再执行即可。

© 著作权归作者所有

共有 人打赏支持
疯狂的艺术家

疯狂的艺术家

粉丝 195
博文 237
码字总数 124216
作品 0
海淀
技术主管
Oracle Java Mission Control 帮助

缩写 含义 JDK Java 开发工具包 JDP Java Discovery Protocol JFR Java 飞行记录器 JMC Java Mission Control JMX Java Management Extensions JVM Java 虚拟机 MBean 托管 Bean (Java) RCP ......

光斑 ⋅ 04/27 ⋅ 0

JavaWeb07-HTML篇笔记(二)

1.1 案例一:使用JDBC完成CRUD的操作:1.1.1 需求: 对分类管理使用JDBC进行CRUD的操作. 1.1.2 分析:1.1.2.1 技术分析: 【JDBC的概述】 Ø JDBC:Java DataBase Connectivity Java数据库的连...

我是小谷粒 ⋅ 05/16 ⋅ 0

重磅!Java 性能监控调试工具 JMC 宣布开源

JRockit JVM 创始人之一、Oracle Java 产品组成员 Marcus Hirt 昨日在其博客上宣布,Java Mission Control(JMC)的源代码已正式开源。 JMC 是源自 JRockit JVM 的一套监控和管理工具,Oracl...

王练 ⋅ 05/07 ⋅ 6

升级到JDK9的一个BUG,你了解吗

概述 前几天在一个群里看到一个朋友发了一个demo,说是JDK的bug,昨天在JVM的一个群里又有朋友发了,觉得挺有意思,分享给大家,希望大家升级JDK的版本的时候注意下是否存在这样的代码,如果...

你假笨 ⋅ 06/06 ⋅ 0

面试中关于Java虚拟机(jvm)的问题看这篇就够了

最近看书的过程中整理了一些面试题,面试题以及答案都在我的文章中有所提到,希望你能在以问题为导向的过程中掌握虚拟机的核心知识。面试毕竟是面试,核心知识我们还是要掌握的,加油~~~ 下面...

snailclimb ⋅ 05/12 ⋅ 0

甲骨文开源Java 性能监控调试工具 JMC

JMC (Java Mission Control) 是Oracle开源的Java 性能监控调试工具, 源自 JRockit JVM , 主要由三个组件构成:Java 进程浏览器、JMX 控制台和 Java Flight 记录器。 主要特性: Java 进程浏览...

marsdream ⋅ 05/07 ⋅ 0

你不知道 Java 10 的 5 件事

局部变量类型推断是有争议的热点,但Java 10在JVM中的垃圾收集和容器识别上带来了可喜的变化。 关于本系列 所以你认为你了解Java编程? 事实是,大多数开发人员只是浮于Java平台的表面上,仅...

ismdeep ⋅ 04/24 ⋅ 0

JVM性能调优实践——JVM篇

前言 在遇到实际性能问题时,除了关注系统性能指标。还要结合应用程序的系统的日志、堆栈信息、GClog、threaddump等数据进行问题分析和定位。关于性能指标分析可以参考前一篇JVM性能调优实践...

lijingyao8206 ⋅ 05/24 ⋅ 0

Java静态检测工具/Java代码规范和质量检查简单介绍(转)

静态检查: 静态测试包括代码检查、静态结构分析、代码质量度量等。它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。代码检查代码检查包括代码走查、桌面检查、代...

easonjim ⋅ 2017/10/18 ⋅ 0

Oracle 被指在开源 JMC 后迅速解雇原开发团队

Oracle 在 5 月初宣布开源 Java 性能监控调试工具 Java Mission Control(JMC),此举赢得了 Java 开发社区热烈的掌声。JMC 是一个知名的 JVM 分析和诊断工具套件,主要针对运行在生产环境中...

王练 ⋅ 06/06 ⋅ 16

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java Web如何操作Cookie的添加修改和删除

创建Cookie对象 Cookie cookie = new Cookie("id", "1"); 修改Cookie值 cookie.setValue("2"); 设置Cookie有效期和删除Cookie cookie.setMaxAge(24*60*60); // Cookie有效时间 co......

二营长意大利炮 ⋅ 今天 ⋅ 0

【每天一个JQuery特效】淡入淡出显示或隐藏窗口

我是JQuery新手爱好者,有时间就练练代码,防止手生,争取每天一个JQuery练习,在这个博客记录下学习的笔记。 本特效主要采用fadeIn()和fadeOut()方法显示淡入淡出的显示效果显示或隐藏元...

Rhymo-Wu ⋅ 今天 ⋅ 0

Spring JDBC使用方法

普通实现: 1、创建数据表customer。 可以使用任何数据库实现,在项目中要引入相应数据库驱动包并配置相应数据库连接。 2、创建Customer pojo。 Customer类的属性对应数据库的属性,除了为每...

霍淇滨 ⋅ 今天 ⋅ 0

Contos 7 安装Jenkins

Jenkins是一款能提高效率的软件,它能帮你把软件开发过程形成工作流,典型的工作流包括以下几个步骤 开发 提交 编译 测试 发布 有了Jenkins的帮助,在这5步中,除了第1步,后续的4步都是自动...

欧虞山 ⋅ 今天 ⋅ 0

revel

revel install go get github.com/revel/revelgo get github.com/revel/cmd create new app revel new git.oschina.net/zdglf/myapp run app revel run git.oschina.net/zdglf/myapp ot......

zdglf ⋅ 今天 ⋅ 0

49. Group Anagrams - LeetCode

Question 49. Group Anagrams Solution 思路:维护一个map,key是输入数组中的字符串(根据字符排好序) Java实现: public List<List<String>> groupAnagrams(String[] strs) { Map<Strin......

yysue ⋅ 今天 ⋅ 0

spring Email

使用spring发Email其实就是使用spring自己封装携带的一个javamail.JavaMailSenderImpl类而已。这个类可以当一个普通的java对象来使用,也可以通过把它配置变成spring Bean的方式然后注入使用...

BobwithB ⋅ 今天 ⋅ 0

spark 整理的一些知识

Spark 知识点 请描述spark RDD原理与特征? RDD全称是resilient distributed dataset(具有弹性的分布式数据集)。一个RDD仅仅是一个分布式的元素集合。在Spark中,所有工作都表示为创建新的...

tuoleisi77 ⋅ 今天 ⋅ 0

思考

时间一天天过感觉自己有在成长吗?最怕的是时光匆匆而过,自己没有收获!下面总结下最近自己的思考。 认识自己 认识另一个自己,人们常说要虚心听取别人意见和建议。然而人往往是很难做到的,...

hello_hp ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部