--- old/src/share/vm/gc/serial/markSweep.cpp 2016-01-24 11:21:54.007763764 +0100 +++ new/src/share/vm/gc/serial/markSweep.cpp 2016-01-24 11:21:53.948764780 +0100 @@ -299,9 +299,11 @@ #ifdef ASSERT template static void trace_reference_gc(const char *s, oop obj, + bool is_ephemeron, T* referent_addr, T* next_addr, - T* discovered_addr) { + T* discovered_addr, + T* value_addr) { log_develop_trace(gc, ref)("%s obj " PTR_FORMAT, s, p2i(obj)); log_develop_trace(gc, ref)(" referent_addr/* " PTR_FORMAT " / " PTR_FORMAT, p2i(referent_addr), p2i(referent_addr ? (address)oopDesc::load_decode_heap_oop(referent_addr) : NULL)); @@ -309,18 +311,29 @@ p2i(next_addr), p2i(next_addr ? (address)oopDesc::load_decode_heap_oop(next_addr) : NULL)); log_develop_trace(gc, ref)(" discovered_addr/* " PTR_FORMAT " / " PTR_FORMAT, p2i(discovered_addr), p2i(discovered_addr ? (address)oopDesc::load_decode_heap_oop(discovered_addr) : NULL)); + if (is_ephemeron) { + log_develop_trace(gc, ref)(" value_addr/* " PTR_FORMAT " / " PTR_FORMAT, + p2i(value_addr), p2i(value_addr ? (address)oopDesc::load_decode_heap_oop(value_addr) : NULL)); + } } #endif -template void static adjust_object_specialized(oop obj) { +template void static adjust_object_specialized(oop obj, InstanceRefKlass* klass) { T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); MarkSweep::adjust_pointer(referent_addr); T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); MarkSweep::adjust_pointer(next_addr); T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr(obj); MarkSweep::adjust_pointer(discovered_addr); - debug_only(trace_reference_gc("InstanceRefKlass::oop_ms_adjust_pointers", obj, - referent_addr, next_addr, discovered_addr);) + if (klass->reference_type() == REF_EPHEMERON) { + T* value_addr = (T*) java_lang_ref_Ephemeron::value_addr(obj); + MarkSweep::adjust_pointer(value_addr); + debug_only(trace_reference_gc("InstanceRefKlass::oop_ms_adjust_pointers", obj, true, + referent_addr, next_addr, discovered_addr, value_addr);) + } else { + debug_only(trace_reference_gc("InstanceRefKlass::oop_ms_adjust_pointers", obj, false, + referent_addr, next_addr, discovered_addr, (T*)NULL);) + } } int InstanceRefKlass::oop_ms_adjust_pointers(oop obj) { @@ -328,9 +341,9 @@ InstanceKlass::oop_ms_adjust_pointers(obj); if (UseCompressedOops) { - adjust_object_specialized(obj); + adjust_object_specialized(obj, this); } else { - adjust_object_specialized(obj); + adjust_object_specialized(obj, this); } return size; }