Small question about JDK-8253064 and ObjectMonitor allocation

Thomas Stüfe thomas.stuefe at gmail.com
Mon Jan 31 08:09:07 UTC 2022


Thanks a lot for your answers, David.

On Mon, Jan 31, 2022 at 8:35 AM David Holmes <david.holmes at oracle.com>
wrote:

> On 31/01/2022 3:54 pm, Thomas Stüfe wrote:
> > Hi David,
> >
> > Thank you for the answer!
> >
> > On Mon, Jan 31, 2022 at 6:23 AM David Holmes <david.holmes at oracle.com
> > <mailto:david.holmes at oracle.com>> wrote:
> >
> >     Hi Thomas,
> >
> >     On 31/01/2022 2:32 pm, Thomas Stüfe wrote:
> >      > Hi,
> >      >
> >      > I have a small question about a detail of JDK-8253064.
> >      >
> >      > IIUC, before this patch, the VM kept thread-local freelists of
> >      > pre-allocated ObjectMonitors to reduce allocation contention. Now
> >     we just
> >      > malloc monitors right away.
> >      >
> >      > I looked through the issue and the associated PR, but could find
> no
> >      > information on why this was done. Dan describes what he did very
> >     well:
> >      > https://github.com/openjdk/jdk/pull/642#issuecomment-720753946
> >     <https://github.com/openjdk/jdk/pull/642#issuecomment-720753946>,
> >     but not
> >      > why.
> >      >
> >      > I assume that the complexity and memory overhead of the free
> >     lists was not
> >      > worth it? That you found that malloc() is on our platforms
> >     "uncontented"
> >      > enough?
> >
> >     The issue was not about freelists and contention it was about
> requiring
> >     type-stable-memory: that once a piece of memory was allocated as an
> >     ObjectMonitor it remained forever after an ObjectMonitor. This
> allowed
> >     for various race conditions in the old monitor code maintaining
> safety.
> >     Over time that code changed substantially and the need for
> >     type-stable-memory for ObjectMonitors disappeared, so we finally got
> >     rid
> >     of it and just moved to a direct allocation scheme.
> >
> >
> > I think I understand, but I was specifically concerned with the question
> > of allocation contention of ObjectMonitors. That is somewhat independent
> > from the question of where OMs are allocated.
> >
> > Can it happen that lock inflation happens clustered, or does that not
> > occur in reality?
> >
> > AFAIU the old code managed OM storage itself, used global data
> > structures to do so, and guarded access with a mutex. To reduce
> > contention, it used a surprisingly large thread-local freelist of 1024
> > entries. This looks like contention was once a real problem.
>
> You can always create a benchmark to show contention in the monitor
> inflation code. I don't recall now whether this was a real issue or a
> microbenchmark issue. As the code stated:
>
> ObjectMonitor * ATTR ObjectSynchronizer::omAlloc (Thread * Self) {
>      // A large MAXPRIVATE value reduces both list lock contention
>      // and list coherency traffic, but also tends to increase the
>      // number of objectMonitors in circulation as well as the STW
>      // scavenge costs.  As usual, we lean toward time in space-time
>      // tradeoffs.
>
>      const int MAXPRIVATE = 1024 ;
>
> so general performance was a consideration.
>
> > OTOH the new code just uses malloc, which also may lock depending on the
> > malloc allocator internals and the used libc settings. Therefore I
> > wonder whether OM allocation is still a problem, not a problem with
> > real-life malloc, or maybe never really had been a problem and the old
> > code was just overly cautious?
>
> Whenever we make significant changes to a subsystem we always
> investigate the performance profile of the changes. We're prepared to
> accept some performance loss if we have a good improvement in code
> complexity/maintainability etc, but if a significant performance issue
> arose we would revisit it. See for example discussion in:
>
> https://bugs.openjdk.java.net/browse/JDK-8263864
>
> and related.
>
> Cheers,
> David
> -----
>
> > Thanks, Thomas
> >
> >
>


More information about the hotspot-runtime-dev mailing list