好的,我在特定情况下遇到问题,我的程序从堆空间中获取内存不足错误。
假设我们有两个 ArrayList,第一个包含许多T
对象,第二个包含从第一个 List 的对象W
创建的T
对象。
我们以这种方式循环遍历它(在循环列表之后:
public void funct(ArrayList<T> list)
{
ArrayList<W> list2 = new ArrayList<W>();
for (int i = 0 ; i < list.size() ; i++)
{
W temp = new W();
temp.set(list.get(i));
temp.saveToDB();
list2.add(temp);
}
// more code! from this point on the `list` is useless
}
我的代码与这个非常相似,但是当list
包含大量对象时,我经常将堆空间从内存中取出(在 for 循环期间),我想解决这个问题。
我不太清楚GC
java中的工作原理,但是在前面的示例中肯定有很多可能的优化。由于在list
for 循环之后不再使用,我认为这是第一个优化,在我们循环通过它时从for loop
to更改do loop
并清空:list
public void funct(ArrayList<T> list)
{
ArrayList<W> list2 = new ArrayList<W>();
while (list.size() > 0)
{
W temp = new W();
temp.set(list.remove(0));
temp.saveToDB();
list2.add(temp);
}
// more code! from this point on the `list` is useless
}
这个修改有用吗?如何对上述代码进行更好的优化?以及如何防止堆空间内存不足错误?(增加XMX
andXMS
值是不可能的)。