美文网首页Java架构技术栈
有OutOfMemoryError有关的JVM参数

有OutOfMemoryError有关的JVM参数

作者: 若丨寒 | 来源:发表于2021-01-13 21:37 被阅读0次
    image

    JVM提供了有用的参数来处理 OutOfMemoryError 。在本文中,我们将重点介绍这些JVM参数。在排除OutOfMemoryError故障时,它可能会很方便。这些JVM参数是:

    1. -XX:HeapDumpOnOutOfMemoryError-XX:HeapDumpPath

    2. -XX:onAutofmemoryError

    3. -XX:+ExitOnOutOfMemoryError

    4. -XX:+CrashOnOutOfMemoryError

    让我们在本文中详细讨论这些JVM参数。

    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath

    堆转储dump文件基本上是内存的快照。它包含有关内存中存在的对象、这些对象中存在的实际数据以及这些对象的引用的详细信息。堆转储是解决内存问题的重要工件。

    为了诊断OutOfMemoryError或任何与内存相关的问题,必须在应用程序开始遇到OutOfMemoryError之前的某一时刻或几分钟捕获堆转储。很难在适当的时候手动捕获堆转储,因为我们不知道何时抛出OutOfMemoryError。但是,通过在命令行中启动应用程序时传递以下JVM参数,可以自动捕获堆转储:

    -XX:+HeapDumpOnOutOfMemoryError
    
    -XX:HeapDumpPath={HEAP-DUMP-FILE-PATH}
    

    例子:

    -XX:+HeapDumpOnOutOfMemoryError
    
    -XX:HeapDumpPath=/crasks/my-heap-dump.hprof
    

    在' -XX:HeapDumpPath '中,需要指定存储堆转储的文件路径。

    当您传递这两个JVM参数时,当抛出OutOfMemoryError时,堆转储将被自动捕获并写入指定的文件路径。

    一旦捕获了堆转储,就可以使用诸如HeapHero、Eclipse MAT之类的工具来分析堆转储。

    -XX:OnOutOfMemoryError

    您可以将JVM配置为在抛出OutOfMemoryError时调用任何脚本。大多数情况下,OutOfMemoryError不会使应用程序崩溃。但是,一旦发生OutOfMemoryError,最好重新启动应用程序。因为OutOfMemoryError可能会使应用程序处于不稳定状态。来自不稳定应用程序实例的请求可能导致错误的结果。

    例子:

    -XX:OnOutOfMemoryError=/scripts/restart-myapp.sh
    

    当您传递此参数时,JVM将调用“/scripts/restart-myapp.sh“,每当抛出OutOfMemoryError时编写脚本。在这个脚本中,您可以编写代码来优雅地重新启动应用程序。

    -XX:+CrashOnOutOfMemoryError

    当您传递此参数时,JVM将在抛出OutOfMemoryError时立即退出。除了退出,JVM还会生成文本和二进制崩溃文件(如果启用了核心文件)。但就我个人而言,我不喜欢配置这个论点,因为我们应该始终以实现优雅的退出为目标。突然退出可能/将危及正在进行的交易。

    我运行了一个生成OutOfMemoryError的应用程序,其参数为' -XX:+CrashOnOutOfMemoryError'。当抛出OutOfMemoryError时,我可以看到JVM立即退出。下面是标准输出流中的消息:

    Aborting due to java.lang.OutOfMemoryError: GC overhead limit exceeded
    #
    # A fatal error has been detected by the Java Runtime Environment:
    #
    #  Internal Error (debug.cpp:308), pid=26064, tid=0x0000000000004f4c
    #  fatal error: OutOfMemory encountered: GC overhead limit exceeded
    #
    # JRE version: Java(TM) SE Runtime Environment (8.0_181-b13) (build 1.8.0_181-b13)
    # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.181-b13 mixed mode windows-amd64 compressed oops)
    # Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
    #
    # An error report file with more information is saved as:
    # C:\workspace\tier1app-svn\trunk\buggyapp\hs_err_pid26064.log
    #
    # If you would like to submit a bug report, please visit:
    #   http://bugreport.java.com/bugreport/crash.jsp
    

    从消息中,您可以看到要在“C:\workspace\tier1app-svn\trunk\buggyapp\hs_err_pid26064.log”中生成的hs_err_pid文件。hs_err_pid文件包含有关崩溃的信息。您可以使用fastThread之类的工具来分析hs_err_pid文件。但是hs_err_pid中的大部分时间信息都是非常基本的。仅对OutOfMemoryError进行故障排除是不够的。

    -XX:+ExitOnOutOfMemoryError

    当您传递这个参数时,JVM将在抛出OutOfMemoryError时立即退出。如果要终止应用程序,可以传递此参数。但就我个人而言,我不喜欢配置这个论点,因为我们应该始终以实现优雅的退出为目标。突然退出可能/将危及正在进行的交易。

    我用这个 -XX:+ExitOnOutOfMemoryError 参数运行了相同的内存泄漏程序。与' -XX:+CrashOnOutOfMemoryError '不同,这个JVM参数在JVM刚刚退出没有生成任何文本/二进制文件。

    来源:https://www.tuicool.com/articles/ZZvABnB

    相关文章

      网友评论

        本文标题:有OutOfMemoryError有关的JVM参数

        本文链接:https://www.haomeiwen.com/subject/yvipaktx.html