OK, two things.

First, you calculate -Xms and -Xmx values out of machine total RAM. That's, well, fine, unless people want to put something else on that machine. Then especially -Xms stands in a way, because Java starts with that much heap and there's no going back. Sure, you spare a few GC's with that, but I don't think that's worth it.

But, OK, with a little bit of tweaking, one can get what he/she wants from Java fine tunning.

However, what surprised me the most is the fact that it seems that you are not using server compiler? Why? Any possible problems noticed? Will I regret if I try it? It gives a considerable performance gains for long lived apps.