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)
任何人都可以解释出现了什么问题,请为我提供解决问题的代码吗?
答案 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;}
}
}
}