> 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