[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-serviceability-dev
Subject:    Integrated: 8212879: Make JVMTI TagMap table concurrent
From:       Coleen Phillimore <coleenp () openjdk ! java ! net>
Date:       2020-11-19 14:33:16
Message-ID: XJbTNVPJgFyO62O_jn1Mo0KOs52qXuqNJX8X2O5Qeew=.60971263-b83c-4962-949e-3e6d8c0e2430 () github ! com
[Download RAW message or body]

On Fri, 30 Oct 2020 20:23:04 GMT, Coleen Phillimore <coleenp@openjdk.org> wrote:

> This change turns the HashTable that JVMTI uses for object tagging into a regular \
> Hotspot hashtable - the one in hashtable.hpp with resizing and rehashing.   Instead \
> of pointing directly to oops so that GC has to walk the table to follow oops and \
> then to rehash the table, this table points to WeakHandle.  GC walks the backing \
> OopStorages concurrently. 
> The hash function for the table is a hash of the lower 32 bits of the address.  A \
> flag is set during GC (gc_notification if in a safepoint, and through a call to \
> JvmtiTagMap::needs_processing()) so that the table is rehashed at the next use. 
> The gc_notification mechanism of weak oop processing is used to notify Jvmti to \
> post ObjectFree events.  In concurrent GCs there can be a window of time between \
> weak oop marking where the oop is unmarked, so dead (the phantom load in peek \
> returns NULL) but the gc_notification hasn't been done yet.  In this window, a heap \
> walk or GetObjectsWithTags call would not find an object before the ObjectFree \
> event is posted.  This is dealt with in two ways: 
> 1. In the Heap walk, there's an unconditional table walk to post events if events \
> are needed to post. 2. For GetObjectWithTags, if a dead oop is found in the table \
> and posting is required, we use the VM thread to post the event. 
> Event posting cannot be done in a JavaThread because the posting needs to be done \
> while holding the table lock, so that the JvmtiEnv state doesn't change before \
> posting is done.  ObjectFree callbacks are limited in what they can do as per the \
> JVMTI Specification.  The allowed callbacks to the VM already have code to allow \
> NonJava threads. 
> To avoid rehashing, I also tried to use object->identity_hash() but this breaks \
> because entries can be added to the table during heapwalk, where the objects use \
> marking.  The starting markWord is saved and restored.  Adding a hashcode during \
> this operation makes restoring the former markWord (locked, inflated, etc) too \
> complicated.  Plus we don't want all these objects to have hashcodes because \
> locking operations after tagging would have to always use inflated locks. 
> Much of this change is to remove serial weak oop processing for the weakProcessor, \
> ZGC and Shenandoah.  The GCs have been stress tested with jvmti code. 
> It has also been tested with tier1-6.
> 
> Thank you to Stefan, Erik and Kim for their help with this change.

This pull request has now been integrated.

Changeset: ba721f5f
Author:    Coleen Phillimore <coleenp@openjdk.org>
URL:       https://git.openjdk.java.net/jdk/commit/ba721f5f
Stats:     1891 lines in 49 files changed: 769 ins; 992 del; 130 mod

8212879: Make JVMTI TagMap table concurrent

Co-authored-by: Kim Barrett <kbarrett@openjdk.org>
Co-authored-by: Coleen Phillimore <coleenp@openjdk.org>
Reviewed-by: stefank, ihse, zgu, eosterlund, sspitsyn, kbarrett

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

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


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic