Java seems to ignore -Xms and -Xmx options

-Xmx specifies the max Java heap allocation (-Xms specifies the min heap allocation). The Java process has its own overhead (the actual JVM etc), plus the loaded classes and the perm gen space (set via -XX:MaxPermSize=128m) sits outside of that value too.

Think of your heap allocation as simply Java’s “internal working space”, not the process as a whole.

Try experimenting and you’ll see what I mean:

java -Xms512m -Xmx1024m ...

Also, try using a tool such as JConsole or JVisualVM (both are shipped with the Sun / Oracle JDK) and you’ll be able to see graphical representations of the actual heap usage (and the settings you used to constrain the size).

Finally, as @Peter Lawrey very rightly states, the resident memory is the crucial figure here – in your case the JVM is only using 16 MiB RSS (according to ‘top’). The shared / virtual allocation won’t cause any issues as long as the JVM’s heap isn’t pushed into swap (non-RAM). Again, as I’ve stated in some of the comments, there are other JVM’s available – “Java” is quite capable of running on low resource or embedded platforms.

Leave a Comment