Impossible to say, "all you can get" is usually close.
You would have to monitor the application with jconsole or something while it's on heavy load, forcing garbage collection and seeing how much memory is actually being used.
That depends on the Java version and the GC strategy you use, and extremly to the application requirement!
If you have applications with short transactions and small memory footprint a small amount of memory will be better as the GC can act faster and does not have long 'stop the world' pauses, in that case I would prefere a 32Bit JVM b/c it can ge faster.
With bigger memory consumption I would use a 64bit JVM.
You have to monitor the behaviour.
One thing is very important, Objects that are not used for longer should be died before a GC happen to be not copied to often and never moved to the old generation of Heap.