I have read this article about virtual machine garbage collection tuning to understand the java garbage collector better. Each space has a Virtual heap space area
Edit: I think I may have something wrong. Putting this note here while I investigate, to keep from sending folks down the wrong path!
Ales0x's answer is great if you are using Parallel Scavenge GC (-XX:+UseParallelGC), but Concurrent Mark-Sweep GC (-XX:+UseConcMarkSweepGC) does not support adaptive sizing.
With Concurrent Mark-Sweep, the new/young generation size is set based on the initial heap size (unless you specify -XX:NewSize=). The new generation size will not change as the heap grows.