> Currently, jdi only check and process class unloading event when it detects a 
> new GC cycle.
> 
> After [JDK-8212879](https://bugs.openjdk.org/browse/JDK-8212879), posting 
> class events can overlap with GC finish event, that results, sometimes, it 
> only captures partial or even empty unloaded class list. The pending list 
> usually can be flushed out at next GC cycle. But for the classes unloaded 
> during the last GC cycle, the class unloading events may lost forever.
> 
> This patch checks and processes class unloading events unconditionally, 
> suggested by @kbarrett, the last pending unloaded class list can be flushed 
> by other events, such as `VM_DEATH`.
> 
> It also performs `commonRef_compact()` only when there are classes unloaded.
> 
> New test failed about 20% without patch, none with patch.
> 
> **Update**
> There are significant changes from early patch. 
> 
> The new approach:
> No longer removing dead objects and post events on VM thread. I believe it 
> was implemented this way to workaround the following issues:
> - JDI event handler uses JVMTI raw monitor, it requires thread in 
> `_in_native` state
> - The thread can not hold lock, which is needed to protect `JvmtiTagMap` 
> while walking, when transition to `_in_native` state
> 
> The new solution breaks up into two steps:
> - Collect all dead object tags with lock
> - Transition to `_in_native` state and post object free events in one batch
> 
> This way, JDI event handler can process object free events upon arrivals 
> without delay.
> 
> **Update 2**
> There is a comment for ` JvmtiTagMap::check_hashmap()` that states 
> `ObjectFree` events are posted before heap walks.
> 
> // This checks for posting and rehashing before operations that
> // this tagmap table.  The calls from a JavaThread only rehash, posting is
> // only done before heap walks.
> void JvmtiTagMap::check_hashmap(bool post_events) {
> 
> Now, the events are actually posted after heap walks, but I don't think it 
> makes any material material difference. 
> Even the events are posted earlier in old code, but they are only processed 
> after next GC cycle.

Zhengyu Gu has updated the pull request with a new target base due to a merge 
or a rebase. The incremental webrev excludes the unrelated changes brought in 
by the merge/rebase. The pull request contains 27 additional commits since the 
last revision:

 - Merge branch 'master' into JDK-8256811-jdi-missing-class-unloading-event
 - Moved TestClassUnloadEvents.java to new location
 - Fix test
 - Use Shenandoah GC for debuggee for deterministic
 - debug test
 - Adding log for debugging test failure on Windows
 - Removed HiddenClass test from Problem.txt and cleanup test
 - Renamed eventHandler_synthesizeUnloadEvent
 - v5
 - Improve naming and cleanup
 - ... and 17 more: https://git.openjdk.org/jdk/compare/7f52920e...a07b3737

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/9168/files
  - new: https://git.openjdk.org/jdk/pull/9168/files/e0338c4b..a07b3737

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=9168&range=10
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=9168&range=09-10

  Stats: 25949 lines in 301 files changed: 23407 ins; 1791 del; 751 mod
  Patch: https://git.openjdk.org/jdk/pull/9168.diff
  Fetch: git fetch https://git.openjdk.org/jdk pull/9168/head:pull/9168

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

Reply via email to