创建许多对象时出现OutOfMemoryError

时间:2015-01-26 17:31:01

标签: java

我为游戏创建了一个AI,我试图找到AI的平均分数。由于游戏有运气因素,我需要多次重复游戏以平均得分。

问题是游戏非常庞大和复杂,所以当我尝试运行200个游戏的样本时,我会得到java.lang.OutOfMemoryError。我尝试在运行配置中使用-Xmx2048m增加可用内存量,但这只是一个临时修复,如果我想运行更大的样本,那么它将会失效。

代码基本上就像:

for(int i=0;i<200;i++) {
    game g = new game();
    //some other stuff for collecting data on the score etc.
}

无论如何我可以在每次循环后删除对象g,这样我就不会耗尽内存了吗?

2 个答案:

答案 0 :(得分:0)

Java的垃圾收集不是确定性的。也就是说,当垃圾收集器删除对象时,语言无法保证。

但是,保证在尝试释放尽可能多的内存之前调用new不会抛出OutOfMemoryError。来自the documentation

  

当Java虚拟机因内存不足而无法分配对象时抛出,垃圾收集器不再提供更多内存。

在以下代码中,

for (int i = 0; i < 200; i++) {
    game g = new game();
}

g引用的对象在循环的每次迭代后变得无法访问,因此需要进行垃圾回收。如果在下一次迭代中game对象的分配失败并带有OutOfMemoryError,那么您可以确定JVM已经尝试删除旧实例但仍然无法获得足够的内存。

如果您的实际代码更复杂,请注意不要泄漏对比当前循环迭代更长的game的引用。 (例如,将其插入某个列表中。)

答案 1 :(得分:-2)

为什么不在for循环之外声明变量:

game g;
for(int i = 0 ; i< 200; i ++){
g = new game();
//some other stuff for collecting data on the score etc.
}

或者将变量声明为最终

for(int i = 0 ; i< 200; i ++){
final game g = new game();
//some other stuff for collecting data on the score etc.
}