RFR: 8242054: Shenandoah: New incremental-update mode
Roman Kennke
rkennke at redhat.com
Mon Apr 6 12:21:48 UTC 2020
I made a mistake with webrev.02, it included the change for JDK-8242130.
Please review this webrev instead:
http://cr.openjdk.java.net/~rkennke/JDK-8242054/webrev.03/
Thanks,
Roman
>>> Bug:
>>> https://bugs.openjdk.java.net/browse/JDK-8242054
>>> Webrev:
>>> http://cr.openjdk.java.net/~rkennke/JDK-8242054/webrev.00/
>
> I rebased this patch on top of "JDK-8242130: Shenandoah: Simplify
> arraycopy-barrier dispatching"
>
> Now that we purged traversal-mode, I also added tests for IU mode, by
> (mostly) mechanically adding back the tests that I removed with
> Traversal mode, and change ShenandoahGCMode=traversal ->
> ShenandoahGCMode=iu.
>
>> *) I would prefer for flag checks to be first. It makes it clearer to me that path is only taken in
>> some configurations. Example, this:
>> if (dest_uninitialized && ShenandoahSATBBarrier) ...
>> ...becomes this:
>> if (ShenandoahSATBBarrier && dest_uninitialized) ...
>
> Right. Fixed the occurances that I found (the mentioned one is gone with
> JDK-8242130.
>
>> *) These blocks should not be removed. At very least we want to make the check for SATB/StoreVal
>> barrier conditional on the mode. But other barrier checks should definitely stay.
>>
>> 47 // Final configuration checks
>> 48 SHENANDOAH_CHECK_FLAG_SET(ShenandoahLoadRefBarrier);
>> 49 SHENANDOAH_CHECK_FLAG_SET(ShenandoahSATBBarrier);
>> 50 SHENANDOAH_CHECK_FLAG_SET(ShenandoahCASBarrier);
>> 51 SHENANDOAH_CHECK_FLAG_SET(ShenandoahCloneBarrier);
>
> Ok. I turned it into:
> SHENANDOAH_CHECK_FLAG_SET(ShenandoahSATBBarrier ||
> ShenandoahStoreValEnqueueBarrier)
>
> which required the macro to do !(name) instead of !name.
>
>> *) This is some local madness:
>>
>> 84 int gc_state = _heap->gc_state();
>> 85 if ((gc_state & ShenandoahHeap::MARKING) != 0 &&
>> 86 ShenandoahStoreValEnqueueBarrier &&
>> 87 !_heap->marking_context()->allocated_after_mark_start(obj)) {
>> 88 ShenandoahUpdateRefsForOopClosure<false, false, true> cl;
>> 89 obj->oop_iterate(&cl);
>> 90 } else if ((gc_state & ShenandoahHeap::HAS_FORWARDED) != 0) {
>> 91 if (skip_bulk_update(cast_from_oop<HeapWord *>(obj))) return;
>
> This should be gone with JDK-8242130, plus in this revision I also made
> the clone_barrier() to dispatch in a very similar fashion.
>
>> *) I don't think the rewrite in ShFinalMarkTask is equivalent. See, on the path here:
>>
>> 262 ShenandoahSATBAndRemarkCodeRootsThreadsClosure tc(&cl,
>> 263 ShenandoahStoreValEnqueueBarrier ? &mark_cl : NULL,
>> 264 &blobsCl);
>>
>> ...we used to pass NULL as blobsCL when do_nmethods is false.
>
> Right. Good catch!
>
>> *) Also, why ResourceMark here?
>>
>> 199 if (_cl != NULL) {
>> 200 ResourceMark rm;
>> 201 thread->oops_do(_cl, _code_cl);
>
> Because Threads::oops_do() allocates some Resource stuff. It's
> everywhere where Thread::oops_do() is called. Should probably be
> looked-at separately?
>
>
> http://cr.openjdk.java.net/~rkennke/JDK-8242054/webrev.02/
>
> Better?
>
> Roman
>
More information about the hotspot-gc-dev
mailing list