> When inflating a monitor the `ObjectMonitor*` is written directly over the 
> `markWord` and any overwritten data is displaced into a displaced `markWord`. 
> This is problematic for concurrent GCs which needs extra care or looser 
> semantics to use this displaced data. In Lilliput this data also contains the 
> klass forcing this to be something that the GC has to take into account 
> everywhere.
> 
> This patch introduces an alternative solution where locking only uses the 
> lock bits of the `markWord` and inflation does not override and displace the 
> `markWord`. This is done by keeping associations between objects and 
> `ObjectMonitor*` in an external hash table. Different caching techniques are 
> used to speedup lookups from compiled code.
> 
> A diagnostic VM option is introduced called `UseObjectMonitorTable`. It is 
> only supported in combination with the LM_LIGHTWEIGHT locking mode (the 
> default). 
> 
> This patch has been evaluated to be performance neutral when 
> `UseObjectMonitorTable` is turned off (the default). 
> 
> Below is a more detailed explanation of this change and how `LM_LIGHTWEIGHT` 
> and `UseObjectMonitorTable` works.
> 
> # Cleanups
> 
> Cleaned up displaced header usage for:
>   * BasicLock
>     * Contains some Zero changes
>     * Renames one exported JVMCI field
>   * ObjectMonitor
>     * Updates comments and tests consistencies
> 
> # Refactoring
> 
> `ObjectMonitor::enter` has been refactored an a `ObjectMonitorContentionMark` 
> witness object has been introduced to the signatures. Which signals that the 
> contentions reference counter is being held. More details are given below in 
> the section about deflation.
> 
> The initial purpose of this was to allow `UseObjectMonitorTable` to interact 
> more seamlessly with the `ObjectMonitor::enter` code. 
> 
> _There is even more `ObjectMonitor` refactoring which can be done here to 
> create a more understandable and enforceable API. There are a handful of 
> invariants / assumptions which are not always explicitly asserted which could 
> be trivially abstracted and verified by the type system by using similar 
> witness objects._
> 
> # LightweightSynchronizer
> 
> Working on adapting and incorporating the following section as a comment in 
> the source code
> 
> ## Fast Locking
> 
>   CAS on locking bits in markWord. 
>   0b00 (Fast Locked) <--> 0b01 (Unlocked)
> 
>   When locking and 0b00 (Fast Locked) is observed, it may be beneficial to 
> avoid inflating by spinning a bit.
> 
>   If 0b10 (Inflated) is observed or there is to much contention or to long 
> critical sections for spinning to be feasible, inf...

Axel Boldt-Christmas has updated the pull request incrementally with 30 
additional commits since the last revision:

 - Add and print random seed UseObjectMonitorTableTest.java
 - Align comment LockUnlock.java
 - Fix test_objectMonitor.cpp indent
 - Revert monitors_used_above_threshold changes
 - Fix whitespace synchronizer.{inline.hpp,cpp}
 - Update `ObjectSynchronizer::FastHashCode` comment
 - Fix quick_enter parameter order
 - Fix serviceThread.cpp include order
 - Update `ObjectMonitor::install_displaced_markword_in_object` assert text
 - Fix merge else if scopes ObjectMonitor::deflate_monitor
 - ... and 20 more: https://git.openjdk.org/jdk/compare/41ac7d37...3f29e6d6

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/20067/files
  - new: https://git.openjdk.org/jdk/pull/20067/files/41ac7d37..3f29e6d6

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=20067&range=17
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=20067&range=16-17

  Stats: 119 lines in 18 files changed: 11 ins; 16 del; 92 mod
  Patch: https://git.openjdk.org/jdk/pull/20067.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/20067/head:pull/20067

PR: https://git.openjdk.org/jdk/pull/20067

Reply via email to