Bug: ReferenceProcessor does from-space writes?
Roman Kennke
rkennke at redhat.com
Thu Dec 15 11:36:21 UTC 2016
This is odd.
During marking, we should only enqueue Reference objects that are in
to-space. Adding read-barriers into ReferenceProcessor is most likely
only hiding the real bug. The most likely cause is failing to mark a
Reference object in previous cycle, thus not evacuating it....
Is this reproducible?
Roman
Am Donnerstag, den 15.12.2016, 12:32 +0100 schrieb Aleksey Shipilev:
> 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