RFR: 8247281: migrate ObjectMonitor::_object to OopStorage [v4]
Daniel D.Daugherty
dcubed at openjdk.java.net
Mon Sep 14 20:54:14 UTC 2020
On Mon, 14 Sep 2020 20:48:10 GMT, Coleen Phillimore <coleenp at openjdk.org> wrote:
>> I found my original preliminary code review comment and Erik's reply:
>>
>>> src/hotspot/share/gc/shared/space.inline.hpp
>>> old L166: assert(!space->scanned_block_is_obj(cur_obj) ||
>>> old L167: oop(cur_obj)->mark_raw().is_marked() || oop(cur_obj)->mark_raw().is_unlocked() ||
>>> old L168: oop(cur_obj)->mark_raw().has_bias_pattern(),
>>> old L169: "these are the only valid states during a mark sweep");
>>> This assert was before the if-statement at the top of the while-loop.
>>>
>>> new L174: assert(!space->scanned_block_is_obj(cur_obj) || oop(cur_obj)->mark_raw().is_unlocked() ||
>>> new L175: oop(cur_obj)->mark_raw().has_bias_pattern() || oop(cur_obj)->mark_raw().has_monitor(),
>>> new L176: "these are the only valid states during a mark sweep");
>>> The assert is now in the else branch of the following if-statement:
>>>
>>> L166 if (space->scanned_block_is_obj(cur_obj) && oop(cur_obj)->is_gc_marked()) {
>>>
>>> The new assert() drops this check:
>>>
>>> oop(cur_obj)->mark_raw().is_marked()
>>>
>>> and adds this check:
>>>
>>> oop(cur_obj)->mark_raw().has_monitor()
>>>
>>> Dropping the "is_marked()" makes sense since the new location
>>> of the assert is in the else branch of "oop(cur_obj)->is_gc_marked()".
>>> The addition of the "has_monitor()" check is puzzling. Why was this
>>> added and why wasn't it needed in the old assert()?
>>>
>>> In fact, I'm not sure why this change is here at all.
>>
>> This is an artifact of the monitor now being weak. Since there was previously always a strong root
>> to all inflated monitors, there were never any dead objects in the heap, that still had pointers in the
>> mark word to the monitor. The change to weak now implies that we suddenly have dead objects
>> in the heap, that in the markWord point out their monitor. GC code that iterates through consecutive
>> objects one by one, will see these now dead objects with monitors. The assert changes reflect that.
>> Before it was unexpected and would assert on that. Now I moved the assertion to the case when the
>> object is alive instead. We have no business asserting what should be in the markWord of dead objects.
>>
>> I hope it makes sense now!
>
> This code seems like something that doesn't belong here anymore. This code assumed synchronous scanning of oops in
> ObjectMonitor and scanning memory regions, and that's no longer the case with OopStorage. I think this assert should be
> removed. It exports some implementation detail of now completely unrelated code in order to do a very specific check.
@fisk - please chime in here...
-------------
PR: https://git.openjdk.java.net/jdk/pull/135
More information about the serviceability-dev
mailing list