java - 如何使 JVM 崩溃?

标签 java jvm

我正在阅读一本关于编程技巧的书,其中作者问受访者,“你如何使 JVM 崩溃?”我认为你可以通过编写一个最终会耗尽所有内存的无限 for 循环来做到这一点。

有人知道吗?

最佳答案

我不会将抛出 OutOfMemoryError 或 StackOverflowError 称为崩溃。这些只是正常的异常(exception)。要真正使 VM 崩溃,有 3 种方法:

  1. 使用 JNI 并在 native 代码中崩溃。
  2. 如果未安装安全管理器,您可以使用反射使虚拟机崩溃。这是特定于 VM 的,但通常 VM 会在私有(private)字段中存储一堆指向 native 资源的指针(例如,指向 native 线程对象的指针存储在 java.lang.Thread 的长字段中)。只需通过反射更改它们,VM 迟早会崩溃。
  3. 所有虚拟机都有错误,因此您只需触发一个即可。

对于最后一种方法,我有一个简短的示例,它将很好地使 Sun Hotspot VM 崩溃:

public class Crash {
    public static void main(String[] args) {
        Object[] o = null;

        while (true) {
            o = new Object[] {o};
        }
    }
}

这会导致 GC 中的堆栈溢出,因此您不会收到 StackOverflowError 而是真正的崩溃,包括 hs_err* 文件。

关于java - 如何使 JVM 崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65200/

相关文章:

java - 如何访问多维 vector 中的元素?

Java-Android SDK-savedInstanceState 和 onSaveInstanceState

JVM垃圾回收算法

java - 使用可维护性代理打开核心转储时出现错误 "windbg error:OpenDumpFile failed"

java - 如何确定 Kotlin 类型何时映射到 Java 类型?

java - 如何按键对 ArrayList<LinkedHashMap<String,String>> 进行排序?

java - 为什么使用另一个按钮后文件没有被删除

java - 在另一个类中调用静态方法后未修改记录器的 System.setProperty

java - 这种奇怪的 Java 行为的原因是什么?

java - 如何解析奇怪的(对我来说)时间戳字段