如何使 JVM 崩溃?

2022-08-31 07:22:14

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

有人知道吗?


答案 1

我不会把抛出一个 OutOfMemoryError 或 StackOverflowError 称为崩溃。这些只是正常的例外。要真正使 VM 崩溃,有 3 种方法:

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

对于最后一种方法,我有一个简短的示例,它将很好地使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

新浪网.实际上,对于 JNI,崩溃是默认的操作模式。你必须格外努力才能让它不崩溃。


推荐