我为游戏创建了一个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
,这样我就不会耗尽内存了吗?
答案 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.
}