In the rewrites made for:
[JDK-8318757](https://bugs.openjdk.org/browse/JDK-8318757) `VM_ThreadDump 
asserts in interleaved ObjectMonitor::deflate_monitor calls`

I removed the filtering of *owned ObjectMonitors with dead objects*. The 
reasoning was that you should never have an owned ObjectMonitor with a dead 
object. I added an assert to check this assumption. It turns out that the 
assumption was wrong *if* you use JNI to call MonitorEnter and then remove all 
references to the locked object.

The provided tests provoke this assert form:
* the JNI thread detach code
* thread dumping with locked monitors, and
* the JVMTI GetOwnedMonitorInfo API.

While investigating this we've found that the thread detach code becomes more 
correct when this filter was removed. Previously, the locked monitors never got 
unlocked because the ObjectMonitor iterator never exposed these monitors to the 
JNI detach code that unlocks the thread's monitors. That bug caused an 
ObjectMonitor leak. So, for this case I'm leaving these ObjectMonitors 
unfiltered so that we don't reintroduce the leak.

The thread dumping case doesn't tolerate ObjectMonitor with dead objects, so 
I'm filtering those in the closure that collects ObjectMonitor. Side note: We 
have discussions about ways to completely rewrite this by letting each thread 
have thread-local information about JNI held locks. If we have this we could 
probably throw away the entire ObjectMonitorDump hashtable, and its walk of the 
`_in_use_list.`.

For GetOwnedMonitorInfo it is unclear if we should expose these weird 
ObjectMonitor. If we do, then the users can detect that a thread holds a lock 
with a dead object, and the code will return NULL as one of the "owned 
monitors" returned. I don't think that's a good idea, so I'm filtering out 
these ObjectMonitor for those calls.

Test: the written tests with and without the fix. Tier1-Tier3, so far.

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

Commit messages:
 - 8320515: assert(monitor->object_peek() != nullptr) failed: Owned monitors 
should not have a dead object

Changes: https://git.openjdk.org/jdk/pull/16783/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=16783&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8320515
  Stats: 258 lines in 8 files changed: 253 ins; 1 del; 4 mod
  Patch: https://git.openjdk.org/jdk/pull/16783.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/16783/head:pull/16783

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

Reply via email to