1-your old generation is never filling up! your young generation is soo large that it contains all short lived objects, and after a small gc, survivors also have a 1/8 of 192 meg. That is a lot. So another small gc may cause to clear all non-permanent objects. Basically, I think your old-gen heap contains only the servlet/ejb (etc) code, none of the transaction (http/ejb/etc...)
2-you should be happy that you don't need a full gc.
if the OS swapped some memory to pagefile on disk, it will have to swap it in.
I have seen a full gc of almost 2 minute! (117 seconds). (I keep tellilng sun to implements a non-paged memory option for the JVM but they stupidly say I just need more ram. Ok then, why did they added that option (ISM: intimate shared memory) to the solaris 1.3.1 jvm?!!!)
3-you could want the heap to defrag on full GC and reduce the young generation and survivor size. But again why would you do so...
On jdk 1.4.2 I use (for my eclipse IDE)
4- for complete details, you must read pretty much ALL the following: