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