`
Mybeautiful
  • 浏览: 297127 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

J2SE6中使用jhat来分析内存堆(转)

阅读更多

转自:http://hi.baidu.com/tister/blog/item/e7374482f4341ca70cf4d2e8.html

 

除了Dtrace与Java技术的集成之外,Java SE 6发行中还包含了许多其它的可观察性工具。下面总结了这些工具,其中还包含一些更为详细的链接说明。

(一) JConsole

JConsole使用JVM的可扩展性Java管理扩展(JMX)工具来提供关于运行于Java平台的应用程序的性能和资源消耗的信息。

在J2SE 5.0软件中,你需要启动使用-Dcom.sun.management.jmxremote选项监控的应用程序。注意:在Java SE 6软件中,不再有这一要求。当启动该应用程序时,不需要特定的命令行选项。 

在生产系统中的应用

JConsole启动一个在被观察的Java程序的JVM内部的JMX代理。运行另外一部分代码仅有一点极微弱的影响-但是影响很小。

另外,尽管JConsole在监视本地应用程序的开发和快速原型开发中很有用,但在实际的应用系统中不推荐使用。理由是,JConsole本身也消耗大 量的系统资源。我们推荐的方法是用远程监控来把JConsole应用程序与被监控的系统加以隔离。因此,对于应用系统来说,以远程模式使用 JConsole更好些。对于安全的远程监控来说,可以使用安全选项。

(二) jps

jps相当于Solaris进程工具ps。更多的信息,请参考《jps-Java Virtual Machine Process Status Tool》。

不象"pgrep java"或"ps -ef grep java",jps并不使用应用程序名来查找JVM实例。因此,它查找所有的Java应用程序,包括即使没有使用java执行体的那种(例如,定制的启动 器)。另外,jps仅查找当前用户的Java进程,而不是当前系统中的所有进程。

(三) jstat

jstat 显示一个测量(instrumented)Java HotSpot虚拟机的性能统计信息(请参考《jstat-Java Virtual Machine Statistics Monitoring Tool》)。有关于性能计数器的更详细的信息请参考《Code sample-jvmstat 3.0》。

(四) jstatd

jstatd是一个Java远程方法调用 (RMI)服务器应用程序-它监控测量Java HotSpot虚拟机的创建和终止并且提供一个接口来允许远程监控工具依附到运行于本地主机的JVM(请参考《jstatd-Virtual Machine jstat Daemon》)。

在应用系统中的使用

jps及其它jvmstat实用程序都使用 极为轻量级的观察机制。由JVM分配一小部分共享内存,而性能计数器也是从这部分内存中分配的。JVM子系统基于其感兴趣的事件更新性能计数器。客户端工 具仅仅负责异步地从共享内存段中进行读取。因此,总的来说,使用jvmstat进行监控的效果是很小的。 Photoshop教程 数据结构 五笔输入法专题 
QQ病毒专题 共享上网专题 Google工具和服务专题 四、 Java SE 6平台中针对于Postmortem的可观察性工具

Java SE 6支持postmortem可观察性工具-它能够从挂起的Java进程或Java核心复制中获得信息。这些工具(除了jhat外)都使用Solaris libproc库来依附到和读取被观察的程序。在观察期间,目标程序被挂起。当Java进程被挂起或当从一个Java进程中发生一个核心复制时,可以使用 这些工具。在任何可能的情况下,请考虑使用gcore来捕获系统的核心复制的一个快照并且使用任何下列工具"离线"分析核心复制。

(一) jinfo

jinfo打印一个给定的Java进程或核心文件或一个远程调试服务器的Java配置信息。配置信息包括Java系统属性和JVM命令行标志(更多信息,请参考《jinfo-Configuration Info》)。

(二) jmap

jmap:如果这个工具不使用任何选项(除了pid或core选项)运行,那么它显示类似于Solaris的pmap工具所输出的信息。这个工具支持针对Java堆可观察性的若干其它选项。

在Java SE 6平台中,新加入了一个-dump选项。这样可以使jmap能够把Java堆信息复制到一个文件中,然后我们可以使用新的jhat命令(见下面一节)来分析它。

jmap -dump选项并不使用Solaris libproc来实现实时处理;而是,它运行当前正运行的JVM中的一小段代码,由此来实现堆复制。既然这种堆复制代码运行于JVM内部,那么其速度是比 较快的。堆复制的效果大致相当于实现一次"完全的GC"(对整个堆的垃圾收集),再加上把该堆的内容写入到文件中。实现堆复制的另外一种可能的思路是使用 gcore来进行核心复制并且运行"jmap -dump"(这与以"离线"方式运行的核心复制形成对照)。

(三) jstack

jstack等价于Solaris的pstack工具。jstack打印所有的Java线程的堆栈跟踪信息(可选地包括本机帧信息),请参考《jstack-堆栈跟踪》。关于锁和死锁的信息也可以被打印,请参考java.util.concurrent locks。

(四) jsadebugd

jsadebugd依附到一个Java进程或核心文件并且担当一个调试服务器的作用。远程客户,例如jstack、jmap和jinfo,都能够通过Java RMI依附到该服务器。

(五) jhat

jhat是一个Java堆复制浏览器。这个工具分析Java堆复制文件(例如,由上面的"jmap -dump"所产生的)。Jhat启动一个允许堆中的对象在web浏览器中进行分析的web服务器。这个工具并不是想用于应用系统中而是用于"离线"分 析。"jhat工具是平台独立的",其意思是,它可以被用来观察在任何平台上所产生的堆复制。例如,我们有可能在Linux系统上使用jhat来观察一个 在Solaris OS上所产生的堆复制。

把本机的java内存映像导出到heap.dmp中,其中PID为java进程的ID号。
jmap -dump:live,format=b,file=heap.dmp PID

导出后的映像文件可以用jhat来进行分析,-J是向java虚拟机传一个参数,如-mx768m是指定虚拟机可用最大的内存为768M。如果映像文件很大,你要指定一个很大的值,否则在分析过程中就会有OutOfMemeryError的错误。
jhat -J-mx768m -port <端口号:默认为7000> heap.dmp

 

Mybeautiful注:

     1.一般用Jconsole的内存变化就能判断是否有内存泄露 (泄露比较严重的情况),如果只是微量的泄露,则需要分析GC的数据。

     2. 检查内存泄露在何处,如果是本地,可以直接用 jvisualvm.exe即可,如果是远程服务器,且不方便进行桌面操作,可以用jmap结合jhat分析。步骤如下,

           a. jmap -dump:live,format=b,file=heap.dmp PID 生成dump文件。

           b. jhat -J-mx768m -port <端口号:默认为7000> heap.dmp

           c. 然后可以在本机通过浏览器访问远程dump文件,如:http://192.168.0.23:7000/

 

分享到:
评论

相关推荐

    j2se6中文网页版

    本资源“j2se6中文网页版”显然是一个中文版的J2SE 6 API文档,旨在帮助中国开发者更方便地理解和使用Java编程语言。 1. **Java API**:Java API是Java平台的核心,包含了大量预定义的类库,如集合框架、I/O流、...

    j2se6.rar_J2se6

    《J2SE6详解——Java开发者的必备指南》 ...对于任何致力于Java开发的程序员来说,理解和掌握J2SE6的知识至关重要,而“j2se6.rar”压缩包中的“j2se6.chm”文件则是学习和查阅J2SE6 API的必备工具。

    j2se6_api中文版

    Java 2 Platform, Standard Edition (J2SE) 6 API 中文版是针对Java开发者的重要参考资料,它提供了全面的API文档,便于理解、学习和使用Java 1.6版本的编程接口。这份文档包含了所有核心Java类库的详细说明,包括...

    j2se1.5中文api

    J2SE 1.5允许在方法签名中使用省略号(...),创建可变参数的方法。这使得方法可以接受任意数量的相同类型的参数,如public void printNumbers(int... nums)。 七、静态导入(Static Import) 静态导入允许将类的...

    j2se6中文帮助文档

    jdk6帮助文档,中文版

    j2se中文api.rar

    这个压缩包 "j2se中文api.rar" 内含的是 J2SE 的中文版 API 文档,这对于 Java 开发者来说是一个非常重要的参考资料。API(Application Programming Interface)文档详细介绍了 Java 语言的各种类库、接口、方法等,...

    j2se_中文版

    中文版的J2SE API文档对于中国开发者来说尤其方便,它提供了全面的API参考,帮助理解并使用Java编程语言的核心库。 在Java编程中,J2SE是基础,它包含了核心类库,如集合框架、I/O流、网络编程、多线程、GUI(图形...

    J2SE 中文帮助文档

    它包含了Java语言的核心库,如基础类库、I/O、网络编程、多线程、集合框架等,以及一些核心服务,如垃圾收集、内存管理、安全管理等。** **本中文帮助文档是J2SE学习的重要参考资料,尤其适合初学者使用。文档详细...

    J2SE6_API.CHM

    J2SE开发工具API JAVASE使用 工具类

    j2se中文6.0api

    J2SE 6.0 的中文API文档对于中国开发者来说尤其重要,因为它消除了语言障碍,使得开发者能够更方便地理解和使用Java的各类库和类。 在J2SE 6.0 API中,有以下几个关键的知识点: 1. **Java基础类库**:包括核心类...

    J2SE6.0_CN.rar_j2se 6.0下载_j2se api chm 6.0_j2se6 a_j2se6 api_jav

    6. **Java 运行时可插拔组件(JSR 277)**:虽然这个特性后来被弃用,但在 J2SE 6.0 中,它提供了一种模块化Java应用程序的方法,使得大型项目更容易管理和部署。 7. **Java Management Extensions (JMX)**:J2SE ...

    J2SE6.0 documentation 中文~

    6. **改进的内存管理**:Java 6的垃圾收集器进行了优化,提供了更好的内存管理和性能。例如,Parallel Scavenge和Parallel Old收集器组合提供了更稳定的吞吐量。 7. **国际化**:Java 6增强了对多语言和区域设置的...

    j2se doc 中文版

    7. **内存管理与垃圾收集**:Java 使用自动垃圾收集机制来管理内存,避免了程序员手动释放内存的问题。了解垃圾收集的工作原理和性能影响,可以帮助开发者写出更高效的代码。 8. **JVM 内部机制**:虽然不是 J2SE ...

    J2SE6.0中文 API

    本文档是 JavaTM Platform Standard Edition 6 的 API 规范。

    实验1 JAVA开发环境J2SE实验报告.doc

    具体来说,我们将学习如何下载和安装J2SE开发工具,熟悉J2SE开发工具的使用,编写简单的Java Application和Java Applet程序,了解Java源代码、字节码文件,以及Java程序的编辑、编译和运行过程。 一、实验目的及...

    J2SE 6.0 API 中文文档chm

    1. **Java 6 (J2SE 6.0)**:Java 6是Java开发的关键版本,包含了大量改进和新特性,如增强的编译器、改进的内存管理、新的I/O API、JavaScript引擎(Nashorn)等。对于开发者来说,理解这个版本的API对于维护旧项目...

    j2se中文帮助文档

    这些API文档对于理解如何使用Java类库中的各种类和方法至关重要。例如,`java.util`包包含了各种数据结构和算法,如ArrayList、HashMap;`java.io`包提供了处理输入输出的能力,如FileInputStream和PrintWriter;`...

    J2SE中表格应用

    根据提供的文件信息,本文将详细解析“J2SE中表格应用”的相关知识点,重点在于如何在Java Swing中使用`JTable`组件,并结合代码示例进行深入分析。 ### J2SE与Swing简介 Java 2 Standard Edition (J2SE) 是Java...

    J2SE基础知识大全

    - **堆与栈内存**:理解对象在堆内存中分配,而局部变量在栈内存中的工作原理。 3. **集合框架** - **ArrayList、LinkedList、Vector**:不同类型的动态数组实现,它们之间的性能差异及适用场景。 - **HashMap、...

    j2SE中文API帮助文档

    J2SE中文API帮助文档是Java开发者的重要参考资料,它提供了详细的类和方法说明,帮助程序员理解和使用Java语言进行开发。 在J2SE API中文版中,你可以找到以下关键知识点: 1. **类库概述**:J2SE包含了一系列核心...

Global site tag (gtag.js) - Google Analytics