在 Java 中,堆转储提供了某个时刻 Java 虚拟机内存中存在的整个对象的快照。堆转储对于解决内存泄漏问题和优化不同 java 应用程序中的内存使用非常有用。每个实例的详细信息(如地址、类名、类型、对另一个对象的引用)都记录在堆转储中。堆转储有两种格式,例如便携式堆转储格式、二进制格式和asci 文本的经典格式。在下面的部分中,让我们了解生成堆转储的不同工具和技术。
开始您的免费软件开发课程
网络开发、编程语言、软件测试及其他
通常,此堆转储用于我们正在使用的 Java 应用程序占用的内存超过我们的预期,或者应用程序因 OutOfMemoryError 崩溃。如果我们分析堆转储,将有助于识别异常的根本原因。除此之外,堆转储还可以用于识别详细信息,例如每个类的内存使用情况、每个类中的对象数量等。此外,还可以捕获精细的细节,以及单个对象占用的内存量还可以找出应用程序中存在的Java对象。这些信息可以帮助我们识别导致内存泄漏问题的实际代码。
以下是下面提到的以下工具和技术
堆转储可以使用 JDK 下的不同工具来捕获,这些工具位于 JDK 主目录中的 bin 文件夹中。为此,可以使用命令行,因为该目录存在于系统路径中。
jmap 是一个可在本地和远程进程中使用的工具,用于打印正在运行的 JVM 中的内存统计信息。
要使用 jmap 生成堆转储,可以使用 dump 选项,如下所示。
jmap -dump:[live] , format = b , file=< path of the file > <process id>
jcmd 是一个向 Java 虚拟机发送命令请求的工具。此外,它必须存在于运行 Java 进程的机器中。
要获取堆转储,可以使用命令 GC.heap_dump,只需提及输出的 pid 和文件路径,如下所示。
jcmd < pid > GC.heap_dump < path of the file >
JVisualVM 是一个具有简单直观的图形用户界面的工具,允许我们监视、故障排除和分析 Java 应用程序。要使用它生成堆转储,必须右键单击 Java 进程,并选择“堆转储”选项。完成此操作后,该工具将创建堆转储,并在新选项卡中打开它。
不使用上面提到的手动技术,而是使用命令行选项 HeapDumpOnOutOfMemoryError 在抛出 java.lang.OutOfMemoryError 时自动创建堆转储:
java - XX:+HeapDumpOnOutOfMemoryError
java_pid
除了默认路径之外,还可以使用其他文件路径,为此,可以使用 HeapDumpPath 选项,如下所示。
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=< file_path >
因此,当应用程序使用这种方式运行内存中断时,可以在创建的由堆转储组成的文件中看到日志:
在此,HotSpotDiagnostic MBean 用于生成允许 2 个参数的 dumpHeap 技术。
他们是:
outputFile,这是创建的转储的文件路径。确保该文件的扩展名应为 hprof。
live,和jmap中的类似。如果设置了此项,则仅打印具有活动引用的对象
让我们看看两种不同的技术来调用此方法来捕获堆转储。
像 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 方法。
假设您正在使用的应用程序运行在 IBM Websphere Application Server 上;管理控制台可以生成堆。首先,在管理控制台的导航窗格中,选择“故障排除”,然后选择“Java 转储和核心”。完成此操作后,为必须创建堆转储的服务器选择 server_name。之后,单击“堆转储”为上述服务器创建堆转储。 wsadmin 还可以用于创建堆转储。
以上是Java 堆转储的详细内容。更多信息请关注PHP中文网其他相关文章!