• JVM堆内存转储


    堆转储是 JVM 中特定时刻内存中的所有对象的快照。它们对于解决内存泄漏问题并优化 Java 应用程序中的内存使用情况非常有用。

    堆转储通常以二进制格式 hprof 文件存储。我们可以使用 jhat 或 JVisualVM 等工具打开和分析这些文件。

    下面介绍两种堆转储的方式:

    1. JCMD

      jcmd 是一个非常完整的工具,它通过向 JVM 发送命令请求来工作。我们必须在运行 Java 进程的同一台计算机上使用它。

      其众多命令之一是 GC.heap_dump。我们只需指定进程的 pid 和输出文件路径,就可以使用它来获取堆转储:

    jcmd <pid> GC.heap_dump <file-path>

      例如:

    1. [root@cwy-hbcsh-zyl-1 HDTool]# jps
    2. 22387 jar
    3. 17925 jar
    4. 13383 jar
    5. 26682 Jps
    6. 21422 jar
    7. [root@cwy-hbcsh-zyl-1 HDTool]# jcmd 17925 GC.heap_dump /opt/HDTool/dump.hprof
    8. 17925:
    9. Heap dump file created
    10. [root@cwy-hbcsh-zyl-1 HDTool]#

    2. 自动捕捉head dump

      上面工具jcmd旨在在特定时间手动捕获堆转储。在某些情况下,我们希望在发生内存溢出错误 java.lang.OutOfMemoryError 时, JVM自动执行堆内存转储,以方便事后进行排查和分析。

      JVM提供了一个命令行启动参数 HeapDumpOnOutOfMemoryError, 使用的格式为:

    java -XX:+HeapDumpOnOutOfMemoryError
    • 如果不用 HeapDumpPath 选项指定转储路径,则会自动保存到启动目录下,文件名的格式为: 
    java_pid<pid>.hprof
    • 指定 HeapDumpPath 参数的使用示例如下:
    java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=

       对于某个应用服务,启动脚本中设置内存溢出转储路径为/opt/logs/app。如下:

    特别说明:不建议内存溢出文件名写死,建议只写路径;否则,再次发生内存溢出,内存溢出文件无法成功保存。

       如下:文件命名为heapdump.hprof,下次发生内存溢出,再次生成的heapdump.hprof无法保存。

       无法保存的提示如下:

    1. java.lang.OutOfMemoryError: Java heap space
    2. Dumping heap to /opt/logs/app/heapdump.hprof ...
    3. Unable to create /opt/logs/app/heapdump.hprof: 文件已存在
  • 相关阅读:
    C#面:XML与 HTML 的主要区别是什么
    【C++初阶】STL详解(三)vector的介绍与使用
    基于 Delphi 的前后端分离:之一
    算法通关村第17关【青铜】| 贪心
    深入区块链技术(一)
    [每周一更]-(第13期):灰度测试的解释说明
    React中ref的使用方法和使用场景(详解)
    内点法最优潮流matlab程序
    Rust 构建跨平台 GUI 的新选择
    postgresql:记录表膨胀引起的io问题的处理
  • 原文地址:https://blog.csdn.net/silgen/article/details/133159487