javaoptimizationout-of-memoryheap-memoryheap-size

Java optimization to prevent heapspace out of memory


Ok, I have a problem in a particular situation that my program get the out of memory error from heap space.

Let's assume we have two ArrayList, the first one contains many T objects, the second one contains W object that are created from the T objects of first List.

And we cycle through it in this way (after the cycle the list :

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
}

My code is pretty similar to this one, but when list contains tons of objects I often get the heap space out of memory (during the for cycle), I'd like to solve this problem.

I do not know very well how the GC works in java, but surely in the previous example there are a lot of possible optimization. Since the list is not used anymore after the for cycle I thought as first optimization to change from for loop to do loop and empty the list as we cycle through it:

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
}

Is this modification useful? How can I do a better optimization to the above code? and how can I prevent heap space out of memory error? (increasing the XMX and XMS value is not a possibility).


Solution

  • You can try to set the -XX:MaxNewSize=40% of you Xmx AND -XX:NewSize=40% of you Xmx This params will speedup the GC calls, because your creation rate is high.

    For more help : check here