[15] RFR 8239926: Shenandoah: Shenandoah needs to mark nmethod's metadata
Zhengyu Gu
zgu at redhat.com
Wed Mar 4 23:06:14 UTC 2020
Traversal GC has the same issue, also need to remark on stack code roots
in final traversal.
@@ -263,11 +263,12 @@
if (!_heap->is_degenerated_gc_in_progress()) {
ShenandoahTraversalRootsClosure roots_cl(q, rp);
ShenandoahTraversalSATBThreadsClosure tc(&satb_cl);
if (unload_classes) {
ShenandoahRemarkCLDClosure remark_cld_cl(&roots_cl);
- _rp->strong_roots_do(worker_id, &roots_cl, &remark_cld_cl,
NULL, &tc);
+ MarkingCodeBlobClosure code_cl(&roots_cl,
CodeBlobToOopClosure::FixRelocations);
+ _rp->strong_roots_do(worker_id, &roots_cl, &remark_cld_cl,
&code_cl, &tc);
} else {
CLDToOopClosure cld_cl(&roots_cl, ClassLoaderData::_claim_strong);
_rp->roots_do(worker_id, &roots_cl, &cld_cl, NULL, &tc);
}
} else {
Updated webrev: http://cr.openjdk.java.net/~zgu/JDK-8239926/webrev.01/
Thank,
-Zhengyu
On 2/25/20 12:13 PM, Zhengyu Gu wrote:
> Shenandoah encounters a few test failures with tools/javac. Verifier
> catches unmarked oops in nmethod's metadata during root evacuation in
> final mark phase.
>
> The problem is that, Shenandoah marks on stack nmethods in init mark
> pause, but it does not mark nmethod's metadata during concurrent mark
> phase, when new nmethod is about to be executed.
>
> The solution:
> 1) Use nmethod_entry_barrier to keep nmethod's metadata alive when the
> nmethod is about to be executed, when nmethod entry barrier is supported.
>
> 2) Remark on stack nmethod's metadata at final mark pause.
>
> Bug: https://bugs.openjdk.java.net/browse/JDK-8239926
> Webrev: http://cr.openjdk.java.net/~zgu/JDK-8239926/webrev.00/
>
> Test:
> hotspot_gc_shenandoah (fastdebug and release)
> tools/javac with ShenandoahCodeRootsStyle = 1 and 2 (fastdebug and
> release)
>
> Thanks,
>
> -Zhengyu
More information about the shenandoah-dev
mailing list