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

Zhengyu Gu zgu at redhat.com
Mon Oct 23 15:03:07 UTC 2017


> 
> 
> 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  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 :-)


>         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>". 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.

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>>> 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>>
>              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>>
> 
>              Test:
> 
>                 hotspot_tier1_runtime, fastdebug and release on x64 Linux.
> 
>              Thanks,
> 
>              -Zhengyu
> 
> 
> 
> 


More information about the hotspot-runtime-dev mailing list