RFR (S) CR 6857566: (bf) DirectByteBuffer garbage creation can outpace reclamation
Peter Levart
peter.levart at gmail.com
Wed Oct 2 18:46:11 UTC 2013
On 10/02/2013 07:30 PM, Aleksey Shipilev wrote:
> On 10/02/2013 09:15 PM, Peter Levart wrote:
>> On 10/02/2013 06:31 PM, Alan Bateman wrote:
>>> One thing that I'd like to understand is the implication of moving
>>> from phantom to weak references.
>> I think Cleaners as WeakReferences are not correct.
>>
>> Imagine the following code:
>>
>> Reference<ByteBuffer> refBb;
>> {
>> ByteBuffer dbb = ByteBuffer.allocateDirect(1000);
>> refBb = new SoftReference<>(dbb);
>> }
>> System.gc(); // can clear Cleaners, might already process them
>>
>>
>> ByteBuffer dbb = refBb.get(); // whoops!
>>
>>
>> ...you could get a reference to direct ByteBuffer after the cleaner has
>> already deallocated it's native memory block...
> Ummm, aren't the Cleaners forbidden to run in this case?
>
> The strength is: strong > soft > weak > phantom, that is:
> We can not process strongly-reachable soft references.
> We can not process strongly/softly-reachable weak references.
> We can not process strongly/softly/weakly-reachable phantom references.
>
> If you keep the either strong or soft reference to dbb, then it's softly
> reachable, not yet weakly-reachable, and then Cleaners are still
> standing by. Note that Cleaners might run if your dbb is
> phantomly-reachable, but that is OK, since you will not be able to
> recover dbb through phantomref anyway.
You're right. I jumped to conclusion to quickly. I was mislead by the
agility of a particular reference type to be cleared. It only makes
sense that the strength is inversely proportional to agility.
Regards, Peter
> -Aleksey.
More information about the core-libs-dev
mailing list