Hello Chris,
2 - You could set JVM arguments to request the JVM to GC sooner. However, I don't think that's the best way to go.
3 - Similarly to above, you could forcefully tune this but you're not necessarily attacking the root cause.
With #2 & #3, I'd suggest avoiding where possible. Unless you're specifically seeing confirmed issues with the JVM's own self-tuning I'd avoid trying to give it any tuning hints. The JVM is a complex and very capable piece of code and with respect to the GC engines, self tunes depending on the usage. Even if you go so far to speak to the engineers of the GC engines, many will tell you about the wonderful tuning possibilities but finish with a statement like "don't bother - let it take care of itself".
I'd use a combination of information from FusionReactor to see what's running at the time of the OOM errors and #1 to see what's happening and why you don't have enough memory. It could be that your application simply needs more memory to support your user-load. However, if you're seeing lots of available memory after a GC that's unlikely. What I suspect you'll find is you've got a long running query/page that's holding on to a bunch of memory until it completes. Only after completion will a GC be able to release the memory and thus this is why you're seeing the issue. Therefore attacking the slow query/page will release the memory sooner and keep the system stable.
I'd also mention here that we (makers of FusionReactor) have consulting services that are very likely the fastest and most cost effective route to resolution for you. Further details are on our dedicated consulting brand website:
http://www.cfconsultant.com/
Best regards,
David Stockton
Fusion Team