首页 > Java > java教程 > 正文

Java 堆转储

WBOY
发布: 2024-08-30 15:14:19
原创
803 人浏览过

在 Java 中,堆转储提供了某个时刻 Java 虚拟机内存中存在的整个对象的快照。堆转储对于解决内存泄漏问题和优化不同 java 应用程序中的内存使用非常有用。每个实例的详细信息(如地址、类名、类型、对另一个对象的引用)都记录在堆转储中。堆转储有两种格式,例如便携式堆转储格式、二进制格式和asci 文本的经典格式。在下面的部分中,让我们了解生成堆转储的不同工具和技术。

开始您的免费软件开发课程

网络开发、编程语言、软件测试及其他

堆转储格式

  • 便携式堆转储(PHD)格式:在此格式中,转储文件由标头部分和主体部分组成。转储文件的主体部分包含有关对象、类记录或数组的详细信息。为了解释文件格式,使用了原始数字。
  • 经典堆转储格式:此转储格式在除 z / OS 之外的几乎所有平台上以 ASCII 文本生成,并以 EBCDIC 编码。

为什么使用堆转储,它的用途是什么?

通常,此堆转储用于我们正在使用的 Java 应用程序占用的内存超过我们的预期,或者应用程序因 OutOfMemoryError 崩溃。如果我们分析堆转储,将有助于识别异常的根本原因。除此之外,堆转储还可以用于识别详细信息,例如每个类的内存使用情况、每个类中的对象数量等。此外,还可以捕获精细的细节,以及单个对象占用的内存量还可以找出应用程序中存在的Java对象。这些信息可以帮助我们识别导致内存泄漏问题的实际代码。

工具和技术

以下是下面提到的以下工具和技术

1. JDK 工具

堆转储可以使用 JDK 下的不同工具来捕获,这些工具位于 JDK 主目录中的 bin 文件夹中。为此,可以使用命令行,因为该目录存在于系统路径中。

jmap

jmap 是一个可在本地和远程进程中使用的工具,用于打印正在运行的 JVM 中的内存统计信息。

要使用 jmap 生成堆转储,可以使用 dump 选项,如下所示。

jmap -dump:[live] , format = b , file=< path of the file > <process id>
登录后复制
  • live: 可选参数。如果设置了此项,则仅打印具有活动引用的对象
  • format=b: 提到转储文件格式将为二进制。
  • 文件:可以将创建的转储写入的文件
  • PID: Java 进程 ID
  • jcmd

jcmd 是一个向 Java 虚拟机发送命令请求的工具。此外,它必须存在于运行 Java 进程的机器中。

要获取堆转储,可以使用命令 GC.heap_dump,只需提及输出的 pid 和文件路径,如下所示。

jcmd < pid > GC.heap_dump < path of the file >
登录后复制
JVisualVM

JVisualVM 是一个具有简单直观的图形用户界面的工具,允许我们监视、故障排除和分析 Java 应用程序。要使用它生成堆转储,必须右键单击 Java 进程,并选择“堆转储”选项。完成此操作后,该工具将创建堆转储,并在新选项卡中打开它。

2.自动创建堆转储

不使用上面提到的手动技术,而是使用命令行选项 HeapDumpOnOutOfMemoryError 在抛出 java.lang.OutOfMemoryError 时自动创建堆转储:

java - XX:+HeapDumpOnOutOfMemoryError
登录后复制

java_pid.hprof 是默认存储 dump 的文件,它位于应用程序运行的目录中。

除了默认路径之外,还可以使用其他文件路径,为此,可以使用 HeapDumpPath 选项,如下所示。

java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=< file_path >
登录后复制

因此,当应用程序使用这种方式运行内存中断时,可以在创建的由堆转储组成的文件中看到日志:

3. JMX

在此,HotSpotDiagnostic MBean 用于生成允许 2 个参数的 dumpHeap 技术。

他们是:

outputFile,这是创建的转储的文件路径。确保该文件的扩展名应为 hprof。

live,和jmap中的类似。如果设置了此项,则仅打印具有活动引用的对象

让我们看看两种不同的技术来调用此方法来捕获堆转储。

JConsole

像 JConsole 这样的 JMX 客户端是使用 HotSpotDiagnostic MBean 的最简单方法。如果 JConsole 打开并连接到正在运行的 Java 进程,导航到 MBeans 选项卡并识别 com.sun.management 下存在的 HotSpotDiagnostic。在操作中,可以找到之前解释过的dumpHeap方法。为了执行 dumpHeap 操作,参数 outputFile 和 live 作为 p0 和 p1 文本字段。

编程方法

与 JConsole 类似,HotSpotDiagnostic MBean 可以通过 Java 代码的程序调用来使用。为此,MBeanServer 实例必须在应用程序中注册 MBean。完成此操作后,需要一个 HotSpotDiagnosticMXBean 实例,并且必须调用该实例的 dumpHeap 方法。

4. IBM 管理控制台

假设您正在使用的应用程序运行在 IBM Websphere Application Server 上;管理控制台可以生成堆。首先,在管理控制台的导航窗格中,选择“故障排除”,然后选择“Java 转储和核心”。完成此操作后,为必须创建堆转储的服务器选择 server_name。之后,单击“堆转储”为上述服务器创建堆转储。 wsadmin 还可以用于创建堆转储。

以上是Java 堆转储的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!