Does growth in old gen memory usage always mean memory leak in java?
Not necessarily.
The concurrent mark sweep garbage collector does not compact the old gen during collection. So under sufficient memory load, it's possible to get a large amount of fragmentation, making it impossible to reclaim enough memory to allow promotion of tenured objects into the old gen space.
Try turning on these params and see what's going on:
-XX:+PrintGCDetails -XX:+PrintPromotionFailure -XX:PrintFLSStatistics=1
Look for promotion failures and frequent full GC sweeps that fail to free up a lot of memory.
If you're using Java 7 or higher you can try switching to the G1 collector (-XX:+UseG1GC instead of -XX:+UseConcMarkSweepGC). This is a compacting collector which avoids some of the above issues.
If you're still running into problems after that, then I'd look to your code to see if something is hanging onto object references when it shouldn't.
Edit: since this is happening on some hosts and not others, I'd lean towards a code issue, perhaps related to unexpected user input, since it only occurs sporadically.