[sh/jdk8u] MetadataOnStackMark::record() is not MT-safe

Roman Kennke rkennke at redhat.com
Thu Jul 29 14:22:40 UTC 2021


Ok.

How about later JDKs? Could they be affected, too?

Thanks,
Roman

> This is not a Shenandoah specific bug, I believe G1 suffers the same 
> problem. The reason to fix Shenandoah first, in hope that we can have a 
> build for our customer to test this fix, as we don't have a reproducer. 
> I can move the fix to jdk8u if you think otherwise.
> 
> Apparently, MetadataOnStackMark::record() was never designed for MT, but 
> G1 and Shenandoah's parallel cleaning code can call 
> nmethod::do_unloading_parallel() from different worker threads, and 
> nmethod::do_unloading_parallel() in turn calls 
> nmethod::clean_ic_if_metadata_is_dead() which may call 
> Metadata::mark_on_stack() to record metadata to MetadataOnStackMark().
> 
> Calling MetadataOnStackMark::record() without synchronization, may 
> corrupt internal buffer, which can result fatal error in 
> MetadataOnStackMark's destructor, when it walks the buffers.
> 
> 
> This problem is hard to reproduce, cause it is only possible when there 
> are redefined classes.
> 
> 
> Webrev: 
> http://cr.openjdk.java.net/~zgu/shenandoah/metadata_on_stack/webrev.00/
> 
> Thanks,
> 
> -Zhengyu
> 



More information about the shenandoah-dev mailing list