RFR: 8215773: applications/kitchensink/Kitchensink.java crash with "assert(ZAddress::is_marked(addr)) failed: Should be marked"

coleen.phillimore at oracle.com coleen.phillimore at oracle.com
Fri Jan 4 14:16:35 UTC 2019



On 1/4/19 8:28 AM, Erik Österlund wrote:
> Hi Coleen,
>
> On 2019-01-04 13:37, coleen.phillimore at oracle.com wrote:
>>
>> Hi Erik,  This is kind of creepy.  They use the dead mirror and call 
>> identity hash on it, which writes to the dead mirror.
>
> Yup, that's right. This is equivalent to how during code cache 
> unloading, possibly dead java.lang.invoke.CallSite objects are chased 
> down, and their possibly dead CallSiteContext are queried so that we 
> can write to its dependency context. It is creepy indeed, but is 
> completely safe to do in the context it is done in, as the same thread 
> performing the accesses, is the thread that will eventually free the 
> memory of the dead objects. And in that incident, I did the same 
> thing: use AS_NO_KEEPALIVE when peeking at the dead objects.
>
>> Are these functions called at a safepoint?  Maybe JFR could do 
>> something different here.
>
> Yeah, they are called from safepoints with STW-unloading, and called 
> by the ZDriver (the concurrent GC thread controlling the GC phases), 
> during concurrent class unloading.

Ah, ok.  I was getting this mixed up with the cld_unloading_do() calls 
in jfr.  This is called by do_unloading.
Looks strange but good.  This is for 12 right?
Thanks,
Coleen
>
> Thanks,
> /Erik
>
>> Coleen
>>
>>
>> On 1/4/19 5:10 AM, Erik Österlund wrote:
>>> Hi,
>>>
>>> During SystemDictionary::do_unloading(), JFR pokes around at the 
>>> dead mirror oops that died due to class unloading.
>>> The mirror is loaded without AS_NO_KEEPALIVE, which makes ZGC load 
>>> barriers a bit sad, because they dislike loading dead oops.
>>>
>>> The solution is to load these mirrors with AS_NO_KEEPALIVE 
>>> decorators, indicating that it is okay for them to be dead as we are 
>>> only peeking at them. This is fine to do during concurrent execution 
>>> by the GC thread that is performing class unloading, and hence 
>>> controls the GC cycle, making sure that the memory of the dead oops 
>>> is not reclaimed until the accesses have safely finished.
>>>
>>> Bug:
>>> https://bugs.openjdk.java.net/browse/JDK-8215773
>>>
>>> Webrev:
>>> http://cr.openjdk.java.net/~eosterlund/8215773/webrev.00/
>>>
>>> Manually ran kitchensink 24 hours to make sure this doesn't happen 
>>> again. And hs-tier1-6 on linux.
>>>
>>> Thanks,
>>> /Erik
>>
>



More information about the hotspot-runtime-dev mailing list