RFR(S) 8218751 Do not store original classfiles inside the CDS archive
Ioi Lam
ioi.lam at oracle.com
Wed Feb 13 20:03:08 UTC 2019
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 hotspot-runtime-dev
mailing list