请问下列java代码为什么可以让jvm崩溃?请详细解释,比如它是怎么让垃圾收集机制失效的等等。。。

//让jvm崩溃publicclassCrash{publicstaticvoidmain(String[]args){Object[]o=null;while(true... // 让jvm崩溃
public class Crash {
public static void main(String[] args) {
Object[] o = null;

while (true) {
o = new Object[] { o };
}
}
}
为什么它能避开抛出异常的机制,不让抛出outofmemoryException这样的异常,而是直接让jvm崩溃?o = new Object[] { o }; 这个语句是怎么漂亮地避开异常机制的。
展开
 我来答
骑仕猎人
2012-03-14 · TA获得超过343个赞
知道小有建树答主
回答量:386
采纳率:100%
帮助的人:208万
展开全部
jvm判断对象是否存活的算法是这样的:给对象中添加一个引用计数器,当有一个地方引用它,计数器加1,当引用失效,计数器减1,任何时刻计数器为0的对象就是不可能再被使用的。 但它无法解决对象循环引用的问题。
举个简单的例子:对象A和B分别有字段b、a,令A.b=B和B.a=A,除此之外这2个对象再无任何引用,那实际上这2个对象已经不可能再被访问,但是gc却无法回收他们。
____邱
2012-03-13 · 超过19用户采纳过TA的回答
知道答主
回答量:90
采纳率:0%
帮助的人:35.6万
展开全部
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.stanley.testCrash.Crash.main(Crash.java:8)

java.lang.OutOfMemoryError异常发生的原因
常见的有以下几种:

1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

3.代码中存在死循环或循环产生过多重复的对象实体;

4.使用的第三方软件中的BUG;

5.启动参数内存值设定的过小;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
flyingFish211
2012-03-13 · TA获得超过2.1万个赞
知道大有可为答主
回答量:1.5万
采纳率:50%
帮助的人:1.1亿
展开全部
死循环, 把JVM 内存耗费完了。
追问
你有没有搞错,java的抛出异常机制是很强大的,一般的死循环是不可能让jvm崩溃的,只会抛出异常,这个代码是精心避开了异常的,有没仔细看啊。。。
追答
不做解释,自己跑一下 就知道是什么原因了。问人问题还态度恶劣

Exception in thread "main" java.lang.OutOfMemoryError
at Crash.main(Crash.java:7)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
pj1990zp
2012-03-13 · TA获得超过171个赞
知道小有建树答主
回答量:295
采纳率:100%
帮助的人:130万
展开全部
死循环啊,条件永远为真,
o = new Object[] { o }; 是创建了一个实力对象,也就是给o分配了内存地址,不停地分配内存地址导致内存耗完了
更多追问追答
追问
为什么垃圾收集机制失效了?为什么没有抛出异常,和一般的死循环区别在哪?
追答
JAVA是纯粹的面向对象的编程语言,其程序以类为单位,程序运行期间会在内存中创建很多类的对象。这些对象在完成任务之后,JAVA的垃圾回收机制会自动释放这些对象所占用的空间,使回收的内存能被再次利用,提高程序的运行效率
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
heliangb46
2012-03-13 · 贡献了超过125个回答
知道答主
回答量:125
采纳率:0%
帮助的人:17.3万
展开全部
他的底层就存在抛出异常机制,就算他不知道什么异常,他也会抛出一个Exception的基类,所以他很安全
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式