你如何崩溃JVM?

问题

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

有人有什么想法吗?


#1 热门回答(162 赞)

我不会调用抛出OutOfMemoryError或StackOverflowError崩溃。这些只是正常的例外。要真正崩溃VM有三种方法:

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

对于最后一个方法,我有一个简短的例子,它会很好地破坏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 *文件的真正崩溃。


#2 热门回答(118 赞)

JNI.事实上,对于JNI,崩溃是默认的操作模式。你必须加倍努力才能让它不会崩溃。


#3 热门回答(50 赞)

用这个:

import sun.misc.Unsafe;

public class Crash {
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    public static void crash() {
        unsafe.putAddress(0, 0);
    }
    public static void main(String[] args) {
        crash();
    }
}

此类必须位于引导类路径中,因为它使用受信任的代码,因此运行如下:

java -Xbootclasspath / p:。紧急