On Mon, 2 Nov 2020 22:13:41 GMT, Daniel D. Daugherty <dcu...@openjdk.org> wrote:

>> Self review done.
>
> ### Gory details about these changes from @fisk and @dcubed-ojdk:
> 
> ### Simplify `ObjectMonitor` List Management:
> 
> - delete per-thread in-use and free-lists.
> - delete global free-list and global wait-list; there is a still a global 
> in-use list; after `ObjectMonitor`s on the global in-use list are deflated, 
> they are unlinked and added to a function local `GrowableArray` called 
> `delete_list`; we do a handshake/safepoint with all JavaThreads and that 
> makes all the `ObjectMonitor`s on the `delete_list` safe for deletion; 
> lastly, we delete all the `ObjectMonitor`s on `delete_list`.
> - move async deflation work from the `ServiceThread` to a dedicated 
> `MonitorDeflationThread`; this prevents `ObjectMonitor` inflation storms from 
> delaying the work done by the `ServiceThread` for other subsystems; this 
> means the `ServiceThread` no longer wakes up every 
> `GuaranteedSafepointInterval` to check for work.
> - the `AllocationState` enum is dropped along with the  `_allocation_state` 
> field and associated getters and setters; the simpler list management no 
> longer requires the allocation state to be tracked.
> - the safepoint cleanup phase no longer requests async monitor deflation; 
> there is no longer a safepoint cleanup task for monitor deflation, but there 
> is still an auditing/logging hook for debugging purposes.
> - delete ObjectSynchronizer functions associated with more complicated list 
> management: `deflate_global_idle_monitors()`, 
> `deflate_per_thread_idle_monitors()`, `deflate_common_idle_monitors()`, 
> `om_flush()`, `prepend_list_to_common()`, 
> `prepend_list_to_global_free_list()`, `prepend_list_to_global_wait_list()`, 
> `prepend_list_to_global_in_use_list()`, `prepend_to_common()`, 
> `prepend_to_om_free_list()`, `prepend_to_om_in_use_list()`, 
> `take_from_start_of_common()`, `take_from_start_of_global_free_list()`, 
> `take_from_start_of_om_free_list()`
> - delete the spin-lock functions needed by the more complicated list 
> management.
> - delete a number of audit/debug/logging related functions needed by the more 
> complicated list management.
> - restore the barrier related code that needed relocation due to om_flush()'s 
> access of the weak obj reference; now that om_flush() is gone, the barrier 
> related code can go back to its more natural place.
> 
> ### Get Rid of Type-Stable Memory (TSM):
> 
> - `ObjectMonitor` now subclasses `CHeapObj<mtInternal>`.
> - the `ObjectMonitor` constructor and destructor are now more normal C++!
> - delete `ObjectMonitor` functions associated with TSM: `clear()`, 
> `clear_common()`, `object_addr()`, `Recycle()`, and `set_object()`.
> - delete the version of `set_owner_from()` that support two possible old 
> values since it is no longer needed; we are not recycling deflated 
> `ObjectMonitor`s anymore so there's no longer a possibility of a `NULL` 
> `_owner` value or a `DEFLATER_MARKER` value on the same code path.
> - delete ObjectSynchronizer functions associated with TSM: `om_alloc()`, 
> `om_release()`, `prepend_block_to_lists()`
> - simplify ObjectSynchronizer functions related to TSM: 
> `deflate_idle_monitors()`, `deflate_monitor_list()`, `inflate()`
> 
> ### Change A Displaced Header is Always at Offset 0
> 
> - Change `markWord::displaced_mark_helper()` and 
> `markWord::set_displaced_mark_helper()` to no longer assume that the 
> displaced header in a `BasicLock` or `ObjectMonitor` is at offset 0.
> - ObjectMonitor::header_addr() no longer requires the offset to be zero.
> 
> ### New Diagnostic Options
> 
> - `AvgMonitorsPerThreadEstimate` - Used to estimate a variable ceiling based 
> on number of threads for use with `MonitorUsedDeflationThreshold`; default is 
> 1024, 0 is off, range is 0..max_jint. The current count of inflated 
> `ObjectMonitor`s and the ceiling are used to determine whether the in-use 
> ratio is higher than `MonitorUsedDeflationThreshold` (default 90).
> - `MonitorDeflationMax` - The maximum number of `ObjectMonitor`s to deflate, 
> unlink and delete at one time; default is 1 million; range is 1024..max_jint.

Rebased the project to jdk-16+23. Local macOS and Linux-X64 builds and
KitchensinkSanity runs pass. Kicking off a new round of Mach5 testing...

@coleenp, @dholmes-ora, @fisk, and @robehn - as usual for ObjectMonitor
stuff, your reviews would be greatly appreciated.

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

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

Reply via email to