Java – how to choose the jvm heap size

heapjavajvm

What i usually do concerning the jvm heap size is setting the max value really high to avoid the infamous OutOfMemoryException.

However, this strategy (or lack of strategy) doesn't seem to be really smart. :-).

My question is how to choose the min and max values, and the difference between the two (should max-min be small or big?).
For instance, from here:

if the initial heap is too small, the
Java application startup becomes slow
as the JVM is forced to perform
garbage collection frequently until
the heap has grown to a more
reasonable size. For optimal startup
performance you should set the initial
heap size to the same as the maximum
heap size.

thanks.

Best Answer

My question is how to choose the min and max values, and the difference between the two (should max-min be small or big?)

Short answer: don't guess, profile your application.

jconsole can give you useful high-level data such as a feeling for the main resident set vs. the transient data that we normally allocate and garbage collect. What you'll see if you look at the memory tab of that display is usually something like a sawtooth. The lower corner of the sawteeth is about where I would normally set the heap minimum whereas I would use the peak or slope of the sawteeth to experiment with a heap maximum. If your teeth are very steep, you might consider a big heap just to delay the garbage collection. However, if they aren't, you could try a smaller heap maximum to see if that might leave more resources for other processes on your machine (for example).

You should also consider the server VM as that will cause different garbage collection behavior.

All that said, you should also use a more detailed tool such as jvisualvm to profile the memory usage of your process. It's possible that you have a memory leak or greedy allocator that you could tune or eliminate. That would completely change your heap needs.