RFR: JDK-8199406: Performance drop with Java JDK 1.8.0_162-b32
coleen.phillimore at oracle.com
coleen.phillimore at oracle.com
Fri Mar 30 17:31:52 UTC 2018
On 3/30/18 12:43 PM, Poonam Parhar wrote:
> Thanks for looking at the changes, Coleen!
>
> On 3/30/2018 9:25 AM, Vladimir Kozlov wrote:
>> On 3/30/18 8:31 AM, coleen.phillimore at oracle.com wrote:
>>>
>>> http://cr.openjdk.java.net/~poonam/8199406/webrev.01/src/hotspot/share/code/vtableStubs.cpp.udiff.html
>>>
>>>
>>> uint hash = VtableStubs::hash(stub->is_vtable_stub(),
>>> stub->index());
>>>
>>>
>>> Isn't stub->is_vtable_stub() always true here, so you could avoid
>>> another virtual call? Can you assert this and pass true here?
>>
>> Not true. It could be also itable. They differentiate by value of
>> _is_vtable_stub field. It is not virtual call, it is check of the field:
>>
>> bool is_vtable_stub() { return _is_vtable_stub; }
Thank you for the clarification. I had it mixed up with
is_vtable_blob(). Glad it's not virtual.
>>
>>>
>>> The whole subclassing of BufferBlob with an virtual call
>>> is_vtable_blob() seems inefficient if you have to call this all the
>>> time during unloading and otherwise, and spending a word in one of
>>> the alignment gaps in CodeBlob to point to the type of code blob
>>> would be more efficient. But that might be an RFE for the compiler
>>> team. Also since the only virtual functions are "is_<which derived
>>> type>" functions.
>>
>> I think we discussed that during rewriting this code for AOT. I don't
>> remember why we decided to keep it this way. May be because it did
>> not show up on our code performance profiling. On x86 it is really fast.
>>
>> May be we should review this code again if you think it should be
>> optimized.
>>
It might be worth discussing, if this code continues to matter for
unloading method performance.
>>>
>>> You should add this new type at
>>> http://cr.openjdk.java.net/~poonam/8199406/webrev.01/src/hotspot/share/code/codeBlob.hpp.html
>>
>>
>>
>> I thought it was there in one of the working versions. Yes, it needs
>> to be added to that comment.
>>
> Sure, I will add the new type to the comments.
Thanks! Thank you for fixing this issue!
Coleen
>
> Thanks,
> Poonam
>
>> Thanks,
>> Vladimir
>>
>>>
>>>
>>> line 61.
>>>
>>> Thanks,
>>> Coleen
>>>
>>> On 3/29/18 6:14 PM, Poonam Parhar wrote:
>>>> Hello Vladimir,
>>>>
>>>> Thanks for reviewing the changes. Please find the updated webrev here:
>>>> http://cr.openjdk.java.net/~poonam/8199406/webrev.01/
>>>>
>>>> Regards,
>>>> Poonam
>>>>
>>>> On 3/29/2018 2:23 PM, Vladimir Kozlov wrote:
>>>>> Looks good. I have few comments.
>>>>>
>>>>> You can remove old is_entry_point() which have the same code as
>>>>> new entry_point(). After changes it is used only in one place in
>>>>> CompiledIC::is_megamorphic(). It can be replace with NULL check of
>>>>> entry_point() result there. Add comment in vtableStubs.hpp for new
>>>>> method.
>>>>>
>>>>> is_metadata_method field name should start with _ (this is Hotspot
>>>>> convention).
>>>>>
>>>>> is_loader_alive() could be simplified since you have field now:
>>>>>
>>>>> inline bool is_loader_alive(BoolObjectClosure* is_alive) {
>>>>> Klass* k = is_metadata_method ?
>>>>> ((Method*)_holder_metadata)->method_holder() :
>>>>> (Klass*)_holder_metadata;
>>>>> if (!k->is_loader_alive(is_alive)) {
>>>>> return false;
>>>>> }
>>>>> if (!_holder_klass->is_loader_alive(is_alive)) {
>>>>> return false;
>>>>> }
>>>>> return true;
>>>>> }
>>>>>
>>>>> Thanks,
>>>>> Vladimir
>>>>>
>>>>> On 3/29/18 1:31 PM, Poonam Parhar wrote:
>>>>>> Hello,
>>>>>>
>>>>>> Please review the changes for the following bug that improve the
>>>>>> nmethod unloading times with a couple of optimizations.
>>>>>>
>>>>>> JDK-8199406 <https://bugs.openjdk.java.net/browse/JDK-8199406>:
>>>>>> Performance drop with Java JDK 1.8.0_162-b32
>>>>>> Webrev: http://cr.openjdk.java.net/~poonam/8199406/webrev.00/
>>>>>>
>>>>>> This changeset includes two changes:
>>>>>> 1. In /compiledIC.cpp, CompiledIC::is_icholder_entry()/ , we need
>>>>>> to determine if the code blob is an itable stub. With this
>>>>>> change, before linearly searching through all the VtableStub
>>>>>> entries, we first check whether the codeblob is a vtable or not.
>>>>>> We now also parse through the list entries only once rather than
>>>>>> doing it twice in /VtableStubs::is_entry_point()/ and
>>>>>> /VtableStubs::stub_containing()/.
>>>>>> 2. The second change helps avoid the virtual function calls in
>>>>>> CompiledICHolder::is_loader_alive(). CompiledICHolder now stores
>>>>>> information whether the metadata it holds is a method or a klass.
>>>>>>
>>>>>> Testing:
>>>>>> - Customer testing confirming that their class-unloading times
>>>>>> drop from 10s of seconds to an average of 0.75 secs.
>>>>>> - mach5 jdk-tier1,jdk-tier2,jdk-tier3,hs-tier1,hs-tier2
>>>>>>
>>>>>> Thanks,
>>>>>> Poonam
>>>>>>
>>>>
>>>
>
More information about the hotspot-compiler-dev
mailing list