如何让java崩溃
强制内存溢出
通过无限循环创建对象或加载大文件,耗尽堆内存。示例代码:
List<Object> list = new ArrayList<>();
while (true) {
list.add(new byte[1024 * 1024]); // 持续分配1MB内存
}
栈溢出攻击
递归调用无终止条件,耗尽栈空间。示例代码:
public void stackOverflow() {
stackOverflow(); // 无限递归
}
直接操作JVM内存
使用Unsafe类绕过安全检查,直接修改内存:
Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
Unsafe unsafe = (Unsafe) unsafeField.get(null);
unsafe.putAddress(0, 0); // 写入非法地址
线程死锁
创建多个线程互相持有对方所需资源:
Object lock1 = new Object();
Object lock2 = new Object();
new Thread(() -> {
synchronized (lock1) {
synchronized (lock2) {} // 等待lock2释放
}
}).start();
new Thread(() -> {
synchronized (lock2) {
synchronized (lock1) {} // 等待lock1释放
}
}).start();
调用原生代码崩溃
通过JNI调用C/C++代码执行非法操作(如空指针访问):

JNIEXPORT void JNICALL Java_Crash_nativeCrash(JNIEnv* env, jobject obj) {
int* ptr = NULL;
*ptr = 1; // 触发段错误
}
注意事项
- 生产环境中应避免此类操作,仅用于测试JVM容错机制。
- 部分方法需配置JVM参数(如
-XX:+CrashOnOutOfMemoryError)才能触发崩溃。 - 操作系统可能优先终止异常进程而非JVM崩溃。






