Use -verbosegc
Run the application
Try different memory sizes to see how this effects the rate of GCs.
This is the best way to determine the aplications overall memory requirements.
You can use a profiling tool such as JProfiler to deterrmine how the memory is used.
Note: these kind of tools have free trial periods.
An object often refers to other objects. These object may or may not have multiple references (so counting them more than once is not accurate) The actual amount of memory used is often greater than you might expect if you are used to C/C++. The system also uses memory in sometime unpredicable ways. Many methods create transient objects adding to your memory requirement. Shared libraries, the stack, the JVM itself do not appear in the heap size but use memory. Files accessed by the application can be significantly effect the desirable file cache size.
The only real way to determine your application's memory requirement is to actively test the application, anything else is just guess work.