Shenandoah: assert(klass->is_loader_alive()) failed: must be alive
Zhengyu Gu
zgu at redhat.com
Wed Sep 18 21:22:57 UTC 2019
Nevermind, failed in 32-bit JVM again. Sigh!
-Zhengyu
On 9/18/19 3:14 PM, Roman Kennke wrote:
> The locking in ShenandoahNMethodTable::register_nmethod() is dirty. I
> would *very* much prefer to shuffle that code around to use scoped
> lockers. It's also buggy, because there is an early return there, which
> would miss the unlock. A way to do this would be to pull the disarm into
> the if-else blocks, and put scope inside the if-else too.
>
> Roman
>
>> We have seen above assertion failures in shenandoah/jdk nightly tests
>> periodically, especially after JDK-8230401.
>>
>> It actually became quite reproducible on my local machine with
>> tier3_gc_shenandoah after JDK-8230401.
>>
>> The problem appears to be missing proper synchronization of metadata
>> of newly registered nmethod. Initially, I thought new nmethod is
>> registered under CodeCahe_lock and concurrent codecache iteration
>> always starts with acquiring CodeCache_lock lock. What I missed is
>> that, the actual codecache iteration is done by worker thread, while
>> the CodeCache_lock is acquired by VMThread. Therefore, it never
>> establishes synchronization of newly created nmethod metadata
>> (ShenandoahNMethod) between compiler thread (registering the nmethod)
>> and worker thread (processing the nmethod).
>>
>> The solution is to always acquire per-nmethod lock when changing and
>> iterating the metadata.
>>
>> Webrev:
>> http://cr.openjdk.java.net/~zgu/shenandoah/assert_is_loader_alive/webrev.00/
>>
>>
>> Test:
>> hotspot_gc_shenandoah (fastdebug and release)
>>
>> hotspot_gc_shenandoah/tier3_gc_shenandoah (fastdebug) with 10+
>> iterations on my local machine and gotland respectively.
>>
>> Thanks,
>>
>> -Zhengyu
>>
>>
More information about the shenandoah-dev
mailing list