通过编写Java代码让Jvm崩溃
在书上看到一个作者提出一个问题"怎样通过编写java代码让jvm崩溃",我看了之后也不懂。带着问题查了一下,百度知道里面有这样一个答案:
1 package jvm;
2
3 public class crash {
4 public static void main(string[] args) {
5
6 //object[] o = {"abc"};初始值赋值,不会有影响。
7 object[] o = null;
8
9 while (true) {
10 o = new object[] { o };
11 //输出的话,jvm就不会崩溃。
12 //system.out.println(o);
13 }
14 }
15 }
程序运行十几秒之后,控制台会出现这样的错误:
exception in thread "main" java.lang.outofmemoryerror: java
heap space
at jvm.crash.main(crash.java:10)
很明显,超出内存空间错误。
我将原程序随意改了一下,如赋初始值等,对程序无影响。
可是我将死循环中的o输出在控制台的时候,jvm居然一直都不崩,为什么输出的话,就不会超出内存空间呢?
我看来,原程序能够使jvm崩溃,是因为死循环中,通过旧对象,不断创建出新的对象,即创造的对象是互相引用的,所以gc是不会回收它们的,造成堆栈溢出。
仿照这个例子,我写了一个简单的类,模仿例子程序中的数组,如下:
1 package jvm;
2
3 public class jvmbean {
4
5 jvmbean bean = new jvmbean(this);
6
7 public jvmbean(jvmbean bean){
8 this.bean = bean;
9 }
10 }
然后简单测试,如下:
1 package jvm;
2
3 public class mycrash {
4
5 public static void main(string[] args) {
6 jvmbean j = null;
7 while(true){
8 j = new jvmbean(j);
9 //无论输出不输出,jvm都会崩溃
10 //system.out.println(j);
11 }
12 }
13 }