On Jul 20, 2007, at 16:51, Jeremias Maerki wrote:

Want to find a memory leak? SAP's memory analyzer is great again to find
out all paths to GC roots:

<snip />
As a simplification here, let's assume "cache" (PropertyCache in static variable) is our GC root. Hard references are to "propCache", then "m" and "table". From there it goes to the WeakHashMap$Entry in the array with a
hard reference. From the Entry, you have a hard reference (!) to the
FixedLength instance through "value" and a weak reference through
"referent" (which you can find in java.lang.ref.Reference). QED.

Yep, I see the point. QED indeed.

If this were my current focus, I'd remove PropertyCache in favor of
specialized and optimized FlyWeightFactories and I'd attach those to the
rendering run so I can get rid of the need for thread synchronization
and weak references. I'd do some isolated timing experiments comparing
PropertyCache and the FlyWeightFactories. But since this has to wait
until later this year, I guess I'm happy enough if you guys trying out
Adrian's suggestion in order to get a quick solution.

Adrian's suggestion should be enough FTM, to guarantee that even in exotic cases with a huge amount of distinct property values in long series of subsequent and concurrent runs, there are no leaks. I just tried it out, and now, after finishing a run only the mentioned initial values referenced by the Makers, are retained in the Map. The specified values particular to the run are now correctly released after the run has finished.



Reply via email to