Bug: ReferenceProcessor does from-space writes?

Aleksey Shipilev shade at redhat.com
Thu Dec 15 11:32:02 UTC 2016


Hi,

Our CI brought us this assert:

[VM ERROR] o.o.j.t.tearing.buffers.DirectByteBufferInterleaveTest
    (JVM args: [-Xmx16g, -XX:+ShenandoahStoreCheck,
-XX:ShenandoahGCHeuristics=aggressive, -XX:+ShenandoahVerifyOptoBarriers,
-XX:+VerifyStrictOopOperations, -XX:+UseShenandoahGC, -XX:-UseCompressedOops,
-Xint])
  Observed state   Occurrences   Expectation  Interpretation

     0, 128, 128             0    ACCEPTABLE  Seeing all updates intact.


    Messages:
        # To suppress the following error report, specify this argument
        # after -XX: or in .hotspotrc:
SuppressErrorAt=/shenandoahBarrierSet.cpp:272
        #
        # A fatal error has been detected by the Java Runtime Environment:
        #
        #  Internal Error
(/opt/jenkins/workspace/jdk9-shenandoah-fastdebug/hotspot/src/share/vm/gc/shenandoah/shenandoahBarrierSet.cpp:272),
pid=29026, tid=29028
        #  assert(o == __null || oopDesc::unsafe_equals(o,
resolve_oop_static(o))) failed: only write to-space values


hs_err shows this stack:

V  [libjvm.so+0x15bc01f]  VMError::report_and_die(int, char const*, char const*,
__va_list_tag*, Thread*, unsigned char*, void*, void*, char const*, int,
unsigned long)+0x15f
V  [libjvm.so+0x15bcdda]  VMError::report_and_die(Thread*, char const*, int,
char const*, char const*, __va_list_tag*)+0x4a
V  [libjvm.so+0xa4e87a]  report_vm_error(char const*, int, char const*, char
const*, ...)+0xea
V  [libjvm.so+0x13b374f]  ShenandoahBarrierSet::write_ref_field_work(void*, oop,
bool)+0x11f
V  [libjvm.so+0x132f0e7]  BarrierSet::write_ref_field(void*, oop, bool)+0x57
V  [libjvm.so+0x132c6dd]
ReferenceProcessor::enqueue_discovered_reflist(DiscoveredList&)+0x71d
V  [libjvm.so+0x1331582]  RefProcEnqueueTask::work(unsigned int)+0xa2
V  [libjvm.so+0x162b935]  GangWorker::loop()+0xc5
V  [libjvm.so+0x12315c2]  thread_native_entry(Thread*)+0x112

The code is:

    ...
    next_d = java_lang_ref_Reference::discovered(obj); // RB here
    ...
    java_lang_ref_Reference::set_next_raw(obj, obj);
    if (! oopDesc::safe_equals(next_d, obj)) {
      oopDesc::bs()->write_ref_field(
           // !!! Oops, re-reading without RB here?
           java_lang_ref_Reference::discovered_addr(obj),
           next_d);

Most uses of Reference::*_addr seem suspicious to me.

Thanks,
-Aleksey



More information about the shenandoah-dev mailing list