I start the JVM always with GC logfile, it will help often to see problems in production.
There is a nice GUI to analyse it http://www.tagtraum.com/gcviewer.html
If there is no application memory leak you might check whether a different strategy of GC help.
For our application we switch to CMS with :
-XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 -XX:CMSIncrementalDutyCycle=10 -XX:NewRatio=1 -XX:SurvivorRatio=20
Also in this case we set the YoungGen=1400M and OldGen=600M to ensure that the old generation must never have an full-gc, all objects are dead before moved to ldGen.