[sh/8u] Root processing related backports
Zhengyu Gu
zgu at redhat.com
Wed May 13 17:56:23 UTC 2020
Updated:
http://cr.openjdk.java.net/~zgu/shenandoah/sh-8u-root-processing/webrev.02/
>
> Minor nits:
>
> *) Double ";;" in shenandoahClosures.inline.hpp here:
>
> 111 T o = oopDesc::load_heap_oop(p);;
>
Fixed
> *) In here, we can pull ShenandoahWeakRoots out of both branches?
>
> 768 void ShenandoahConcurrentMark::weak_roots_work() {
> 769 ShenandoahHeap* const heap = ShenandoahHeap::heap();
> 770 ShenandoahIsAliveSelector is_alive;
> 771
> 772 if (heap->has_forwarded_objects()) {
> 773 ShenandoahWeakUpdateClosure cl;
> 774 ShenandoahWeakRoots weak_roots;
> 775 weak_roots.weak_oops_do(is_alive.is_alive_closure(), &cl, 0);
> 776 } else {
> 777 DoNothingClosure cl;
> 778 ShenandoahWeakRoots weak_roots;
> 779 weak_roots.weak_oops_do(is_alive.is_alive_closure(), &cl, 0);
> 780 }
> 781 }
>
> *) This block in op_final_mark() looks redundant:
>
> 1457 if (has_forwarded_objects()) {
> 1458 // Degen may be caused by failed evacuation of roots
> 1459 if (is_degenerated_gc_in_progress()) {
> 1460 concurrent_mark()->update_roots(ShenandoahPhaseTimings::degen_gc_update_roots);
> 1461 } else {
> 1462 concurrent_mark()->update_thread_roots(ShenandoahPhaseTimings::update_roots);
> 1463 }
> 1464 }
>
> Look, it is removed here:
> https://hg.openjdk.java.net/jdk/jdk/rev/61f6c19d1a56#l3.23
>
> ...and there is already the assert here:
>
> 1446 assert(!has_forwarded_objects(), "No forwarded objects on this path");
Right, I did not realize the backport (it came in after initial backport.)
Fixed.
>
> *) I think all other fields are in plural form, so it should be e.g. "_jvmti_roots"?
>
> 51 class ShenandoahSerialRoots {
> 52 private:
> 53 ShenandoahSerialRoot _universe_root;
> 54 ShenandoahSerialRoot _management_root;
> 55 ShenandoahSerialRoot _jvmti_root;
> 56 ShenandoahSerialRoot _jni_handle_root;
> 57 ShenandoahSerialRoot _flat_profiler_root;
>
>
Fixed.
> *) What are these additional checks for _invalid_phase?
>
> 132 ShenandoahGCWorkerPhase::ShenandoahGCWorkerPhase(const ShenandoahPhaseTimings::Phase phase) :
> 133 _timings(ShenandoahHeap::heap()->phase_timings()), _phase(phase) {
> 134 if (_phase != ShenandoahPhaseTimings::_invalid_phase) {
> 135 _timings->record_workers_start(_phase);
> 136 }
> 137 }
> 138
> 139 ShenandoahGCWorkerPhase::~ShenandoahGCWorkerPhase() {
> 140 if (_phase != ShenandoahPhaseTimings::_invalid_phase) {
> 141 _timings->record_workers_end(_phase);
> 142 }
> 143 }
>
Hmm ... screwed up somewhere, removed.
>>> *) cleanup_jni_refs() is dropped in shenandoahConcurrentMark.cpp here, where is it added back? I
>>> looked at weak_roots_work(), is it in ShenandoahWeakRoots now? We have to be very accurate about
>>> this, because we broke it already at least once :)
>>
>> Yes, jni weak handles are encapsulated in ShenandoahWeakRoots now.
>>
>>>
>>> 501 // When we're done marking everything, we process weak references.
>>> 502 if (_heap->process_references()) {
>>> 503 weak_refs_work(full_gc);
>>> 504 } else {
>>> 505 cleanup_jni_refs();
>>> 506 }
>>>
>> Above logic is obvious fault, because processing weak references has
>> nothing to do with jni weak handles.
>
> Kinda. 8u is special here:
> https://mail.openjdk.java.net/pipermail/shenandoah-dev/2019-December/011193.html
>
> But, I can see that ShenandoahConcurrentMark::weak_roots_work() is now called unconditionally, so it
> does the same thing? And there is no explicit call to JvmtiExport::weak_oops_do, which makes us
> protected from this mess:
>
> 303 // In JDK 8, this is handled by JNIHandles::weak_oops_do. We cannot enter here, because
> 304 // it would walk the JvmtiTagMap twice (which is okay) and possibly by multiple threads
> 305 // (which is not okay, because that walk is not thread-safe). In subsequent releases,
> 306 // it is handled in a more straightforward manner, see JDK-8189360.
> 307 /*
> 308 ShenandoahForwardedIsAliveClosure is_alive;
> 309 JvmtiExport::weak_oops_do(&is_alive, oops);
> 310 */
>
Ok, I digged into 8u reference processor, and yes, jni weak oops are
cleaned there.
Although, I could not find JDK-8189360 backport, but JVMTI weak oops no
longer piggyback to JNIHandles::weak_oops_do() ... which I missed.
So, let's call weak_roots_work() unconditional, has it filter out JNI
weak oops if reference processing is on.
Thanks,
-Zhengyu
More information about the shenandoah-dev
mailing list