使用 HPROF 概要文件分析器

2025-06-07 12:37:29 世界杯外围赛

HPROF 是 IBM® SDK 随附的演示概要分析程序,它使用 JVMTI 来收集和记录有关 Java™ 执行的信息。 可以使用 HPROF 获知程序的哪些部分正在使用大部分的内存或处理器时间。

要提高应用程序的效率,您必须了解代码的哪些部分正使用大量的内存和处理器资源。 HPROF 是一个示例 JVMTI 代理程序,使用以下语法启动:java -Xrunhprof[:

使用 HPROF 运行 Java 时,将在程序结束时创建文件。 此文件位于当前工作目录中,名为

java.hprof.txt(如果使用的是二进制格式,则名为 java.hprof),此名称在提供其他文件名之前不会更改。 此文件包含许多不同的部分,但是具体的格式和内容取决于所选的选项。

如果需要有关 HPROF 的更多信息,请参阅 https://docs.oracle.com/javase/8/docs/technotes/samples/hprof.html。

命令 java -Xrunhprof:help 显示可用选项:

heap=dump|sites|all

此选项帮助分析内存使用情况。 它告知 HPROF 生成堆栈跟踪,通过这些跟踪,您可以看到在何处分配了内存。 如果使用 heap=dump 选项,那么将获取堆中所有活动对象的转储。 使用 heap=sites,将获取站点的有序列表,其中分配内存量最多的对象位于开始。 缺省值 all 将提供这两种类型的输出。

cpu=samples|times|old

cpu 选项提供了有用的信息,用于确定处理器在何处花费的时间最多。 如果 cpu 设置为 samples,那么 JVM 将暂停执行并标识哪种方法调用处于活动状态。 如果采样率足够高,您将很好地了解程序在何处花费的时间最多。 如果 cpu 设置为 times,您将精确地了解到每种方法被调用的次数以及每次执行所花费的时间。 虽然此选项可获取更精确的信息,但是会减慢程序的速度。 如果 cpu 设置为 old,那么将以旧 HPROF 格式生成概要分析数据。

interval=y|n

时间间隔选项仅应用于 cpu=samples,并控制线程堆栈的样本之间采样线程休眠的时间。

monitor=y|n

monitor 选项可帮助您了解同步对应用程序的性能有何影响。 监视器实施线程同步。 获取有关监视器的信息后,您就可以了解在尝试访问已锁定的资源时,不同的线程所花费的时间。 HPROF 也提供使用中的监视器的快照。 此信息对于检测死锁很有用。

format=a|b

输出文件的缺省格式为 ASCII。 如果要指定二进制格式,请将 format 设置为“b”,这对于某些实用程序是必需的,如堆分析工具。

file=

使用 file 选项可更改输出文件的名称。 ASCII 文件的缺省名称为 java.hprof.txt。 二进制文件的缺省名称为 java.hprof。

force=y|n

通常,缺省值 (force=y) 将覆盖输出文件中的任何现有信息。 因此,如果在启用 HPROF 的情况下有多个 JVM 正在运行,请使用 force=n,这样会根据需要将其他字符附加到输出文件名。

net=:

要通过网络而不是本地文件发送输出,请使用 net 选项。

depth=

depth 选项指示要在堆栈跟踪中显示的方法帧的数量。 缺省值为 4。

thread=y|n

如果将 thread 选项设置为 y,那么将在每个跟踪旁输出线程标识。 如果您对线程与跟踪间的关联不清楚,那么此选项将很有用。 这类问题可能会出现在多线程应用程序中。

doe=y|n

缺省行为是在应用程序退出时收集概要文件信息。 要在执行期间收集概要分析数据,请将 doe(在退出时转储)设置为 n。

msa=y|n

此功能在 IBM SDK 平台上不受支持。

cutoff=

许多样本条目的生成时间只占总执行时间的一小部分。 缺省情况下,HPROF 包括至少代表处理器所花时间的 0.0001% 的所有执行路径。 您可以使用该选项增加或减少该中止点。 例如,要移除代表少于总执行时间 0.25% 的所有条目,可指定 cutoff=0.0025。

verbose=y|n

当发生转储时,此选项会生成消息。 缺省值为 y。

lineno=y|n

每个帧通常包括已处理的行号,但是您可以使用此选项来禁止显示输出列表中的行号。 如果启用,那么每帧都包含文本 Unknown line,而不是行号。TRACE 1056:

java/util/Locale.toUpperCase(Locale.java:Unknown line)

java/util/Locale.(Locale.java:Unknown line)

java/util/Locale.(Locale.java:Unknown line)

sun/io/CharacterEncoding.aliasName(CharacterEncoding.java:Unknown line)