帮写一个java程序

genguyige 2011-06-28 11:53:40
今天看书的时候,书上给出了一个很有意思的题目是这样的

仅用java,写一个能让JVM崩溃的程序

好吧 (1)把jVM的堆空间沾满并且不能回收jvm是不是会崩溃呢


我写了一个程序运行了一下 但是不知道能不能达到要求,请高手给点思路



public class test4
{

private test4 test;
public test4(){
test=new test4();
}
public static void main(String[] args){
new test4();
}
}


...全文
455 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangxuefeng0627 2011-07-04
  • 打赏
  • 举报
回复
围观中,你懂的。。。。
hepeng_8 2011-07-01
  • 打赏
  • 举报
回复
数值溢出就可以的哦
mynameiscloud 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 genguyige 的回复:]
我在一本书上看到一个面试官的问题就是

只用纯java语言写一个程序 目的就是让JVM崩溃

并且还说 这是一个很基本的程序 当时我是从java堆内存的方向着手

就是无限的创建对象 当没有空间分配的时候就会crash了 但是后来想想这只是内存溢出的报错

只是属于error的一种 就像Exception一样 只是导致现在的虚拟机不能正常运行 并不能导致它崩溃

希……
[/Quote]

那本书一定是《我编程我快乐》
sweat99 2011-07-01
  • 打赏
  • 举报
回复
木有想过这个问题···
chenchenyangll 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 genguyige 的回复:]

我深入的看了下java虚拟机

我想到一种办法可以做到让虚拟机无法再运行 但不会报错

在JVM中有是这样规定的 每一个线程对应着一个栈 而JVM是基于内存的

内存的大小是有限的 我们没有办法使得堆crash掉 但是可以通过方法来占满CPU 或者内存 这样JVM同样是没有办法继续运行

在java中一个线程是对应一个栈的 如果我无限的开启新线程……
[/Quote]

我以前的测试是最后 内存溢出吧。。
qingmingcom 2011-07-01
  • 打赏
  • 举报
回复
package com.stephen;

import java.util.ArrayList;

public class Test {

private Test test = null;

private static int i = 0;

public Test() {
while (i < 10) {
i++;
test = new Test();
}
}

public static void main(String[] args) {
ArrayList list = new ArrayList(10000);
int i = 0;
try {
while (true) {
i++;
list.add(new Object());
}
} catch (Throwable e) {
e.printStackTrace();
System.out.println(i);
}
// Test test = new Test();
// System.out.println();
}

}


结果:
java.lang.OutOfMemoryError: Java heap space
14781414
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.ArrayList.ensureCapacity(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at com.stephen.Test.main(Test.java:24)
qingmingcom 2011-07-01
  • 打赏
  • 举报
回复
ArrayList list = new ArrayList();
while(true){
list.add(new Object());
}

内存一直申请不释放,就像精满自溢一样。
kjma 2011-07-01
  • 打赏
  • 举报
回复
写个类 或者集合 什么对象的 用递归 不信他不崩溃
金兄 2011-07-01
  • 打赏
  • 举报
回复
围观有意思的东东
genguyige 2011-06-30
  • 打赏
  • 举报
回复
我在一本书上看到一个面试官的问题就是

只用纯java语言写一个程序 目的就是让JVM崩溃

并且还说 这是一个很基本的程序 当时我是从java堆内存的方向着手

就是无限的创建对象 当没有空间分配的时候就会crash了 但是后来想想这只是内存溢出的报错

只是属于error的一种 就像Exception一样 只是导致现在的虚拟机不能正常运行 并不能导致它崩溃

希望有高手能给点其他思路 最好是从虚拟机内部原理来破坏他的~~
genguyige 2011-06-30
  • 打赏
  • 举报
回复
我深入的看了下java虚拟机

我想到一种办法可以做到让虚拟机无法再运行 但不会报错

在JVM中有是这样规定的 每一个线程对应着一个栈 而JVM是基于内存的

内存的大小是有限的 我们没有办法使得堆crash掉 但是可以通过方法来占满CPU 或者内存 这样JVM同样是没有办法继续运行

在java中一个线程是对应一个栈的 如果我无限的开启新线程 那么内存或者CPU会不会崩溃呢?

所以写了如下程序

public class mythread implements Runnable
{
private Thread thread;
public void run(){
thread=new Thread(new mythread());
}
}



public class test
{
public static void main(String[] args){
while (true)
{
Thread thread=new Thread(new mythread());
thread.start();
}
}
}



然后我运行的结果是 他果然是能够把CPU给我占到百分之百
jianguohh 2011-06-30
  • 打赏
  • 举报
回复
这个是不断递归调用构造函数,最后堆栈益处

望舒 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chenchenyangll 的回复:]
有意思 围观
[/Quote]
++
Spring源码解析 2011-06-30
  • 打赏
  • 举报
回复
这个有意思,关注中……
javaxuexiyang 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wenbodong 的回复:]

无限递归会导致递归栈溢出,申请内存过大导致内存溢出,这两个都会抛出异常,而不是让JVM崩溃
[/Quote]

不会崩溃 正解
KingViker 2011-06-30
  • 打赏
  • 举报
回复
顶了 暂时没思路
genguyige 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 wang153723482 的回复:]

我们也搞过这东西。。。
用java让机器死机。。。。。。。。。。。。
[/Quote]

那你的思路是什么?
乌鸦不会飞 2011-06-30
  • 打赏
  • 举报
回复
我们也搞过这东西。。。
用java让机器死机。。。。。。。。。。。。
  • 打赏
  • 举报
回复
顶起来继续关注
  • 打赏
  • 举报
回复
你写的没问题啊,运行就会栈溢出。
ps:不要相信
while(true){
System.out.println("overflow");
}
加载更多回复(18)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧