RFR(S) 8189688: NMT: Report per-class load metadata information
Thomas Stüfe
thomas.stuefe at gmail.com
Sat Oct 28 05:46:57 UTC 2017
On Fri, Oct 27, 2017 at 10:34 PM, Zhengyu Gu <zgu at redhat.com> wrote:
>
> 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
>
>
Yes, this is not trivial. I hacked it in (because I wanted to see your
output at the end of my tests) and had to disable the assert. I never ran
into problems. Should java threads not all be stopped at that point?
But this also can be done in a follow up issue.
Thanks, Thomas
>
> 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/Delegatin
>> gClassLoader
>> 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/~z
>> gu/8189688/webrev.01/index.html <http://cr.openjdk.java.net/~z
>> gu/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/~z
>> gu/8189688/webrev.01/index.html <http://cr.openjdk.java.net/~z
>> gu/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/~z
>> gu/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/~z
>> gu/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/~z
>> gu/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/~z
>> gu/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
>
>
More information about the hotspot-runtime-dev
mailing list