关于编写Java程序让Jvm崩溃
作者:网络转载 发布时间:[ 2014/4/28 9:59:12 ] 推荐标签:Java Jvm
结果便是控制台输出如下的错误:
Exception in thread "main" java.lang.StackOverflowError
at jvm.JvmBean.<init>(JvmBean.java:5)
at jvm.JvmBean.<init>(JvmBean.java:5)
at jvm.JvmBean.<init>(JvmBean.java:5)
at jvm.JvmBean.<init>(JvmBean.java:5)
at jvm.JvmBean.<init>(JvmBean.java:5)
一长串的"at jvm.JvmBean.<init>(JvmBean.java:5)",后面的被我省略了。
结果看来,同样也造成了jvm崩溃,可是错误类型跟例子程序的不同,说堆栈溢出错误,并且无论是否输出,错误都一样发生,为什么呢?
由于评论的两位老兄的热心指点,两个问题都水落石出了!
这里过一下整个流程。
第一个异常 结合天添老兄说的,Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at jvm.Crash.main(Crash.java:10)是因为程序无法申请到足够的内存的时候抛出的异常,Object数组o不断指向新的Object数组,数组元素是原来的Object数组,这使得Object维数越来越高。不断申请内存空间,终导致超出jvm中堆的大值。堆内存溢出。为什么输出打印,时间会延长呢?yahokuma老兄一言惊醒梦中人!输出打印的话,虚拟机并不是不会崩溃,而是崩溃的时间大大延长了。而崩溃时间延长其实是假象,是因为输出属于IO事件,每次输出CPU都被中断,IO很耗时,所以,感觉上才会时间延长。
第二个异常,yahokuma 老兄在下面评论中已经说的很清楚了,我这里搬过来——“类内部的静态属性 > 静态块 > 对象属性 > 构造方法。注意这一点,那是说 bean属性会先于JvmBean的构造函数被初始化。在你main函数中,new一个 JvmBean的构造函数之前,类内部的JvmBean对象要优先被初始化,这个类内部的属性bean的内部同样也包含了一个JvmBean对象需要被初始化,成循环调用,造 成了栈溢出。”所以异常才会是这个——Exception in thread "main" java.lang.StackOverflowError
我把原JvmBean改一下
1 package jvm;
2
3 public class JvmBean {
4
5 JvmBean bean = null;
6
7 public JvmBean(JvmBean bean){
8 this.bean = bean;
9 }
10 }
这样终得到的结果跟第一个例子一样了。
如何使Jvm崩溃呢?如果想使它堆内存空间不足,造成典型的内存泄漏,可以创建对象,使它们不断向深层次引用。产生Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 这样的错误。如果想使他们栈空间不足,简单的,是在方法里,如构造方法里不断申请新的内存空间够了,如我第二个错误例子的示范。

sales@spasvo.com