RFR: RP closures should accept NULL referents
Roman Kennke
rkennke at redhat.com
Fri Feb 23 13:28:01 UTC 2018
Seems ok.
On Fri, Feb 23, 2018 at 1:16 PM, Aleksey Shipilev <shade at redhat.com> wrote:
> http://cr.openjdk.java.net/~shade/shenandoah/refproc-nulls/webrev.01/
>
> Our nightlies show failures like these during regular marking:
>
> # SIGSEGV (0xb) at pc=0x00007fda773cbf3b, pid=79325, tid=79327
> #
> # Problematic frame:
> # V [libjvm.so+0xd7af3b] ShenandoahIsAliveClosure::do_object_b(oopDesc*)+0x6b
>
> Stack: [0x00007fda74ef6000,0x00007fda74ff6000], sp=0x00007fda74ff4b00, free space=1018k
> Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native
> code)
> V [libjvm.so+0xd7af3b] ShenandoahIsAliveClosure::do_object_b(oopDesc*)+0x6b
> V [libjvm.so+0xbff28d] ReferenceProcessor::discover_reference(oopDesc*, ReferenceType)+0xad
> V [libjvm.so+0xd24e0c] void InstanceRefKlass::oop_oop_iterate<true,
> ShenandoahMarkRefsClosure>(oopDesc*, ShenandoahMarkRefsClosure*)+0xcec
> V [libjvm.so+0xd4cd47] void ShenandoahConcurrentMark::mark_loop_work<ShenandoahMarkRefsClosure,
> true, true, true>(ShenandoahMarkRefsClosure*, unsigned short*, unsigned int,
> ParallelTaskTerminator*)+0x11f7
> V [libjvm.so+0xd54be8] void ShenandoahConcurrentMark::mark_loop_prework<true, true, true>(unsigned
> int, ParallelTaskTerminator*, ReferenceProcessor*, bool, bool, bool)+0x398
> V [libjvm.so+0xd77824] ShenandoahConcurrentMarkingTask::work(unsigned int)+0x1a4
> V [libjvm.so+0xeee39d] GangWorker::loop()+0x4d
> V [libjvm.so+0xb77a22] thread_native_entry(Thread*)+0xf2
>
> It seems that we should really accept NULL referents, like the relevant closures in G1 and CMS do,
> and we should return "false", to let reference discovery deal with these references accurately. See
> analogous code:
>
> bool CMSIsAliveClosure::do_object_b(oop obj) {
> HeapWord* addr = (HeapWord*)obj;
> return addr != NULL &&
> (!_span.contains(addr) || _bit_map->isMarked(addr));
> }
>
> bool G1CMIsAliveClosure::do_object_b(oop obj) {
> HeapWord* addr = (HeapWord*)obj;
> return addr != NULL &&
> (!_g1->is_in_g1_reserved(addr) || !_g1->is_obj_ill(obj));
> }
>
> Testing: hotspot_gc_shenandoah, new test
>
> Thanks,
> -Aleksey
>
More information about the shenandoah-dev
mailing list