RFR: RP closures should accept NULL referents

Aleksey Shipilev shade at redhat.com
Fri Feb 23 12:16:00 UTC 2018


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