On Mon, 14 Sep 2020 14:27:51 GMT, Roman Kennke <rken...@openjdk.org> wrote:

>>> Shenandoah changes are not complete:
>>> /home/rkennke/src/openjdk/jdk/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp:
>>>  In member function 'virtual
>>> void ShenandoahFinalMarkingTask::work(uint)':
>>> /home/rkennke/src/openjdk/jdk/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp:298:31:
>>>  error: 'oops_do' is
>>> not a member of 'ObjectSynchronizer' 
>>> ObjectSynchronizer::oops_do(&resolve_mark_cl); ^~~~~~~
>>> /home/rkennke/src/openjdk/jdk/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp:308:31:
>>>  error: 'oops_do' is
>>> not a member of 'ObjectSynchronizer' ObjectSynchronizer::oops_do(&mark_cl);
>>> ^~~~~~~
>>> 
>>> I will have a look into how to resolve this.
>>> 
>>> In order to fix this, I need one of two things:
>>> 
>>>     * A way to iterate oops of the global-list. Explanation: In 
>>> Shenandoah's I-U mode, we need to re-mark such ObjectMonitors
>>>       during final-mark because they may be the only remaining reference to 
>>> an object on the heap.
>>>       _or_ (even better)
>>> 
>>>     * Call a write-barrier (IN_NATIVE) whenever an ObjectMonitor is moved 
>>> to the global-list upon thread-destruction. This
>>>       way we could mark that object concurrently.
>>> 
>>> 
>>> Notice that this does not affect thread-local ObjectMonitors (IOW, most 
>>> regular ObjectMonitors) because those would be
>>> scanned while scanning thread stacks. Therefore I'd like to avoid to 
>>> generally place a barrier in ObjectMonitor.
>>> See: https://bugs.openjdk.java.net/browse/JDK-8251451
>>> 
>>> AFAICT, this may affect ZGC too (not 100% sure about this).
>> 
>> So this change makes the object monitors weak. So you shouldn't have to 
>> remark them at all. If they hold the last
>> reference to the object, then the monitor gets the object cleared as part of 
>> normal weak OopStorage reference
>> processing. Subsequent deflation cycles will detect that the GC has cleared 
>> the oop, and reuse the monitor. In other
>> words, we should just remove the call to the oops_do function, and rely on 
>> OopStorage doing its thing. The GC should
>> not have to care at all about monitors any longer, only about processing 
>> weak OopStorages, which is done automatically.
>> Hope this makes sense.
>
>> > Shenandoah changes are not complete:
>> > /home/rkennke/src/openjdk/jdk/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp:
>> >  In member function 'virtual
>> > void ShenandoahFinalMarkingTask::work(uint)':
>> > /home/rkennke/src/openjdk/jdk/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp:298:31:
>> >  error: 'oops_do' is
>> > not a member of 'ObjectSynchronizer' 
>> > ObjectSynchronizer::oops_do(&resolve_mark_cl); ^~~~~~~
>> > /home/rkennke/src/openjdk/jdk/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp:308:31:
>> >  error: 'oops_do' is
>> > not a member of 'ObjectSynchronizer' ObjectSynchronizer::oops_do(&mark_cl);
>> > ^~~~~~~
>> > I will have a look into how to resolve this.
>> > In order to fix this, I need one of two things:
>> > ```
>> > * A way to iterate oops of the global-list. Explanation: In Shenandoah's 
>> > I-U mode, we need to re-mark such ObjectMonitors
>> >   during final-mark because they may be the only remaining reference to an 
>> > object on the heap.
>> >   _or_ (even better)
>> > 
>> > * Call a write-barrier (IN_NATIVE) whenever an ObjectMonitor is moved to 
>> > the global-list upon thread-destruction. This
>> >   way we could mark that object concurrently.
>> > ```
>> > 
>> > 
>> > Notice that this does not affect thread-local ObjectMonitors (IOW, most 
>> > regular ObjectMonitors) because those would be
>> > scanned while scanning thread stacks. Therefore I'd like to avoid to 
>> > generally place a barrier in ObjectMonitor. See:
>> > https://bugs.openjdk.java.net/browse/JDK-8251451 AFAICT, this may affect 
>> > ZGC too (not 100% sure about this).
>> 
>> So this change makes the object monitors weak. So you shouldn't have to 
>> remark them at all. If they hold the last
>> reference to the object, then the monitor gets the object cleared as part of 
>> normal weak OopStorage reference
>> processing. Subsequent deflation cycles will detect that the GC has cleared 
>> the oop, and reuse the monitor. In other
>> words, we should just remove the call to the oops_do function, and rely on 
>> OopStorage doing its thing. The GC should
>> not have to care at all about monitors any longer, only about processing 
>> weak OopStorages, which is done automatically.
>> Hope this makes sense.
> 
> Yes, definitely. I came to the same conclusion. Thank you!
> With the patch amended:
> http://cr.openjdk.java.net/~rkennke/8247281-shenandoah.patch
> 
> I'm good with the change.

@rkennke - I've commited the changes in your webrev as
https://github.com/openjdk/jdk/pull/135/commits/bbf8dbd09bdf5c1c77c67cc637fbc10fe72d4894.

-------------

PR: https://git.openjdk.java.net/jdk/pull/135

Reply via email to