On Mon, 14 Sep 2020 20:48:10 GMT, Coleen Phillimore <cole...@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