HPROF: 一个Heap/CPU Profiling工具
http://blog.csdn.net/ae86_fc/article/details/5960719
J2SE中提供了一个简单的命令行工具来对java程序的cpu和heap进行 profiling,叫做HPROF。HPROF实际上是JVM中的一个native的库,它会在JVM启动的时候通过命令行参数来动态加载,并成为 JVM进程的一部分。若要在java进程启动的时候使用HPROF,用户可以通过各种命令行参数类型来使用HPROF对java进程的heap或者 (和)cpu进行profiling的功能。HPROF产生的profiling数据可以是二进制的,也可以是文本格式的。这些日志可以用来跟踪和分析 java进程的性能问题和瓶颈,解决内存使用上不优的地方或者程序实现上的不优之处。二进制格式的日志还可以被JVM中的HAT工具来进行浏览和分析,用 以观察java进程的heap中各种类型和数据的情况。
在J2SE 5.0以后的版本中,HPROF已经被并入到一个叫做Java Virtual Machine Tool Interface(JVM TI)中。
HPROF的启用
HPROF可以用来展示和跟踪cpu的使用情况,内存分配的统计数据等。不仅如此,它还支持对 java进程完整的内存dump,所有线程的monitor stats数据。HPROF被启用的方式可以如下:
java -agentlib:hprof[=options] ToBeProfiledClass
或者
java -Xrunhprof[:options] ToBeProfiledClass
HPROF如何构建java进程,并发送进程的jvm profiling信息,取决于HPROF在JVM启动时从命令行获取的参数指令。比如,以下指令将会获取java进程的heap allocation的profile:
java -agentlib:hprof=heap=sites ToBeProfiledClass
HPROF 可以被指定的参数非常的多,以下是完整的列表:
java -agentlib:hprof=help
HPROF: Heap and CPU Profiling Agent (JVM TI Demonstration Code)
hprof usage: java -agentlib:hprof=[help]|[<option>=<value>, ...]
Option Name and Value Description Default
--------------------- ----------- -------
heap=dump|sites|all heap profiling all
cpu=samples|times|old CPU usage off
monitor=y|n monitor contention n
format=a|b text(txt) or binary output a
file=<file> write data to file java.hprof[.txt]
net=<host>:<port> send data over a socket off
depth=<size> stack trace depth 4
interval=<ms> sample interval in ms 10
cutoff=<value> output cutoff point 0.0001
lineno=y|n line number in traces? y
thread=y|n thread in traces? n
doe=y|n dump on exit? y
msa=y|n Solaris micro state accounting n
force=y|n force output to <file> y
verbose=y|n print messages about dumps y
Obsolete Options
----------------
gc_okay=y|n
Examples
--------
- Get sample cpu information every 20 millisec, with a stack depth of 3:
java -agentlib:hprof=cpu=samples,interval=20,depth=3 classname
- Get heap usage information based on the allocation sites:
java -agentlib:hprof=heap=sites classname
默认情况下,java进程profiling的信息(sites和dump)都会被 写入到一个叫做java.hprof.txt的文件中。大多数情况下,该文件中都会对每个trace,threads,objects包含一个ID,每一 个ID代表一个不同的观察对象。通常,traces会从300000开始。
默认,force=y,会将所有的信息全部输出到output文件中,所以如果含有 多个JVMs都采用的HRPOF enable的方式运行,最好将force=n,这样能够将单独的JVM的profiling信息输出到不同的指定文件。
interval选项只在 cpu=samples的情况下生效,表示每隔多少毫秒对java进程的cpu使用情况进行一次采集。
msa选项仅仅在Solaris系统下才有效, 表示会使用Solaris下的Micro State Accounting功能
Examples
我们可以自己写一个java应用程序,但是例子 里将使用一个J2SE中已有的java应用程序,javac。
Heap Allocation Profiles(heap=sites)
以下是对一个java代码文件运行java编译 器javac的heap allocation profile日志的一部分:
Command used: javac -J-agentlib:hprof=heap=sites Hello.java
从日志中可以看到程序在运行的每一个部分都消耗了多少内存的heap profile数据。以上日志可以看出,整个程序的heap中有44.73%的被分配给了java.util.zip.ZipEntry对象。同时可以观 察到,live data的数量跟所有allocated的总数是匹配atch的,这就说明GC可能在HPROF遍历整个heap搜集信息的很短的时间之前已经做过一次内 存回收了。通常情况下,live data的数量是会稍微少于所有allocated的总数的。
Heap Dump (heap=dump)
该选项用来对java进程的heap进行进行完 全的dump:
Command used: javac -J-agentlib:hprof=heap=dump Hello.java
这样会产生一个非常大的输出文件,但是可以用任 何编辑器进行打开和搜索。但是,更好的观察和分析办法是通过HAT来进行分析和观察。所有用heap=sites选项中获取的信息这里也都可以获取到。另 外还加上一些特别的细节数据。如对每个对象的内存分配以及其引用的其他所有的对象。
该选项会使用很多的内存,因为它会将所有对象的 内存分配情况全部记录下来,同时也可能会影响到应用程序本身的性能,因为数据的产生会影响对象分配和资源回收。
CPU Usage Sampling Profiles (cpu=samples)
HPROF可以用来搜集java进程中各个threads的cpu使用情况:
HPROF会对java进程中所有的threads进行周期性的stack traces采集。以上count一列就表示在采集中有多少次的stack trace被HPROF发现,并且是active的(而不是指一个method被执行了多少次)。这些stack traces包括cpu的使用,哪些是cpu消耗热点。
那么以上日志中可以看出什么信息呢?第一,统计数据的样本数据是很少的,只有126次的采样,如 果是比较大的程序编译,那么应该能够产生更有代表性的数据。第二,该数据跟以上对heap=sites的采集数据比较匹配,ZipFile耗费了比较多的 cpu时间和调用次数。在以上采集中,可以发现,跟ZipFile相关的的性能在javac中都会消耗的比较高,该ZipFile的stack trace如下:
CPU Usage Times Profile (cpu=times)
HPROF可以通过对java应用程序的各个方 法中注入code的方式来搜集各个method的执行情况。对每个methods的执行情况进行跟踪,count以及时间消耗的搜集。这种技术叫做 Byte Code Injection。所以这种采集方式的运行比cpu=samples要慢很多,以下是采集数据日志:
这里的count代表着该方法被真正执行了多少次,并且方法thread消耗了多少精确的cpu 时间。
http://www.cnblogs.com/linhaohong/archive/2012/07/12/2588657.html
相关推荐
Android hprof 自动化dump heap脚本 MAC 上执行脚本: pid 为 app 的进程 id sh ./djheap.sh [packageName] [pid] 导出 hprof 文件可以用 mat 工具进行分析
1. **生成堆转储文件**:通过`-dump:format=b,file=<filename>`选项,我们可以将Java进程的堆内存信息导出为一个二进制格式的文件,通常命名为`heapdump.hprof`。这个文件包含了JVM堆中的所有对象及其引用关系,是...
Shallow Heap :一个对象所占用的内存,不包含对其他对象的引用 Retained Heap :是shallow Heap的总和(单个对象占用内存*此对象的个数),也就是该对象被GC之后所能回收到内存的总和 分析方式: 1.查找线程下...
heapdump文件分析工具(最新2012-12-18) 用于分析OOM内存溢出的错误
首先,heapdump是一个包含Java虚拟机(JVM)堆内存快照的文件,它记录了程序运行时所有对象以及它们之间的引用关系。通过分析heapdump文件,我们可以找出占用内存较大的对象,追踪内存泄漏的源头,以及了解对象生命...
1. **数据获取**:首先,你需要获取一个`hprof`文件,这是Java虚拟机(JVM)生成的内存快照,通常在`OutOfMemoryError`发生时生成。你可以通过JVM参数`-XX:+HeapDumpOnOutOfMemoryError`配置自动导出,或者在程序...
在Android应用开发中,内存泄漏是一个常见的问题,它会导致应用性能下降,甚至引发应用无响应(ANR)等问题。为了解决这个问题,开发者通常会借助各种工具进行检测,其中LeakCanary是一款广受欢迎的内存泄漏检测库。...
hprof-conv.exe 在sdk tools 里面缺少这个运行文件导致DDMS files not found: tools\hprof-conv.exe 错误 , 详细看博客:https://blog.csdn.net/DickyQie/article/details/79657573
生成的heapdump文件通常是一个.hprof格式的二进制文件,包含了JVM内存中的所有对象和类的信息。为了解析这些信息,我们需要使用专门的分析工具,这就是"ha456.jar"发挥作用的地方。ha456是一个IBM提供的轻量级heap...
8. **哈希表视图(Hash Tables)**:对于使用哈希表(如HashMap)导致的内存问题,MAT提供了一个专门的视图来分析其内容和内存占用。 9. **线程堆栈(Thread Stack)**:MAT还显示每个线程的堆栈信息,这对于定位与...
性能测试是软件测试的一个重要方面,涉及到对系统的整体性能进行评估和优化。下面将从硬件信息、中间件、监控Linux服务器、监控和诊断JVM、其它命令五个方面总结常用的性能测试命令。 一、硬件信息 在性能测试中,...
`memoryanalyzer_v1.5.0.rar`是一个包含MAT的版本1.5.0的压缩包,提供了对Java堆内存的深入洞察。 在MAT中,有以下几个核心功能和概念: 1. **对象概述(Leak Suspects)**:MAT会自动分析dump文件并提供可能的...
补充到android-sdk下的platform-tools下即可, 链接文章:https://mp.csdn.net/postedit/80325722
【HPROF 代理】是Java开发工具包(JDK)中的一个JVM TI代理,用于进行性能分析。它是一个动态链接库,通过JVM TI接口与Java虚拟机交互,将分析信息以ASCII或二进制格式输出到文件或通过套接字传输。HPROF的主要功能...
3. 运行`ha`工具,指定`heapdump.hprof`文件作为输入。 4. 分析`ha`工具生成的报告,查看内存占用大的对象,查找潜在的内存泄漏。 使用`jca`工具分析`javacore`文件的步骤类似: 1. 解压缩`jca396.zip`,获取`jca`...
java hprof(文件类型分析器)是一款功能强大的java问题解析软件。可以帮助大家在编辑过程种遇到问题的话就马上解决哦。有兴趣的话赶紧下载! 软件介绍: 许多配置属性可以控制分析过程,这些属性也可以通过JobConf...
`smem`是一个报告系统内存使用情况的工具,而`top`则提供实时的进程资源使用情况。通过这些工具,我们可以找到占用内存最多的进程,并进一步分析其内存使用模式。 接下来,我们转向HProf,这是一种由Java虚拟机生成...
hprof-conv ,内存转mat工具
**hprof-conv** 是一个重要的工具,全称为Heap Profiling Format Converter,它主要用于处理和转换Android设备生成的.hprof文件。这些文件是Android系统用于内存分析的,当开发者需要对应用进行内存泄漏检测或者性能...
HPROF Agent是一个简单的动态链接库,它与JVM TI(Java Virtual Machine Tool Interface)交互,将分析信息输出到文件或以ASCII或二进制格式通过套接字。这些信息可以被前端分析工具进一步处理,以呈现CPU使用率、堆...