RFR(S) 8189688: NMT: Report per-class load metadata information

Zhengyu Gu zgu at redhat.com
Fri Oct 27 20:34:30 UTC 2017


On 10/26/2017 08:53 AM, Thomas Stüfe wrote:
> Hi Zhengyu,
> 
> one more thing, your output does not seem to be included in the final 
> NMT report when the VM shuts down, could this be added too?
> 
This turns out to be a tricky one.

During VM exit, we are not supposed to request a safepoint, correct?
Without a safepoint, it is unsafe to walk class loaders.

Thanks,

-Zhengyu


> Thanks! Thomas
> 
> On Wed, Oct 25, 2017 at 7:00 AM, Thomas Stüfe <thomas.stuefe at gmail.com 
> <mailto:thomas.stuefe at gmail.com>> wrote:
> 
>     Hi Zhengyu,
> 
>     On Tue, Oct 24, 2017 at 8:04 PM, Zhengyu Gu <zgu at redhat.com
>     <mailto:zgu at redhat.com>> wrote:
> 
>         Hi Thomas,
> 
>         On 10/24/2017 12:08 PM, Thomas Stüfe wrote:
> 
>             Hi Zhengyu,
> 
>             - VM_PrintMetadata still has the _unit member, but I see it
>             nowhere used.
> 
>             - I would have split the summary between class and non-class
>             area, that may have been more useful. But this is a matter
>             of taste, I leave it up to you.
> 
>         Agree, should go little further.
> 
>         Summary:
>            Total class loaders=   754 capacity=  67528.00KB used= 
>         61216.88KB free=   9453.11KB waste=     38.73KB
>                              Metadata capacity=  58780.00KB used= 
>         54053.45KB free=   4726.55KB waste=     36.38KB
>                            Class data capacity=   8748.00KB used= 
>           7163.43KB free=   1584.57KB waste=      2.35KB
> 
>         For anonymous classes=   580 capacity=   2732.00KB used= 
>           1065.06KB free=   1666.94KB waste=     16.27KB
>                              Metadata capacity=   2152.00KB used=   
>         738.46KB free=   1413.54KB waste=     16.27KB
>                            Class data capacity=    580.00KB used=   
>         326.60KB free=    253.40KB waste=      0.00KB
> 
> 
> 
>     Nice, thanks :)
> 
>         Updated webrev:
>         http://cr.openjdk.java.net/~zgu/8189688/webrev.03/
>         <http://cr.openjdk.java.net/~zgu/8189688/webrev.03/>
> 
> 
>     All is well. Note that you could reduce the footprint of your change
>     somewhat by defining a structure like this:
> 
>     struct numbers_t { size_t cap; size_t used; size_t free; size_t waste; }
> 
>     and replacing the many members in PrintCLDMetaspaceInfoClosure with
>     instances of this structure:
> 
>     numbers_t total;
>     numbers_t total_class;
>     numbers_t total_anon;
>     numbers_t total_anon_class;
>     Depending on how far you go, your code could deflate quite a bit.
>     Give the structure a default ctor and your large initializer list
>     goes away; give it a printing function and you reduce
>     print-summary() to four function calls; with something like an
>     numbers_t::add(size_t cap, size_t used, size_t free, size_t waste)
>     you can reduce the additions in
>     PrintCLDMetaspaceInfoClosure::print_metaspace() to four lines.
> 
>     Just a suggestion, I leave it up to you if you do this.
> 
>     Lines 3108 and 3129 miss each a space before BytesPerWord. Change
>     looks fine otherwise.
> 
>     Thanks, Thomas
> 
> 
>         Thanks,
> 
>         -Zhengyu
> 
> 
>             All else looks fine to me now. I do not need another review.
> 
>             Thanks for your work, this will come in handy!
> 
>             ..Thomas
> 
>             On Tue, Oct 24, 2017 at 5:08 PM, Zhengyu Gu <zgu at redhat.com
>             <mailto:zgu at redhat.com> <mailto:zgu at redhat.com
>             <mailto:zgu at redhat.com>>> wrote:
> 
>                  Hi Thomas,
> 
> 
>                      Not sure whether we misunderstood each other. I was
>             thinking of
>                      something in the line of:
> 
>                      <<<<
>                      ....
>                      ClassLoader: jdk/internal/reflect/DelegatingClassLoader
>                          Metadata:
>                             capacity:     5.00KB used:     3.32KB free: 
>                 1.68KB
>                      waste: 0.00KB
>                          Class data:
>                             capacity:     1.00KB used:     0.54KB free: 
>                 0.46KB
>                      waste: 0.00KB
> 
>                      ClassLoader: for anonymous class
>                          Metadata:
>                             capacity:     1.00KB used:     1.00KB free: 
>                 0.00KB
>                      waste: 0.00KB
>                          Class data:
>                             capacity:     1.00KB used:     0.64KB free: 
>                 0.36KB
>                      waste: 0.00KB
>                      ....
> 
>                      Summary:
>                      XX class loaders encountered, total capacity: xx,
>             total waste: xx.
> 
>                      Peak usage by class loader: xxxx
>                        >>>>
> 
>                  Added summary lines:
> 
>                     Total class loaders=    56 capacity=   6378.00KB
>             used=       6205.08KB free=    172.92KB waste=      1.44KB
>                  For anonymous classes=    54 capacity=    212.00KB
>             used=     96.95KB
>                  free=    115.05KB waste=      0.94KB
> 
> 
> 
> 
>                      These numbers would not be interpretation, just a
>             convenience to
>                      the reader to get a clear picture.
> 
>                      It even may be useful to separate the output
>             between basic and
>                      detailed mode, and in basic mode omit all the
>             single class
>                      loaders and just print the summary line.
> 
>                           Updated webrev:
>             http://cr.openjdk.java.net/~zgu/8189688/webrev.01/index.html
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.01/index.html>
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.01/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.01/index.html>>
>                                 
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.01/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.01/index.html>
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.01/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.01/index.html>>>
> 
> 
> 
>                      metaspace.hpp:
> 
>                      I would have preferred to keep scale_unit file
>             local static
>                      instead of exposing it via MetaspaceAux, because it
>             does not
>                      really have anything to do with metaspace.
> 
>                  Fixed
> 
> 
>                      Otherwise ok.
> 
>                      ---
> 
>                      metaspace.cpp
> 
>                      - ChunkManager::print_statistics(): thanks for
>             reusing this
>                      function!
>                            -> Scale can only be ever 1, K, M, G, yes?
>             So, could you
>                      add an assert at the start of the function, and a
>             comment at the
>                      prototype or function head?
>                            -> Also, now that
>             ChunkManager::print_statistics() takes a
>                      scale, could you please change the printout to use
>             floats like
>                      you did in
>             PrintCLDMetaspaceInfoClosure::print_metaspace()?
> 
>                  Done.
> 
> 
>                  Chunkmanager (non-class):
>                     0 specialized (128 bytes) chunks, total 0.00KB
>                     0 small (512 bytes) chunks, total 0.00KB
>                     0 medium (8192 bytes) chunks, total 0.00KB
>                     0 humongous chunks, total 0.00KB
>                     total size: 0.00KB.
>                  Chunkmanager (class):
>                     0 specialized (128 bytes) chunks, total 0.00KB
>                     0 small (256 bytes) chunks, total 0.00KB
>                     0 medium (4096 bytes) chunks, total 0.00KB
>                     0 humongous chunks, total 0.00KB
>                     total size: 0.00KB.
> 
> 
>                      - I am concerned about races in
>                     
>             PrintCLDMetaspaceInfoClosure::do_cld(ClassLoaderData* cld).
>                      Maybe my understanding is limited. We bail if
>             cld->is_unloading.
>                      But nothing prevents a ClassLoaderDataGraph from
>             starting to
>                      unload a ClassLoaderData and tearing down the
>             Metaspace after we
>                      started printing it in another thread, right? Also,
>             I do not see
>                      any fences.
> 
>                      So, I wonder whether PrintCLDMetaspaceInfoClosure
>             should run in
>                      lock protection. And then, I wonder if it would be
>             good to
>                      separate data gathering and printing. We print to a
>             (at least in
>                      principle) unknown output stream, which may be
>             doing slow File
>                      IO or even Network IO. Doing this under lock
>             protection seems
>                      not a good idea (but I see other places where this
>             happens too).
> 
>                      For an example, see ChunkManager::get_statistic() vs
>                      ChunkManager::print_statistic(). Could you do the
>             same, have a
>                      data gathering step where you collect your
>                      <capacity/used/free/waste> quadrupel in a variable
>             sized list of
>                      structures in memory, and print it out in a
>             separate step? I
>                      realize though that the effort would be larger than
>             for what we
>                      did in ChunkManager::get_statistic(), where we only
>             fill a
>                      structure.
> 
> 
>                  Unlike other NMT queries, this query is executed at a
>             safepoint by
>                  VMThread, so it should be okay.
> 
>                  Updated webrev:
>             http://cr.openjdk.java.net/~zgu/8189688/webrev.02/
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.02/>
>                  <http://cr.openjdk.java.net/~zgu/8189688/webrev.02/
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.02/>>
> 
>                  Thanks,
> 
>                  -Zhengyu
> 
> 
>                      ------
> 
>                      vm_operations.hpp
> 
>                      - VM_PrintMetadata : do we still need _unit?
> 
> 
>                           Thanks,
> 
>                           -Zhengyu
> 
> 
> 
>                      Thanks!
> 
>                      Thomas
> 
> 
> 
>                           On 10/23/2017 11:08 AM, Thomas Stüfe wrote:
> 
> 
> 
>                               On Mon, Oct 23, 2017 at 5:03 PM, Zhengyu Gu
>                      <zgu at redhat.com <mailto:zgu at redhat.com>
>             <mailto:zgu at redhat.com <mailto:zgu at redhat.com>>
>                               <mailto:zgu at redhat.com
>             <mailto:zgu at redhat.com> <mailto:zgu at redhat.com
>             <mailto:zgu at redhat.com>>>
>                      <mailto:zgu at redhat.com <mailto:zgu at redhat.com>
>             <mailto:zgu at redhat.com <mailto:zgu at redhat.com>>
>                               <mailto:zgu at redhat.com
>             <mailto:zgu at redhat.com> <mailto:zgu at redhat.com
>             <mailto:zgu at redhat.com>>>>> wrote:
> 
> 
> 
>                                        Okay. So this is important for
>             understanding cases
>                               where we have
>                                        a large number of miniscule class
>             loaders,
>                      each one
>                               only having
>                                        a few numbers of chunks. In this
>             case, would it be
>                               useful to
>                                        have a running total of "free"
>             and "waste",
>                      too? Or
>                               even better,
>                                        also average and peak values of
>             "free" and
>                      "waste" (to tell
>                                        apart cases where you have one
>             outlier vs
>                      cases where
>                               just all
>                                        metaspaces waste a lot of memory).
>                                        Just out of curiosity, I looked at
>             http://cr.openjdk.java.net/~zgu/cld_metaspace/wildfly.txt
>             <http://cr.openjdk.java.net/~zgu/cld_metaspace/wildfly.txt>
>                     
>             <http://cr.openjdk.java.net/~zgu/cld_metaspace/wildfly.txt
>             <http://cr.openjdk.java.net/~zgu/cld_metaspace/wildfly.txt>>
>                                     
>             <http://cr.openjdk.java.net/~zgu/cld_metaspace/wildfly.txt
>             <http://cr.openjdk.java.net/~zgu/cld_metaspace/wildfly.txt>
>                     
>             <http://cr.openjdk.java.net/~zgu/cld_metaspace/wildfly.txt
>             <http://cr.openjdk.java.net/~zgu/cld_metaspace/wildfly.txt>>>
>                                                     
>             <http://cr.openjdk.java.net/~zgu/cld_metaspace/wildfly.txt
>             <http://cr.openjdk.java.net/~zgu/cld_metaspace/wildfly.txt>
>                     
>             <http://cr.openjdk.java.net/~zgu/cld_metaspace/wildfly.txt
>             <http://cr.openjdk.java.net/~zgu/cld_metaspace/wildfly.txt>>
>                                     
>             <http://cr.openjdk.java.net/~zgu/cld_metaspace/wildfly.txt
>             <http://cr.openjdk.java.net/~zgu/cld_metaspace/wildfly.txt>
>                     
>             <http://cr.openjdk.java.net/~zgu/cld_metaspace/wildfly.txt
>             <http://cr.openjdk.java.net/~zgu/cld_metaspace/wildfly.txt>>>> 
>             and
>                                        it seems that "free" is the
>             problem, not
>                      "waste"? So I
>                               guess
>                                        what happens is that all the
>             little classloaders
>                               allocate just
>                                        enough memory to push them over
>                      "_small_chunk_limit=4",
>                               so they
>                                        allocate the first medium chunk,
>             from which
>                      then they
>                               take a
>                                        small bite and leave the rest
>             laying around?
> 
>                                    Yes. The free space of anonymous
>             classes should be
>                      counted
>                               as waste,
>                                    in my opinion. I am not sure if
>             everyone agrees,
>                      so I took the
>                                    summary line out of this patch.
> 
>                                    I would be more than happy to restore
>             the summary
>                      line, if
>                               you find
>                                    it is useful :-)
> 
> 
>                               I agree with you. Typically class loaders
>             stop loading
>                      at some
>                               point, especially these tine ones, and
>             often will not
>                      resume
>                               loading. So, effectivly, the space is
>             wasted. It still
>                      helps to
>                               distinguish "free" in the current chunks
>             from "free" in the
>                               other chunks to tell this situation apart
>             from a
>                      situation where
>                               we have just a bug in metaspace chunk handling
>                      preventing us to
>                               use up our chunks.
> 
> 
>                                                 The latter would be an
>             important
>                      addition,
>                               regardless
>                                        if this is
>                                                 for customers or for us.
>             Chunks idling in
>                               freelists can
>                                        make a
>                                                 huge impact, and
>             unfortunately this
>                      may happen
>                               in perfectly
>                                                 valid cases. See e.g.
>             our JEP
>                                                               
>             "https://bugs.openjdk.java.net/browse/JDK-8166690
>             <https://bugs.openjdk.java.net/browse/JDK-8166690>
>                      <https://bugs.openjdk.java.net/browse/JDK-8166690
>             <https://bugs.openjdk.java.net/browse/JDK-8166690>>
>                             
>               <https://bugs.openjdk.java.net/browse/JDK-8166690
>             <https://bugs.openjdk.java.net/browse/JDK-8166690>
>                      <https://bugs.openjdk.java.net/browse/JDK-8166690
>             <https://bugs.openjdk.java.net/browse/JDK-8166690>>>
>                                               
>             <https://bugs.openjdk.java.net/browse/JDK-8166690
>             <https://bugs.openjdk.java.net/browse/JDK-8166690>
>                      <https://bugs.openjdk.java.net/browse/JDK-8166690
>             <https://bugs.openjdk.java.net/browse/JDK-8166690>>
>                             
>               <https://bugs.openjdk.java.net/browse/JDK-8166690
>             <https://bugs.openjdk.java.net/browse/JDK-8166690>
>                      <https://bugs.openjdk.java.net/browse/JDK-8166690
>             <https://bugs.openjdk.java.net/browse/JDK-8166690>>>>
>                                                               
>             <https://bugs.openjdk.java.net/browse/JDK-8166690
>             <https://bugs.openjdk.java.net/browse/JDK-8166690>
>                      <https://bugs.openjdk.java.net/browse/JDK-8166690
>             <https://bugs.openjdk.java.net/browse/JDK-8166690>>
>                             
>               <https://bugs.openjdk.java.net/browse/JDK-8166690
>             <https://bugs.openjdk.java.net/browse/JDK-8166690>
>                      <https://bugs.openjdk.java.net/browse/JDK-8166690
>             <https://bugs.openjdk.java.net/browse/JDK-8166690>>>
>                                               
>             <https://bugs.openjdk.java.net/browse/JDK-8166690
>             <https://bugs.openjdk.java.net/browse/JDK-8166690>
>                      <https://bugs.openjdk.java.net/browse/JDK-8166690
>             <https://bugs.openjdk.java.net/browse/JDK-8166690>>
>                             
>               <https://bugs.openjdk.java.net/browse/JDK-8166690
>             <https://bugs.openjdk.java.net/browse/JDK-8166690>
>                      <https://bugs.openjdk.java.net/browse/JDK-8166690
>             <https://bugs.openjdk.java.net/browse/JDK-8166690>>>>>". We have
>                                                 already a printing
>             routine for free
>                      chunks, in
>                                                       
>             ChunkManager::print_all_chunkmanagers(). Could
>                               you add
>                                        this to
>                                                 your output?
> 
> 
>                                             Make sense! Could you
>             recommend what data and
>                               format you
>                                        would like
>                                             to see?
> 
> 
> 
>                                        Would not
>                      ChunkManager::print_all_chunkmanagers() be
>                               sufficient?
> 
>                                    Okay, I might need to tweak output
>             format.
> 
> 
>                               Fine by me. Nothing depends on it yet.
> 
>                               Thanks, Thomas
> 
>                                    Thanks,
> 
>                                    -Zhengyu
> 
> 
> 
>                                                 -------------
> 
>                                                 Other than above notes,
>             the changes seem
>                                        straighforward, I did
>                                                 not see anything wrong.
>             Minor nits:
> 
>                                                 -
>             PrintCLDMetaspaceInfoClosure::_out,
>                      _scale
>                               and _unit
>                                        could all
>                                                 be constant (with _out
>             being a
>                      outputStream*
>                               const).
>                                                 - We also do not need to
>             provide
>                      scale *and*
>                               unit as
>                                        argument,
>                                                 one can be deduced from
>             the other.
>                      This would
>                               also prevent
>                                                 mismatches.We do need
>             scale here,
>                      since nmt
>                               command
>                                        line can set
>                                                 scale and we do
> 
>                                             have to honor that.
> 
>                                             However, passing unit is
>             ugly! I don't
>                      want to
>                               introduce
>                                        inverse
>                                             dependence (metaspace ->
>             nmt), which is
>                      also ugly.
> 
> 
>                                        Yes, that would be regrettable.
> 
>                                             Probably should move scale
>             mapping code from
>                               NMTUtil to a
>                                        common util?
> 
> 
> 
>                                        That would be possible, these
>             functions
>                               (scale_from_name etc)
>                                        are simple enough to be moved to
>             a generic file.
>                               However, if you
>                                        pass scale, deducing the string
>             that goes with
>                      it is
>                               trivial and
>                                        I would have no qualms doing this
>             by hand in
>                               metaspace.cpp. But
>                                        it is a matter of taste.
> 
> 
>                                                 I did not look closely
>             at locking
>                      issues, I assume
>                                               
>               MetaspaceAux::print_metadata() is
>                      supposed to
>                               run only in
>                                                 Safepoints?
> 
> 
>                                             No. sum_xxx_xxx_in_use
>             queries are
>                      guarded by locks.
> 
>                                             Thanks,
> 
>                                             -Zhengyu
> 
> 
>                                        Thanks, Thomas
> 
> 
> 
>                                                 Thanks & Kind Regards,
>             Thomas
> 
> 
> 
> 
> 
> 
>                                                 On Fri, Oct 20, 2017 at
>             4:00 PM,
>                      Zhengyu Gu
>                                        <zgu at redhat.com
>             <mailto:zgu at redhat.com> <mailto:zgu at redhat.com
>             <mailto:zgu at redhat.com>>
>                      <mailto:zgu at redhat.com <mailto:zgu at redhat.com>
>             <mailto:zgu at redhat.com <mailto:zgu at redhat.com>>>
>                               <mailto:zgu at redhat.com
>             <mailto:zgu at redhat.com> <mailto:zgu at redhat.com
>             <mailto:zgu at redhat.com>>
>                      <mailto:zgu at redhat.com <mailto:zgu at redhat.com>
>             <mailto:zgu at redhat.com <mailto:zgu at redhat.com>>>>
>                                                 <mailto:zgu at redhat.com
>             <mailto:zgu at redhat.com>
>                      <mailto:zgu at redhat.com <mailto:zgu at redhat.com>>
>             <mailto:zgu at redhat.com <mailto:zgu at redhat.com>
>                      <mailto:zgu at redhat.com <mailto:zgu at redhat.com>>>
>                               <mailto:zgu at redhat.com
>             <mailto:zgu at redhat.com> <mailto:zgu at redhat.com
>             <mailto:zgu at redhat.com>>
>                      <mailto:zgu at redhat.com <mailto:zgu at redhat.com>
>             <mailto:zgu at redhat.com <mailto:zgu at redhat.com>>>>>
>                                        <mailto:zgu at redhat.com
>             <mailto:zgu at redhat.com> <mailto:zgu at redhat.com
>             <mailto:zgu at redhat.com>>
>                      <mailto:zgu at redhat.com <mailto:zgu at redhat.com>
>             <mailto:zgu at redhat.com <mailto:zgu at redhat.com>>>
>                               <mailto:zgu at redhat.com
>             <mailto:zgu at redhat.com> <mailto:zgu at redhat.com
>             <mailto:zgu at redhat.com>>
>                      <mailto:zgu at redhat.com <mailto:zgu at redhat.com>
>             <mailto:zgu at redhat.com <mailto:zgu at redhat.com>>>>
> 
>                                                 <mailto:zgu at redhat.com
>             <mailto:zgu at redhat.com>
>                      <mailto:zgu at redhat.com <mailto:zgu at redhat.com>>
>             <mailto:zgu at redhat.com <mailto:zgu at redhat.com>
>                      <mailto:zgu at redhat.com <mailto:zgu at redhat.com>>>
>                               <mailto:zgu at redhat.com
>             <mailto:zgu at redhat.com> <mailto:zgu at redhat.com
>             <mailto:zgu at redhat.com>>
>                      <mailto:zgu at redhat.com <mailto:zgu at redhat.com>
>             <mailto:zgu at redhat.com <mailto:zgu at redhat.com>>>>>>> wrote:
> 
>                                                      Up to now, there is
>             little
>                      visibility
>                               into how
>                                        metaspaces
>                                                 are used,
>                                                      and by whom.
> 
>                                                      This proposed
>             enhancement gives
>                      NMT the
>                               ability to
>                                        report
>                                                 metaspace
>                                                      usages on
>             per-classloader level,
>                      via a
>                               new NMT command
>                                                 "metadata"
> 
> 
>                                                      For example:
> 
>                                                      2496:
>                                                      Metaspaces:
>                                                         Metadata space:
>             reserved=              8192KB
>                                        committed=      5888KB
>                                                         Class    space:
>             reserved=           1048576KB
>                                        committed=       640KB
> 
>                                                      Per-classloader
>             metadata:
> 
>                                                      ClassLoader: for
>             anonymous class
>                                                         Metadata 
>               capacity=      5.00KB
>                               used=      1.16KB
>                                                 free=         3.84KB
>             waste=      0.05KB
>                                                         Class data
>             capacity=      1.00KB
>                               used=      0.59KB
>                                                 free=         0.41KB
>             waste=      0.00KB
> 
>                                                      ....
> 
>                                                      ClassLoader:
>             <bootloader>
>                                                         Metadata 
>               capacity=   5640.00KB
>                               used=   5607.42KB
>                                                 free=         32.58KB
>             waste=      0.46KB
>                                                         Class data
>             capacity=    520.00KB
>                               used=    500.94KB
>                                                 free=         19.06KB
>             waste=      0.02KB
> 
> 
>                                                      Bug:
>             https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>
>                      <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>>
>                             
>               <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>
>                      <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>>>
>                                               
>             <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>
>                      <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>>
>                             
>               <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>
>                      <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>>>>
>                                                               
>             <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>
>                      <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>>
>                             
>               <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>
>                      <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>>>
>                                               
>             <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>
>                      <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>>
>                             
>               <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>
>                      <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>>>>>
>                                                                   
>             <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>
>                      <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>>
>                             
>               <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>
>                      <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>>>
>                                               
>             <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>
>                      <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>>
>                             
>               <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>
>                      <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>>>>
>                                                               
>             <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>
>                      <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>>
>                             
>               <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>
>                      <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>>>
>                                               
>             <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>
>                      <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>>
>                             
>               <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>
>                      <https://bugs.openjdk.java.net/browse/JDK-8189688
>             <https://bugs.openjdk.java.net/browse/JDK-8189688>>>>>>
>                                                      Webrev:
>             http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>>
>                                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>>>
>                                                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>>
>                                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>>>>
>                                                                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>>
>                                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>>>
>                                                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>>
>                                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>>>>>
>                                                                         
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>>
>                                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>>>
>                                                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>>
>                                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>>>>
>                                                                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>>
>                                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>>>
>                                                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>>
>                                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>
>                     
>             <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html <http://cr.openjdk.java.net/~zgu/8189688/webrev.00/index.html>>>>>>
> 
>                                                      Test:
> 
>                                                       
>               hotspot_tier1_runtime,
>                      fastdebug and
>                               release on
>                                        x64 Linux.
> 
>                                                      Thanks,
> 
>                                                      -Zhengyu
> 
> 
> 
> 
> 
> 
> 
> 
> 


More information about the hotspot-runtime-dev mailing list