Chances are that your current GC ill suits your task. To get a predictable GC timings you may try to use G1 garbage collector (I'm assuming you're on Java 7u4 or later).G1 is planned as the long term replacement for the Concurrent Mark-Sweep Collector (CMS). Comparing G1 with CMS, there are differences that make G1 a better solution. G1 offers more predictable garbage collection pauses than the CMS collector, and allows users to specify desired pause targets.
Play with the following options to archive the best performance for your particular case:
-XX:+UseG1GC - Tells the JVM to use the G1 Garbage collector.
-XX:MaxGCPauseMillis=500 - Sets a target for the maximum GC pause time. This is a soft goal, and the JVM will make its best effort to achieve it. Therefore, the pause time goal will sometimes not be met. The default value is 200 milliseconds.
-XX:InitiatingHeapOccupancyPercent=80 - Percentage of the heap occupancy to start a concurrent GC cycle. It is used by G1 to trigger a concurrent GC cycle based on the occupancy of the entire heap, not just one of the generations. A value of 0 denotes 'do constant GC cycles'. The default value is 45%.
More details available here