Public Class Bad终止了吗?内存不足?

时间:2013-08-26 21:01:40

标签: java out-of-memory

public class Bad {
    public static void main(String[] args) {
        Integer[] buff = new Integer[5000000];
        int i = 0;
        while (true) {
            i++;
            if (i == buff.length)
                i = 0;
            Integer obj = new Integer(i); // line 14
            buff[i] = obj;
            // do something useful with buff[i];
        }
    }
}

在几秒钟后意外终止,并显示以下消息 在命令行打印: 线程“main”中的异常java.lang.OutOfMemoryError:Java堆空间 在exam.Bad.main(Bad.java:14)

任何人都可以解释出现了什么问题,请为我提供解决问题的代码吗?

3 个答案:

答案 0 :(得分:3)

你只是用尽了堆空间 简而言之,堆是内存的(有限)部分,在执行new指令时会分配动态数据。

Integer[] buff = new Integer[5000000];

将分配很大一部分堆空间,并且在你的循环中,Integer obj = new Integer(i);将分配更多堆内存,直到限制(这是异常的原因)。

  

-Xmx设置最大Java堆大小

选项(对于java命令),您可以分配更大的堆空间

编辑(关于你的代码):

for(int i=0;i < buff.length;i++) {
  if (i == buff.length) {
    // But this is only an hint to perform garbage as soon as possible
    System.gc();
    i = 0;
  }
  Integer obj = new Integer(i); // line 14
  buff[i] = obj;
  // do something useful with buff[i];
}

但你有(可能)最大化堆空间让它工作,取决于执行垃圾时

答案 1 :(得分:1)

你有一个无限循环 while(true)
并在循环中的堆上创建对象

Integer obj = new Integer(i);

所以你的堆空间用完了。

你没有告诉我们你的代码是做什么的,但你需要在某个时候打破循环或者有一个返回false的条件。由于你只是一遍又一遍地执行循环,除了重新设置数组中的元素之外你可能只需要经历一次而不是将i重置为0

答案 2 :(得分:0)

你必须放break;,但在if (i == buff.length)删除代码后你有一个错误的操作:i = 0;

这是我认为可以帮助您的代码:

public class Bad {
    public static void main(String[] args) {
        Integer[] buff = new Integer[500];
        int i = 0;
        while (true) {
            Integer obj = new Integer(i); // line 14
            buff[i] = obj;
            // do something useful with buff[i];
            //After do something use a coditional to break the loop like this
             i++;
            if(i>=buff.length){i = 0;break;}

        }
    }
}