Slow class loading when running JVM in debug mode
Egor Ushakov
egor.ushakov at jetbrains.com
Thu Jul 4 12:56:20 UTC 2019
I filed https://bugs.openjdk.java.net/browse/JDK-8227269.
Not sure that we could fix that ourselves.
Egor
On 21-Jun-19 21:50, Chris Plummer wrote:
> You might also want to have a look at:
>
> JDK:8214892: Delayed starting of debugging via jcmd
>
> This should allow you to defer initialization of the debug agent (and
> the creation of the loaded classes cache) until you turn on debugging
> using the jcmd (and the presumably follow that with an attach from a
> debugger).
>
> Note there is also an after-the-fact CSR in progress for this which
> might result in an eventual name change for debug agent option and
> jcmd command.
>
> Chris
>
>
> On 6/21/19 3:06 AM, Egor Ushakov wrote:
>> Will have a look, thanks for advices!
>>
>> On 21-Jun-19 00:42, Chris Plummer wrote:
>>> With respect to the specific issue brought up in
>>> https://youtrack.jetbrains.com/issue/JBR-1611:
>>>
>>> "If we look into the code, we'll see that whenever a new class is
>>> loaded and an event about it is delivered, when a garbage collection
>>> has occurred, classTrack_processUnloads iterates over all loaded
>>> classes to see if any of them have been unloaded. This leads to
>>> O(classCount * gcCount) performance, which in case of frequent GCs
>>> (and they are frequent, especially the minor ones) is close to
>>> O(classCount^2). In IDEA, we have quite a lot of classes, especially
>>> counting all lambdas, so this results in quite significant overhead."
>>>
>>> The debug agent calls JVMTI GetLoadedClasses() during initialization
>>> to get a cache of all prepared classes. It keeps that cache
>>> up-to-date by getting JVMTI CLASS_PREPARE events. When there is a
>>> gc, the debug agent basically throws away the cache and creates a
>>> new one by calling GetLoadedClasses() again. It also compares the
>>> old and new caches to determine which classes where unloaded, and
>>> generates JDWP CLASS_UNLOAD events for them (if there is a debugger
>>> attached that wants them).
>>>
>>> It might be possible to defer initialization of the loaded classes
>>> cache (and any maintenance of it) until there is a debugger
>>> attached. I'm not sure if the only reason for the cache is for
>>> delivery of CLASS_UNLOAD events, but at first glance that appears to
>>> be the case.
>>>
>>> Chris
>>>
>>> On 6/20/19 1:31 PM, Volker Simonis wrote:
>>>> Hi Egor,
>>>>
>>>> yes, I‘d say this is something well known. The reason for this is
>>>> that a debugging agent will request some JVMTI capabilities like
>>>> "can_access_local_variables" which can only be requested at JVM
>>>> startup. However, once these capabilities have been taken, certain
>>>> kinds of optimizations like for example Escape Analysis, can’t be
>>>> done anymore which results in a performance degradation even if you
>>>> don’t ever attach a debugger.
>>>>
>>>> We‘ve always enabled debugging in our commercial SAP JVM and called
>>>> it „Debugging on Demand“ but usually didn’t observed any
>>>> performance slowdown of more than 3-5% at most. We’ve started
>>>> contributing some of the improvements we’ve done to make this
>>>> possible to the OpenJDK.
>>>>
>>>> I’ve not looked into your concrete class loading use case. Maybe
>>>> it’s possible to improve that. First you have to check by which
>>>> JVMTI capability it is triggered and if that capability is really
>>>> necessary for debugging and can only be requested at startup. If
>>>> the answer is yes, you can still check if it’s not possible to
>>>> improve the implementation of that capability in order to get a
>>>> better runtime behavior.
>>>>
>>>> Regards,
>>>> Volker
>>>>
>>>>
>>>> Egor Ushakov <egor.ushakov at jetbrains.com
>>>> <mailto:egor.ushakov at jetbrains.com>> schrieb am Do. 20. Juni 2019
>>>> um 11:36:
>>>>
>>>> Hi everyone!
>>>>
>>>> we have detected that a process started with the debug agent
>>>> (even when
>>>> debugger is not actually attached) may run significantly slower
>>>> than
>>>> without the agent, see:
>>>> https://youtrack.jetbrains.com/issue/JBR-1611
>>>> We all thought that without the debugger attached there should
>>>> not be a
>>>> difference.
>>>> Is that something well known? Should we file a bug?
>>>>
>>>> Thanks,
>>>> Egor
>>>>
>>>> --
>>>> Egor Ushakov
>>>> Software Developer
>>>> JetBrains
>>>> http://www.jetbrains.com
>>>> The Drive to Develop
>>>>
>>>
>>
>> --
>> Egor Ushakov
>> Software Developer
>> JetBrains
>> http://www.jetbrains.com
>> The Drive to Develop
>
>
--
Egor Ushakov
Software Developer
JetBrains
http://www.jetbrains.com
The Drive to Develop
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/serviceability-dev/attachments/20190704/7bbf1650/attachment.html>
More information about the serviceability-dev
mailing list