问题
我正在读一本关于编程技巧的书,其中作者问受访者:"你如何崩溃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:。紧急