我正在阅读一本关于编程技巧的书,其中作者问受访者,“你如何使 JVM 崩溃?”我认为你可以通过编写一个最终会耗尽所有内存的无限 for 循环来做到这一点。
有人知道吗?
最佳答案
我不会将抛出 OutOfMemoryError 或 StackOverflowError 称为崩溃。这些只是正常的异常(exception)。要真正使 VM 崩溃,有 3 种方法:
- 使用 JNI 并在 native 代码中崩溃。
- 如果未安装安全管理器,您可以使用反射使虚拟机崩溃。这是特定于 VM 的,但通常 VM 会在私有(private)字段中存储一堆指向 native 资源的指针(例如,指向 native 线程对象的指针存储在 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* 文件。
关于java - 如何使 JVM 崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65200/