RFR(S) 8218751 Do not store original classfiles inside the CDS archive
Claes Redestad
claes.redestad at oracle.com
Wed Feb 20 22:30:11 UTC 2019
Hi,
in my opinion it's way too easy to add flags compared to how hard they
are to get rid of, so I agree with postponing the addition of the flag
until it's requested based on a real need.
Thanks!
/Claes
On 2019-02-20 23:17, serguei.spitsyn at oracle.com wrote:
> Hi Ioi,
>
>
> Sorry that I missed that this discussion moved to the runtime-dev only.
>
> In fact, I like the first webrev. It makes sense to safe on CDS footprint.
> What about to postpone adding option EnableOptionalDataSharedSpace until
> real customers request it?
> We need to understand real use cases first.
>
> In general, I'm not convinced there is a real performance problem at
> startup
> when CDS is used with native or java agents which enable CFLH events.
> At least, it seems to be a rare use case, and it is not performance
> critical.
>
> Thanks,
> Serguei
>
>
> On 2/18/19 22:58, Ioi Lam wrote:
>> Hi Jiangli,
>>
>> I think you're right that apps that use CFLH but rarely redefine
>> classes might see a slight speed up with the OD space. I don't know
>> how prevalent such uses cases are, but I won't object to making the OD
>> space optional.
>>
>> So, I added a new flag to enable the OD space. Instead of the name you
>> suggested, I used EnableOptionalDataSharedSpace so that it's related
>> to other XXXSharedSpace flags. I also added a sanity test case, and
>> fixed a Misplaced ResourceMark in klassFactory.cpp
>>
>> http://cr.openjdk.java.net/~iklam/jdk13/8218751-dont-store-classfiles-in-cds.v02/
>>
>> http://cr.openjdk.java.net/~iklam/jdk13/8218751-dont-store-classfiles-in-cds.v02-delta/
>>
>>
>> Please let me know what you think.
>>
>> Thanks
>> - Ioi
>>
>> On 2/18/19 8:12 PM, Jiangli Zhou wrote:
>>>
>>> On Mon, Feb 18, 2019 at 11:33 AM Ioi Lam <ioi.lam at oracle.com
>>> <mailto:ioi.lam at oracle.com>> wrote:
>>>
>>>
>>>
>>> On 2/15/19 7:11 PM, Jiangli Zhou wrote:
>>>> On Fri, Feb 15, 2019 at 6:56 PM Ioi Lam <ioi.lam at oracle.com
>>>> <mailto:ioi.lam at oracle.com>> wrote:
>>>>
>>>> On 2/15/19 4:54 PM, Jiangli Zhou wrote:
>>>>> Hi,
>>>>>
>>>>> To answer your use case question, one of the case reported
>>>>> last year in OpenJDK was JRebel (please go back to the
>>>>> hotspot-dev mail list 2018 Oct. archive). That is an
>>>>> existing example as I've tried to point out in my earlier
>>>>> email.
>>>>>
>>>> First of all, if you read the email carefully, CDS was not
>>>> even in their usual test matrix. Also, if you're modifying
>>>> classes on the fly, you're slowing down start-up big time. A
>>>> few ms spent in decoding the classfile data will be
>>>> completely drown out by the overhead of the classfile parsing
>>>> and patching code in the JVMTI agent.
>>>>
>>>> So no, JRebel will not start up a few % faster if CDS stores
>>>> the classfile data. It will most likely be not measurable.
>>>>
>>>>
>>>> My understanding of the case is that their users generated a CDS
>>>> archive and used it together with JRebel. That's why the issue
>>>> was unnoticed until their users reported. There are use cases out
>>>> there in the community that we simply are not aware of, so it
>>>> would not be wise to assume there is no usage.
>>>>
>>> Just to confirm one thing -- you do not dispute my claim that this
>>> "optimization" has no benefits even for those that actually use
>>> CDS and CFLH together. Correct?
>>>
>>>
>>> That's actually the part that I have a different opinion. With the
>>> proposed change in the current webrev, the performance hit is across
>>> the board for loading shared classes regardless if there is a class
>>> being redefined/retransformed, as long as the
>>> can_generate_all_class_hook_events capability is enabled.
>>>
>>>
>>> We have plenty of nice-to-have harmless optimizations in HotSpot
>>> that probably weren't vigorously validated. However, this is not
>>> one of them.
>>>
>>> Here we have clear evidence of harm (50% footprint increase), with
>>> no evidence of benefit (theoretical or real-life). This code was
>>> checked into HotSpot without proper validation. That was wrong,
>>> and that's why I am taking it out now.
>>>
>>> It's easy to prove me wrong. Just supply a proper benchmark that
>>> shows benefits, and I will change my mind. That's the minimal
>>> standard for an optimization that has harmful side effects. I have
>>> created JDK-8219255 for tracking this.
>>>
>>>
>>> Looks like there is a deadlock in the discussion. To summarize and
>>> help move this forward. Here are your reasons for dropping the 'od'
>>> space:
>>>
>>> * static footprint increase due to 'od' space
>>> * no benefit
>>> * maintenance of the code
>>>
>>> Regarding static footprint, the change proposed in the current webrev
>>> is a short-term and temporary solution. For a long-term solution, the
>>> original class files can be removed from the final image created by
>>> jlink when jlink can work with CDS to produce a single runtime image.
>>>
>>> On the benefit side, the 'od' space provides both startup speedup and
>>> runtime memory saving (when can_generate_all_class_hook_events
>>> capability is enabled), which I've already pointed those out in
>>> earlier emails.
>>>
>>> For maintenance, it is also not an issue with the support from the
>>> community (I'll for sure to continue contributing to it). What's more
>>> important is to continue keeping CDS/AppCDS moving in the right
>>> direction by providing more performance & memory benefits and making
>>> it easier to use.
>>>
>>> So I think providing a command-line option,
>>> -XX:EnableOptionalDataSpace that allows user to enable/disable the
>>> 'od' space at both dump time and runtime is the best choice that can
>>> work with the short-term fix proposed in the current webrev.
>>>
>>> Thanks,
>>> Jiangli
>>>
>>> Thanks,
>>> Jiangli
>>>
>>>
>>> Thanks
>>> - Ioi
>>>
>>>
>>>> Thanks,
>>>> Jiangli
>>>>
>>>>
>>>>> The issue with the current change is that it's only targeted
>>>>> for reducing the static footprint (static footprint
>>>>> reduction could be achieved with alternative approaches such
>>>>> as file compression). The removal of the 'od' space and the
>>>>> benefits (both the startup and runtime footprint) is not
>>>>> backed up by a clear requirement here and the change should
>>>>> not go in as is.
>>>>>
>>>> As part of the JVM development, we constantly review and
>>>> remove unnecessary code to keep the JVM healthy. That's a
>>>> clear requirement and mandate on Oracle as the major
>>>> contributor to the JDK.
>>>>
>>>> In this case, we are removing a premature optimization in the
>>>> original design. The classfile data stored in the CDS archive
>>>> are rarely used (99.99+%), and when they are used, the speed
>>>> optimization is irrelevant because the user of this data
>>>> (JVMTI agent) is so much slower. So everyone is taking a
>>>> footprint hit with no benefit to anyone.
>>>>
>>>> Thanks
>>>>
>>>> - Ioi
>>>>
>>>>
>>>>> Just to summarize the drawbacks of the current change:
>>>>>
>>>>> * Runtime footprint increase (causes more memory
>>>>> fragmentation even the memory is freed after use)
>>>>> * Startup time regression when
>>>>> can_generate_all_class_hook_events capability is enabled
>>>>> * May cause issue with future optimization
>>>>>
>>>>> Thanks,
>>>>> Jiangli
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Fri, Feb 15, 2019 at 2:07 PM Ioi Lam <ioi.lam at oracle.com
>>>>> <mailto:ioi.lam at oracle.com>> wrote:
>>>>>
>>>>> Hi Jiangli,
>>>>>
>>>>> Thanks for volunteering on this. I think it's best to do
>>>>> that (optional support for storing uncompressed
>>>>> classfile data into the CDS archive) as a separate bug
>>>>> than the current issue.
>>>>>
>>>>> If you decide to provide a patch for that, I think it
>>>>> would be best to find actual users or use cases that
>>>>> would find it beneficial. Otherwise it will appear to be
>>>>> a solution looking for a problem.
>>>>>
>>>>> Thanks
>>>>>
>>>>> - Ioi
>>>>>
>>>>>
>>>>> On 2/15/19 10:35 AM, Jiangli Zhou wrote:
>>>>>> I'm willing to continue contributing to the support and
>>>>>> maintaining of CDS/AppCDS. Often startup improvements
>>>>>> with measurable gain (>4% in this case) are
>>>>>> non-trivial. The support for 'od' is not overly complex
>>>>>> comparing to the performance gain. In a rosier picture
>>>>>> if Jlink/AOT/CDS can work together in harmony to create
>>>>>> a single image in the future, class files (and even JAR
>>>>>> files) can be eliminated and no class file data can be
>>>>>> loaded at runtime from a JAR file. We should consider
>>>>>> all aspects and not make a decision lightly.
>>>>>>
>>>>>> For the dynamic archiving, this is not a blocking
>>>>>> issue. I can step in an help with making 'od' optional
>>>>>> if needed.
>>>>>>
>>>>>> Thanks,
>>>>>> Jiangli
>>>>>>
>>>>>> On Thu, Feb 14, 2019 at 7:53 PM Ioi Lam
>>>>>> <ioi.lam at oracle.com <mailto:ioi.lam at oracle.com>> wrote:
>>>>>>
>>>>>> That means we have to add a new -XX option to
>>>>>> enable this, and need to add extra test cases and
>>>>>> maintenance.
>>>>>>
>>>>>> We are talking about only single digit % benefits
>>>>>> in very narrow use cases, and it's not clear
>>>>>> whether performance is important in such cases (or
>>>>>> if people would bother to use this -XX flag to gain
>>>>>> a few %). Without user input, it's hard to justify
>>>>>> keep spending time on an optimization that
>>>>>> literally no one had asked for.
>>>>>>
>>>>>> I just don't think we have time to keep maintaining
>>>>>> this. If someone is willing to step up and provide
>>>>>> support for this, feel free.
>>>>>>
>>>>>> Thanks
>>>>>>
>>>>>> - Ioi
>>>>>>
>>>>>>
>>>>>> On 2/14/19 1:20 PM, Jiangli Zhou wrote:
>>>>>>> Based on the issues raised in OpenJDK last year,
>>>>>>> there appears to be existing use cases with
>>>>>>> AppCDS + CLFH. When designing the platform, we
>>>>>>> should think from the user perspective. Making
>>>>>>> 'od' optional is not complex and gives the control
>>>>>>> to the Java users. It also avoids potential waste
>>>>>>> of effort for removing&putting back the
>>>>>>> optimization.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Jiangli
>>>>>>> On Thu, Feb 14, 2019 at 11:46 AM Ioi Lam
>>>>>>> <ioi.lam at oracle.com <mailto:ioi.lam at oracle.com>>
>>>>>>> wrote:
>>>>>>>
>>>>>>> Such optional support increase the complexity
>>>>>>> of the VM. My preference would be to wait
>>>>>>> until there's an actual need for this.
>>>>>>>
>>>>>>> The JDK is release under 6 months cadence, so
>>>>>>> if the removal turns out to be a bad idea, we
>>>>>>> can reinstate the code in the next release.
>>>>>>> Or, someone can just make their own JDK build
>>>>>>> with a simple anti-delta of this patch.
>>>>>>>
>>>>>>> If we are too reluctant to remove anything,
>>>>>>> the JDK will eventually become a hopeless mess.
>>>>>>>
>>>>>>> Thanks
>>>>>>>
>>>>>>> - Ioi
>>>>>>>
>>>>>>> On 2/14/19 10:43 AM, Jiangli Zhou wrote:
>>>>>>>> Sorry for the slow turnaround. Hopefully it
>>>>>>>> will get better after this week. As there is
>>>>>>>> no enough user data/requirement to determine
>>>>>>>> which optimization direction is more
>>>>>>>> important in this case, it might be
>>>>>>>> reasonable to make the 'optional data' space
>>>>>>>> truly optional, which can be controlled by a
>>>>>>>> command-line option. If the performance is
>>>>>>>> more important (in case
>>>>>>>> should_post_class_file_load_hook is required
>>>>>>>> for a particular use case), user can enable
>>>>>>>> dumping out the 'od' space with archived
>>>>>>>> class file data, otherwise the data can be
>>>>>>>> loaded at runtime. What's your thought on this?
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Jiangli
>>>>>>>>
>>>>>>>> On Wed, Feb 13, 2019 at 12:03 PM Ioi Lam
>>>>>>>> <ioi.lam at oracle.com
>>>>>>>> <mailto:ioi.lam at oracle.com>> wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>> On 2/13/19 11:24 AM, Jiangli Zhou wrote:
>>>>>>>>> Hi Ioi,
>>>>>>>>>
>>>>>>>>> Thanks for the additional information
>>>>>>>>> and performance data. Please see more
>>>>>>>>> comments below.
>>>>>>>>>
>>>>>>>>> On Wed, Feb 13, 2019 at 5:33 AM Ioi Lam
>>>>>>>>> <ioi.lam at oracle.com
>>>>>>>>> <mailto:ioi.lam at oracle.com>> wrote:
>>>>>>>>>
>>>>>>>>> Hi Jiangli,
>>>>>>>>>
>>>>>>>>> The main reason for doing this is to
>>>>>>>>> reduce the size of the CDS file.
>>>>>>>>> For example, when archiving Eclipse
>>>>>>>>> IDE with JDK-8215311 (Dynamic Class
>>>>>>>>> Metadata Archive), the CDS archive
>>>>>>>>> is reduced from 100MB to about 67MB.
>>>>>>>>>
>>>>>>>>> We have not heard any requirement
>>>>>>>>> for high performance with
>>>>>>>>> CDS+ClassFileLoadHook. It doesn't
>>>>>>>>> seem right for everyone to take a 50%
>>>>>>>>> file size penalty for an
>>>>>>>>> optimization that no one has asked
>>>>>>>>> for.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Jut to clarify, it is ~30% not 50%
>>>>>>>>> (possibly a typo?), correct?
>>>>>>>>
>>>>>>>>
>>>>>>>> Depending on how you look at it. Going
>>>>>>>> from 67MB to 100MB is an increase of 33MB
>>>>>>>> which is 50%.
>>>>>>>>
>>>>>>>>
>>>>>>>>>
>>>>>>>>> Here are some perf numbers (running
>>>>>>>>> "java -version" with an agent that
>>>>>>>>> installs a CFLH that doesn't
>>>>>>>>> nothing). Yes, it's somewhat slower as
>>>>>>>>> expected, but it doesn't seem to be
>>>>>>>>> catastrophic. Using CDS is
>>>>>>>>> nevertheless much faster than
>>>>>>>>> without CDS anyway.
>>>>>>>>>
>>>>>>>>> After No CFLH 0.0476 seconds time
>>>>>>>>> elapsed ( +- 0.20% )
>>>>>>>>> After with CFLH 0.0513 seconds time
>>>>>>>>> elapsed ( +- 0.18% ) 7.773%
>>>>>>>>> slower
>>>>>>>>>
>>>>>>>>> Before no CFLH 0.0472 seconds time
>>>>>>>>> elapsed ( +- 0.21% )
>>>>>>>>> Before with CFLH 0.0492 seconds time
>>>>>>>>> elapsed ( +- 0.18% ) 4.237%
>>>>>>>>> slower
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Comparing 'After with CFLH' (0.0513
>>>>>>>>> seconds) with 'Before with CFLH' (0.0492
>>>>>>>>> seconds), there is about 4.27%
>>>>>>>>> performance degradation observed from
>>>>>>>>> your data.
>>>>>>>>>
>>>>>>>>> Another disadvantage of this proposed
>>>>>>>>> change is the increasing of runtime
>>>>>>>>> memory. When the class file data is
>>>>>>>>> stored in the shared archive file and
>>>>>>>>> mapped as RO (read-only), it can be
>>>>>>>>> shared among multiple JVM processes. For
>>>>>>>>> the default CDS archive case, it's
>>>>>>>>> shared by all JVM processes running
>>>>>>>>> simultaneously. With the proposed change
>>>>>>>>> in the webrev, the memory for the class
>>>>>>>>> file data is allocated at runtime. It
>>>>>>>>> moves the cost from static footprint to
>>>>>>>>> runtime memory footprint, which is a
>>>>>>>>> higher price because it needs to be
>>>>>>>>> multiplied by the number of running JVM
>>>>>>>>> processes.
>>>>>>>>
>>>>>>>>
>>>>>>>> With this patch, the decoded classdata is
>>>>>>>> freed after the CFLH is called, so
>>>>>>>> there's no resident memory cost.
>>>>>>>>
>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> CDS Off with CFLH 0.0869 seconds
>>>>>>>>> time elapsed ( +- 0.18% )
>>>>>>>>> CDS Off without CFLH 0.0852 seconds
>>>>>>>>> time elapsed ( +- 0.14% ) 1.995%
>>>>>>>>> slower
>>>>>>>>>
>>>>>>>>> I am not sure if there's a
>>>>>>>>> performance critical case for CFLH.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> I have the similar question. It would be
>>>>>>>>> good to go back and re-investigate the
>>>>>>>>> original requirements for supporting
>>>>>>>>> CFLH use cases.
>>>>>>>>
>>>>>>>>
>>>>>>>> I think when we added CFLH support for
>>>>>>>> CDS, the goal was "to not lose all
>>>>>>>> benefit of CDS when CFLH is enabled". I
>>>>>>>> think we still achieve that after this
>>>>>>>> patch. There really was no requirement
>>>>>>>> "to make CFLH blazing fast at all cost".
>>>>>>>>
>>>>>>>> Thanks
>>>>>>>>
>>>>>>>> - Ioi
>>>>>>>>
>>>>>>>>> I suppose
>>>>>>>>> if performance is critical you would
>>>>>>>>> rewrite the classes statically and
>>>>>>>>> rebuild your app, instead of
>>>>>>>>> patching its bytecodes at runtime.
>>>>>>>>> However,
>>>>>>>>> if there were indeed a performance
>>>>>>>>> critical case, I think it's better to
>>>>>>>>> change JVMTI to allow a 2-level
>>>>>>>>> filtering for CFLH:
>>>>>>>>>
>>>>>>>>> I believe the overwhelming use case,
>>>>>>>>> where performance is critical, the
>>>>>>>>> CFLH will just patch a small number
>>>>>>>>> of class files. I can't fathom any
>>>>>>>>> use case where someone wants to
>>>>>>>>> patch EVERY loaded class.
>>>>>>>>>
>>>>>>>>> The current CFLH passes both the
>>>>>>>>> name of the class, as well as the
>>>>>>>>> classfile data, in a single call.
>>>>>>>>> This forces CDS to decode the
>>>>>>>>> classfile data for every hook call.
>>>>>>>>> However, in most cases, the CFLH
>>>>>>>>> will just examine the class name,
>>>>>>>>> and do nothing unless the name matches
>>>>>>>>> a certain pattern, so we end up
>>>>>>>>> wasting the decoding effort.
>>>>>>>>>
>>>>>>>>> My suggested improvement is to add a
>>>>>>>>> new filtering call in JVMTI that
>>>>>>>>> passes only the name. If the CFLH
>>>>>>>>> wants to patch the class, it will then
>>>>>>>>> request the classfile data, at which
>>>>>>>>> point CDS will decode it from the
>>>>>>>>> modules file or JAR file.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> That probably is the right direction.
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Jiangli
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Thanks
>>>>>>>>>
>>>>>>>>> - Ioi
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 2/12/19 5:18 PM, Jiangli Zhou
>>>>>>>>> wrote:
>>>>>>>>> > Hi Ioi,
>>>>>>>>> >
>>>>>>>>> > I'd like to understand the
>>>>>>>>> performance impact with this change.
>>>>>>>>> Do you have
>>>>>>>>> > any performance numbers when
>>>>>>>>> JvmtiExport::should_post_class_file_load_hook()
>>>>>>>>> > is required? This is a performance
>>>>>>>>> vs footprint trade-off. For some
>>>>>>>>> users,
>>>>>>>>> > performance is more important than
>>>>>>>>> static footprint.
>>>>>>>>> >
>>>>>>>>> > Could you also please provide some
>>>>>>>>> background/motivation for this change?
>>>>>>>>> >
>>>>>>>>> > Thanks,
>>>>>>>>> > Jiangli
>>>>>>>>> >
>>>>>>>>> > On Mon, Feb 11, 2019 at 9:24 AM
>>>>>>>>> Ioi Lam <ioi.lam at oracle.com
>>>>>>>>> <mailto:ioi.lam at oracle.com>> wrote:
>>>>>>>>> >
>>>>>>>>> >>
>>>>>>>>> http://cr.openjdk.java.net/~iklam/jdk13/8218751-dont-store-classfiles-in-cds.v01/
>>>>>>>>>
>>>>>>>>> >>
>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8218751
>>>>>>>>> >>
>>>>>>>>> >> For JVMTI ClassFileLoadHook
>>>>>>>>> support, the CDS archive currently
>>>>>>>>> stores
>>>>>>>>> >> the original classfile data of
>>>>>>>>> all archived classes.
>>>>>>>>> >>
>>>>>>>>> >> However, this consists of over
>>>>>>>>> 30% of the archive size. Because all
>>>>>>>>> >> original classfile data are
>>>>>>>>> already available in other files
>>>>>>>>> (such as the
>>>>>>>>> >> JDK lib/modules file, or JAR
>>>>>>>>> files in the classpath), we can
>>>>>>>>> simply read
>>>>>>>>> >> from these locations when needed
>>>>>>>>> by JVMTI.
>>>>>>>>> >>
>>>>>>>>> >> For the default CDS archive
>>>>>>>>> (included as part of the JDK
>>>>>>>>> distribution),
>>>>>>>>> >> the size is reduced from about
>>>>>>>>> 18.5MB to 12.1MB on Linux/x64.
>>>>>>>>> >>
>>>>>>>>> >> Thanks
>>>>>>>>> >>
>>>>>>>>> >> - Ioi
>>>>>>>>> >>
>>>>>>>>> >>
>>>>>>>>>
>>>
>>
>
More information about the serviceability-dev
mailing list