I generally take a couple of heapdumps each few seconds apart just to see the pattern of what is being released and what might be sticking around.
Then I drill down into the objects that are suspicious and find what is holding the reference to them. Often it boils down to some resources not being closed properly, excessive use of session objects, static variables, leaks in some class loaders, inmemory cache or some object in a list that is still being referenced to.
It not always easy to go through though hundreds and thousands of objects and interpret what's going on. I have found this course on JavaPassion to be very helpful to a beginner.