Hey!
There is no easy way to do this, however, I have recently been analyzing memory performance of large java apps, and can share some experience.
Here is how I found what objects are being promoted to old gen:
First you need to identify what objects are in "old/tenured" space. This is basically you standard java heap analysis. For this I recommend jmap. It is part of the sun jvm.
run:
jmap -dump:file=heap.hprof PID
to get a heap dump. This will pause the jvm during the dump (~for 30 secs on a 2GB heap)
Now load the .prof file in Memory analyser (the best tool for this, hands down)
I would spend a day playing with Memory analyzer to understand it, watch the screencam (needs a login, but worth it).
Now you will know what objects are in your heap.
Here is the trick: In the overview screen of Memory analyser, there is a link to: "Unreachable objects histogram". Now these objects are all to be collected during the next GC. But some are probably in eden, some in survivor and some in old.
Now, get some profiler with memory profiling capability, I prefer yourKit.
Run your app with yourkit and record object allocation.
Run it and record object creation. Once you have a list of objects created use all three lists to get a picture of what is going on. Do what humans do best, see patterns.
- What objects are created and are reachable. (Memory analyser)
- Objects unreachable in heap (Memory analyser)
- Objects created during a run (Profiler)
Another way to approach is YourKit generations view. You can take snapshots of your heap and compare what objects are still alive between snapshots. If you use this with visualgc you can determine how long an object must be alive to be promoted to old gen, and take snapshots at these intervals to see what objects are still alive.
Well, good luck.
/JT