[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-serviceability-dev
Subject:    Re: RFR: 8287135: Calculation of jmm_GetMemoryUsage is wrong [v5]
From:       Thomas Stuefe <stuefe () openjdk ! org>
Date:       2022-06-29 6:40:47
Message-ID: _Tie8F_4wQKMyJesfie8UfyUlCBfOVmOhL9Lc4Q_nhE=.e8cdbe87-3b66-4528-b95b-e35b3d5e35c5 () github ! com
[Download RAW message or body]

On Mon, 27 Jun 2022 08:15:01 GMT, Yi Yang <yyang@openjdk.org> wrote:

> > It seems that calculation of \
> > MemoryMXBean.getNonHeapMemoryUsage(jmm_GetMemoryUsage) is wrong. 
> > Currently, `NonHeapUsage=CodeCache+Metaspace(ClassTypeSpace+NonClassTypeSpace)+CompressedClassSpace(ClassTypeSpace)`
> >  
> > ==> CodeHeap 'non-nmethods' 1532544 (Used)
> > ==> CodeHeap 'profiled nmethods' 0
> > ==> CodeHeap 'non-profiled nmethods' 13952
> > ==> Metaspace 506696
> > ==> Compressed Class Space 43312
> > init = 7667712(7488K) used = 2096504(2047K) committed = 8454144(8256K) max = \
> > -1(-1K) 
> > In this way, getNonHeapMemoryUsage is larger than it ought to be, it should be \
> > `NonHeapUsage = CodeCache + Metaspace`.
> 
> Yi Yang has updated the pull request incrementally with one additional commit since \
> the last revision: 
> address @tstuefe's comments; remove unnecessary declaration

I think @iklam meant something somewhat different. Since we remove the class space \
bean, we now need to rewrite those tests using that bean.

Lets say we create the following whitebox APIs

- long WB_getClassSpaceUsage
- long WB_getClassSpaceCommitted

Maybe also (to be symmetric, and to not have to mix bean code and this code in \
                test/hotspot/jtreg/vmTestbase/metaspace/gc/MemoryUsageTest.java:
- long WB_getMetaSpaceUsage
- long WB_getMetaSpaceCommitted

Maybe also:
- boolean WB_usesClassSpace()
- long WB_classSpaceMax()
though these can easily be implemented using existing whitebox method (there is one \
to get VM flags, so you could get   `UseCompressedClassPointers` and \
`CompressedClassSpaceSize` instead.

Now:

- In test/hotspot/jtreg/vmTestbase/metaspace/gc/MemoryUsageTest.java, you don't use \
beans anymore but those functions. You'd rewrite "getUsed()" and "getCommitted()" to \
use the new whitebox functions.

- In metaspce/ShrinkGrowTest, the bean is only used to confirm that class space is \
active. You can use WB_usesClassSpace for that, or the value of \
"UseCompressedClassPointers" flag.

- In test/hotspot/jtreg/vmTestbase/vm/mlvm/indy/stress/gc/lotsOfCallSites/Test.java, \
we use Compressed Class Bean to get Compressed Class usage and maximum size. YHere, \
you would have to exchange `classMetadataPoolMXB.getUsage();` with \
`WB_getClassSpaceUsage()` and `classMetadataPoolMXB.getUsage();` with \
`CompressedClassSpaceSize`

----

Note that since this RFR really grew in complexity compared to what you wanted to do \
originally, I'd be fine with dropping it altogether. If we continue, I think above \
proposal is the simplest way to go.

src/hotspot/share/services/memoryPool.cpp line 188:

> 186: 
> 187: // Note, any NonHeap pools would be counted into Non-Heap memory by \
>                 MemoryMXBean.getNonHeapMemoryUsage.
> 188: // Make sure that it behaves as you expected if you want to add a new type of \
> NonHeap pool

This comment is somewhat cryptic. Behave like what?

src/hotspot/share/services/memoryPool.cpp line 189:

> 187: // Note, any NonHeap pools would be counted into Non-Heap memory by \
>                 MemoryMXBean.getNonHeapMemoryUsage.
> 188: // Make sure that it behaves as you expected if you want to add a new type of \
>                 NonHeap pool
> 189: MetaspacePool::MetaspacePool() :

Can you please add a comment like
"Accounts for Metaspace (both class space and non-class space).
 Max usage is MaxMetaspaceSize. Current usage includes prematurely freed blocks.
 As far as this API is concerned, CompressedClassSpaceSize is ignored."

test/hotspot/jtreg/vmTestbase/nsk/share/gc/gp/GarbageUtils.java line 53:

> 51:             ANY (),
> 52:             HEAP("Java heap space"),
> 53:             METASPACE("Metaspace");

This chance is wrong, I think. We still have class space OOMEs.

-------------

Changes requested by stuefe (Reviewer).

PR: https://git.openjdk.org/jdk/pull/8831


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic