[sh/jdk8u] MetadataOnStackMark::record() is not MT-safe
Zhengyu Gu
zgu at redhat.com
Thu Jul 29 13:07:05 UTC 2021
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