Some applications use an extensive set of objects. Upon startup of JVM, a set of objects is assigned a fixed heap space. When the JVM becomes heavily loaded with live objects, this heap space tends to fill up and you are left with no more memory. This results in an java.lang.OutOfMemoryError. To overcome this, start your JVM like this:
java -Xms20m -Xmx40m MyMainClass-Xms20m signals JVM to allocate 20MB memory while startup. This acts as lower limit.-Xmx40m signals JVM that it can not cross 40MB of memory. This acts as upper limit.
This allows applications to specify a memory range dependent on their requirements.
Using these flags also improves performance. Some applications use a large amount of memory during startup. As soon as they reach the default lower limit, the JVM increases its allocated memory. This allocation happens everytime your application reaches the allocated memory. So if you specify a big amount as the lower limit while starting the application, the JVM won’t allocate memory every now and then so your application loads faster.