Thanks for looking into it, Andreas!

On 22.08.2008 00:15:00 Andreas Delmelle wrote:
<snip/>
> So, I was wondering about the role of the reference queue. Calling  
> poll() returns the first reference /if/ one is available, so it seems  
> likely that cleanSegment() does get called frequently enough, but  
> there's always the possibility that it returns without a reference  
> being available, yet. Or, as it happens, after throwing away only  
> roughly half of the references.
> Maybe it's only those that are also effectively enqueued at the time  
> the cleanup is triggered (didn't try adding this to the stats yet).

Javadoc says about WeakReference that the queueing may happen at some
point after the reference is cleared. But a delay alone doesn't explain
that so many instances weren't cleared.

I got the impression that the cleaning wasn't done for some cache
segments at all because the threshold never got reached. Just a feeling.

> In the meantime, I've made some changes, bypassing the  
> ReferenceQueue, and simply cleaning all buckets that map to the  
> segment in question, and now the behavior already seems more like  
> what I had in mind.
> The first runs, each segment corresponds to one bucket, and the  
> output now shows the number dropping to 0% for the related bucket.

Segments: always 32
Buckets: initially 8, rehash doubles the number of buckets each time

That doesn't match what you're saying. Initially, 4 segments would share
entries in 1 bucket. After a few rehashes, each segment would have its
entries in a set of buckets. I think that's why in your patch the
segment.count goes down into the negative (i.e. it's wrong).

Plus, the removal of the reference queue polling just queues up
references which are never cleared. I've fixed that locally.

I'm going to try to fix the first problem above but I think that might
not be possible without a performance penalty. Let's hope it's negligable.

> See the attached patch. Still needs some cleanup, and haven't done  
> any long-running tests, nor checked the cache for other types. I  
> copied some, but not all of the added debug-code.
> 
> There are still a few things that bug me about StringProperty's  
> cache, since for example, it is used in a lot of cases where not the  
> property but its String value is attached to the FOs (reducing the  
> benefits of caching somewhat, and probably explaining the large  
> number of stale entries here...)

Stale entries, yes, but at least the String instances are reused because
they come from the canonicalized StringProperty. And we're using
WeakReferences which get claimed very early. I don't think there's much
we can/need to do about that.

> 
> Hope this helps some.

Yes, it has shown me an aspect that I have missed.


Jeremias Maerki

Reply via email to