代码之家  ›  专栏  ›  技术社区  ›  Michael Neale

我如何使JVM退出任何outofmemoryException,即使坏人试图抓住它

  •  21
  • Michael Neale  · 技术社区  · 14 年前

    OOME是一类错误,通常您不应该从中恢复。但是,如果它被隐藏在线程中,或者有人捕获了它,应用程序可能会进入一种不退出但不有用的状态。即使在使用可能会愚蠢地试图捕获可丢弃或错误/oome的库时,对于如何防止这种情况,有什么建议吗?(即您没有修改源代码的直接访问权)

    9 回复  |  直到 9 年前
        1
  •  34
  •   Michael Neale    12 年前

    解决方案:

    -XX:OnOutOfMemoryError="<cmd args>; <cmd args>"
    

    定义:当第一次抛出OutOfMemoryError时,运行用户定义的命令。(1.4.2更新12、6中介绍)

    http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

    终止运行进程的示例:

    -XX:OnOutOfMemoryError="kill -9 %p"
    
        2
  •  8
  •   Community CDub    8 年前

    如果应用程序的JVM中的某段代码决定它要尝试捕获OOMES并尝试恢复,那么(不幸的是)没有什么可以阻止它……除了可能不切实际、对应用程序的性能和可维护性不利的AOP特性之外。除此之外,您所能做的最好的事情就是使用“OnAutofMemoryError”钩子拔掉JVM上的插头。请参阅上面的答案: https://stackoverflow.com/a/3878199/139985/

    基本上,您必须信任其他开发人员,不要做愚蠢的事情。其他你可能不应该试图防御的蠢事包括:

    • 打电话 System.exit() 在图书馆方法的深处,
    • 打电话 Thread.stop()


        3
  •  2
  •   irreputable    14 年前
    1. OutOfMemoryError.java System.exit()

    2. java.lang

    3. rt.jar

        4
  •  1
  •   DerMike Vladimír Schäfer    14 年前

        5
  •  0
  •   Adam Schmideg    14 年前

    System.exit()

        7
  •  0
  •   Michael Neale    14 年前

        8
  •  0
  •   josefx    14 年前
        9
  •  -1
  •   biasedbit    14 年前