RFR(S)[16]: 8246477: add whitebox support for deflating idle monitors

Erik Österlund erik.osterlund at oracle.com
Tue Jun 23 09:45:53 UTC 2020


Hi Dan,

Thank you for sorting this out.

I have a few thoughts about this.

1. There are seemingly two reasons why special deflation requests were 
needed.
    a) Monitors that used to get deflated before GC, now kept objects 
alive, messing with liveness assumptions of this test:
test/hotspot/jtreg/gc/g1/humongousObjects/TestHumongousClassLoader.java


    b) Tests that actually test that the monitors got deflated, as 
opposed to the associated object dying. Seemingly this test:
test/hotspot/jtreg/compiler/testlibrary/rtm/AbortProvoker.java

So my thought is that once the monitors are weak, we should not call any 
deflation logic in the TestHumongousClassLoader test. Because it should 
be expected that async deflation will not keep classes (or any other 
object) alive artificially; the test shouldn't have to know anything 
about async deflation implementation details. But we can wait with 
removing that until the weak monitors go in. We just have to remember to 
undo that part, which is okay. But we will still need the new deflation 
request mechanism for the AbortProvoker test, of course.

The other thought is that in 
ObjectSynchronizer::request_deflate_idle_monitors() we either request 
async monitor deflation or perform a forced safepoint for safepoint 
based deflation... but not if this function is called by the VM thread. 
This is the code:

1327 bool ObjectSynchronizer::request_deflate_idle_monitors() {
1328   bool is_JavaThread = Thread::current()->is_Java_thread();
1329   bool ret_code = false;
1330
1331   if (AsyncDeflateIdleMonitors) {

...

1356   } else if (!Thread::current()->is_VM_thread()) {
1357     // The VMThread only calls this at shutdown time before the final
1358     // safepoint so it should not need to force this safepoint.
1359     VM_ForceSafepoint force_safepoint_op;
1360     VMThread::execute(&force_safepoint_op);
1361     ret_code = true;
1362   }
1363
1364   return ret_code;
1365 }

And this is based on implicit knowledge about the one call from the VM 
thread (currently) being in a VM exit routine, where the safepoint based 
deflation will be performed anyway. That callsite looks like this:

  433 bool VM_Exit::doit_prologue() {
  434   if (AsyncDeflateIdleMonitors && log_is_enabled(Info, 
monitorinflation)) {
  435     // AsyncDeflateIdleMonitors does a special deflation in order
  436     // to reduce the in-use monitor population that is reported by
  437     // ObjectSynchronizer::log_in_use_monitor_details() at VM exit.
  438 ObjectSynchronizer::request_deflate_idle_monitors();
  439   }
  440   return true;
  441 }

Note that the request_deflate_idle_monitors() function is only called if 
AsyncDeflateIdleMonitors is true. And the special logic inside of 
ObjectSynchronizer::request_deflate_idle_monitors() for filtering out 
this callsite, only performs the special VM thread check when 
AsyncDeflateIdleMonitors is false. In other words: that else if path in 
request_deflate_idle_monitors could simply be else. It would be great to 
remove that special filtering so that the 
ObjectSynchronizer::request_deflate_idle_monitors() function simply does 
what it is told, without making any assumptions about who is calling the 
function and in what context.

Otherwise, this looks great!I don't need another webrev for the "else 
if" -> "else" change in request_deflate_idle_monitors().

Thanks,
/Erik


On 2020-06-22 22:22, Daniel D. Daugherty wrote:
> Greetings,
>
> Still need one more reviewer for this one. Robbin or Erik O?
> Can either of you take a look?
>
> Dan
>
>
> On 6/22/20 12:35 PM, Daniel D. Daugherty wrote:
>> Hi David,
>>
>> On 6/22/20 3:47 AM, David Holmes wrote:
>>> Hi Dan,
>>>
>>> This all seems fine to me.
>>
>> Thanks! And thanks for the review of yet-another-monitor-subsystem fix!!
>>
>>
>>>
>>> A couple of nits:
>>>
>>> src/hotspot/share/runtime/synchronizer.cpp
>>>
>>> +     if (ret_code == false) {
>>>
>>> => if (!ret_code) {
>>
>> Nice catch. Will fix that.
>>
>>
>>> ---
>>>
>>> test/hotspot/jtreg/runtime/whitebox/TestWBDeflateIdleMonitors.java
>>>
>>>  27  * @test TestWBDeflateIdleMonitors
>>>
>>> @test is a marker. We don't/shouldn't write anything after it.
>>
>> Will fix. I got that from test/hotspot/jtreg/gc/whitebox/TestWBGC.java
>> which I copied and adapted for this new test.
>>
>>
>>>
>>> 29  * @summary Test verify that WB method deflateIdleMonitors works 
>>> correctly.
>>>
>>> "Test verify" is not grammatically correct.
>>
>> Perhaps: Test to verify that WB method deflateIdleMonitors works 
>> correctly.
>>
>> I'm sorry to say that I also got that grammatical error from
>> test/hotspot/jtreg/gc/whitebox/TestWBGC.java which I copied and adapted
>> for this new test.
>>
>> I'll file a follow-up bug for 
>> test/hotspot/jtreg/gc/whitebox/TestWBGC.java
>> so that we don't lose those fixes.
>>
>> Dan
>>
>>
>>>
>>> ---
>>>
>>> Thanks,
>>> David
>>>
>>> On 20/06/2020 2:58 am, Daniel D. Daugherty wrote:
>>>> Ping!
>>>>
>>>> And a testing update:
>>>>
>>>> Mach5 Tier[1-8] testing:
>>>>
>>>>    Tier[1-3] - done, 5 unrelated, known failures
>>>>    Tier4     - done - 1 unrelated, known failure
>>>>    Tier5     - done - no failures
>>>>    Tier6     - done, 1 unrelated, known failure
>>>>    Tier7     - almost done, 1 unrelated, known failure
>>>>    Tier8     - 56% done, 3 unrelated, known failures (so far)
>>>>
>>>> The Mach5 testing is taking longer than usual due to resource 
>>>> limitations.
>>>> So far all failures are known to be in the baseline. There have 
>>>> been no
>>>> test failures related to not deflating an idle monitor in a timely 
>>>> fashion
>>>> (so far).
>>>>
>>>> Thanks, in advance, for comments, questions or suggestions.
>>>>
>>>> Dan
>>>>
>>>> On 6/17/20 12:30 PM, Daniel D. Daugherty wrote:
>>>>> Greetings,
>>>>>
>>>>> I have a fix for cleaning up testing support for deflating idle 
>>>>> monitors.
>>>>>
>>>>> JDK-8246477 add whitebox support for deflating idle monitors
>>>>> https://bugs.openjdk.java.net/browse/JDK-8246477
>>>>>
>>>>> This project is based on jdk-16+1 and is targeted to JDK16.
>>>>>
>>>>> Here's the webrev URL:
>>>>>
>>>>> http://cr.openjdk.java.net/~dcubed/8246477-webrev/0-for-jdk16/
>>>>>
>>>>> Summary of the changes:
>>>>>
>>>>> - Add whitebox support for deflating idle monitors including
>>>>> ObjectSynchronizer::request_deflate_idle_monitors(); includes
>>>>>   a new whitebox test.
>>>>> - Drop ObjectSynchronizer::_is_special_deflation_requested flag,
>>>>>   functions and uses.
>>>>> - Switch to ObjectSynchronizer::request_deflate_idle_monitors() as 
>>>>> needed.
>>>>> - bug fix: _last_async_deflation_time_ns should be set at the end of
>>>>>   async deflation.
>>>>>
>>>>> Because this fix is removing support for special deflation requests,
>>>>> I'm doing Mach5 Tier[1-8] testing:
>>>>>
>>>>>   Tier[1-3] - almost done, 5 unrelated, known failures
>>>>>   Tier4     - done - 1 unrelated, known failure
>>>>>   Tier5     - done - no failures
>>>>>   Tier6     - almost done, 1 unrelated, known failure
>>>>>   Tier7     - almost done, 1 unrelated, known failure
>>>>>   Tier8     - > half done, 3 unrelated, known failures (so far)
>>>>>
>>>>> The Mach5 testing is taking longer than usual due to resource 
>>>>> limitations.
>>>>> So far all failures are known to be in the baseline. There have 
>>>>> been no
>>>>> test failures related to not deflating an idle monitor in a timely 
>>>>> fashion
>>>>> (so far).
>>>>>
>>>>> Thanks, in advance, for comments, questions or suggestions.
>>>>>
>>>>> Dan
>>>>
>>
>



More information about the hotspot-runtime-dev mailing list