RFR 8212958: Allow Klass::_subklass and _next_sibling to have unloaded classes
Erik Österlund
erik.osterlund at oracle.com
Fri Oct 26 15:04:03 UTC 2018
Hi Coleen,
On 2018-10-26 14:09, coleen.phillimore at oracle.com wrote:
>
> Hi Dean, Thank you for reviewing this.
>
> On 10/26/18 2:17 AM, dean.long at oracle.com wrote:
>> Hi Coleen. Most of this looks good to me, but I have a few questions:
>>
>> Is the need for Compile_lock around accesses new in 12, because the
>> implementor and subclass links can now be cleaned without being at a
>> safepoint?
>
> Yes. Erik's going to take Compile_lock to clean these during
> concurrent class unloading. There were some unlocked accesses though
> that seemed suspicious before though.
>>
>> Style typo: In ciInstanceKlass::compute_has_subklass(), I think it
>> should be return "ik->subklass() != NULL".
>
> Fixed.
>>
>> I see that you removed the memoizing of _has_subklass but left
>> _implementor. I'm concerned that this might have a performance
>> impact and change behavior. It seems to allow has_subklass() to
>> change from true to false (and is_leaf_type() to change from false to
>> true) where previously that should have been impossible. With some
>> fiddling with the locking, I was able to add back _has_subklass. Do
>> you remember why you removed it?
>
> Yes, I removed the memoizing for _has_subklass because I couldn't take
> the Compile_lock in the ciInstanceKlass constructor, because some
> callers had it. If you have a change that will make that work, I'd
> be happy to use yours. I was trying to not change anything
> semantically, just grab fresh results from InstanceKlass which I
> didn't think would affect performance (although it grabs Compile_lock
> so maybe it could). We can revert this part and add locking to
> ciInstanceKlass constructor. I've been trying to avoid conditional
> locking.
Can you really safely rely on a cached boolean w.r.t. unloading? The
instant we release the mark end safepoint, compiler threads will come
asking if there are subklasses, before we have started doing unloading,
and they have to get consistent answers that there are no subklasses, if
the one subklass had died. So it seems to me that this value must be
computed and not cached. You can however use the same trick I used for
CompiledMethod::is_unloading in 8212958, and make the answer belong to
an epoch. That way, we force computation for the first time only that
the question is asked, and use the cached result that we know to be
consistent w.r.t. unloading in subsequent calls. But I wonder if we are
micro optimizing by doing that here.
Thanks,
/Erik
> Thanks,
> Coleen
>>
>> dl
>>
>> On 10/25/18 1:42 PM, coleen.phillimore at oracle.com wrote:
>>> Summary: Don't return unloaded klasses. Make sure access is
>>> protected by Compile_lock.
>>>
>>> See bug for more description. This test has compiler changes since
>>> the weak klass links in Klass (and implementor in InstanceKlass are
>>> used by the compiler). All the compiler jtreg tests passed.
>>>
>>> Tested with mach5 tier1-7 and test added.
>>>
>>> open webrev at http://cr.openjdk.java.net/~coleenp/8212958.01/webrev
>>> bug link https://bugs.openjdk.java.net/browse/JDK-8212958
>>>
>>> Thanks,
>>> Coleen
>>
>
More information about the hotspot-dev
mailing list