Excessive "GC" memory area size [was: Re: Determining "GC" memory area size]
Zhengyu Gu
zgu at redhat.com
Wed Dec 13 15:16:10 UTC 2017
Hi Glyn,
On 12/13/2017 09:35 AM, Glyn Normington wrote:
> Thanks Zhengyu! That got me quite a bit further.
>
> The NMT virtual memory map showed the mmap portion of GC space
> consisting of:
> * the two marking bitmaps you mentioned previously, each 1/64 of heap size.
> * a mark stack of 32 MB which is 8* MarkStackSize (but which could grow
> to 8* MarkStackSizeMax or 128 MB).
> * three 700 KB areas, although I'm not sure what these are used for or
> how to predict their total size.
>
> This leaves the malloc portion of GC space "17615KB #2312" which I think
> was due 2312 calls to malloc. Again, not sure what these are used for or
> how to predict their total size except that I presume they include the
> task queues you mentioned previously.
Can you try on JDK10? it has enhancement [1] which can show what memory
allocation is for, on each allocation site.
[1] https://bugs.openjdk.java.net/browse/JDK-8139673
Thanks,
-Zhengyu
>
> Outstanding questions:
> 1. Is the mmap space which consumed three 700 KB areas above fixed,
> proportional to heap size, or what?
> 2. How many task queues are there for a given number of GC threads?
> 3. Task queues can overflow, so what is the maximum space each one can
> occupy?
> 4. Of the malloc space not consumed by task queues, how much is fixed
> and how much proportional to heap size, number of GC threads, etc.?
>
> The aim is to calculate a reasonable estimate of an upper bound for GC
> space consumption.
>
> Raw data for anyone who's interested:
> https://gist.github.com/glyn/a3bd944eb2943f4f5a98b5ac712efeb6
>
> Regards,
> Glyn
>
> On Wed, Dec 13, 2017 at 12:27 PM, Zhengyu Gu <zgu at redhat.com
> <mailto:zgu at redhat.com>> wrote:
>
> Hi Glyn,
>
> You can run NMT with detail tracking
> (-XX:NativeMemoryTracking=detail) then use jcmd (jcmd <pid>
> VM.native_memory detail) to find out all allocations for GC.
>
> For example:
>
> [0x00007f9fba000000 - 0x00007f9fbc000000] reserved 32768KB for *GC* from
> [0x00007fa0130260ef] G1CMMarkStack::resize(unsigned long)+0x8f
> [0x00007fa01302cf62]
> G1ConcurrentMark::G1ConcurrentMark(G1CollectedHeap*,
> G1RegionToSpaceMapper*, G1RegionToSpaceMapper*)+0x782
> [0x00007fa01300e94b] G1CollectedHeap::initialize()+0x62b
> [0x00007fa013ca26af] universe_init()+0x6f
>
> [0x00007f9fba000000 - 0x00007f9fbc000000] committed 32768KB
> from
> [0x00007fa01302610d] G1CMMarkStack::resize(unsigned
> long)+0xad
> [0x00007fa01302cf62]
> G1ConcurrentMark::G1ConcurrentMark(G1CollectedHeap*,
> G1RegionToSpaceMapper*, G1RegionToSpaceMapper*)+0x782
> [0x00007fa01300e94b] G1CollectedHeap::initialize()+0x62b
> [0x00007fa013ca26af] universe_init()+0x6f
>
>
> [0x00007fa012ac5395] ArrayAllocator<unsigned
> long>::allocate(unsigned long, MemoryType)+0x245
> [0x00007fa012ac5448] unsigned long*
> BitMap::reallocate<CHeapBitMapAllocator>(CHeapBitMapAllocator
> const&, unsigned long*, unsigned long, unsigned long)+0x38
> [0x00007fa012ac509f] CHeapBitMap::initialize(unsigned long)+0x6f
> [0x00007fa013093b9c]
> G1PageBasedVirtualSpace::G1PageBasedVirtualSpace(ReservedSpace,
> unsigned long, unsigned long)+0x13c
> (malloc=129KB *type=GC* #6)
>
> Thanks,
>
> -Zhengyu
>
>
>
>
> On 12/13/2017 04:39 AM, Glyn Normington wrote:
>
> On the basis of the reply below, we have been thinking of
> estimating the
> size of the "GC" memory area as a little more than (1/32) *
> heapSize.
> However, running `java -version` with a 350m heap results in
> "GC" memory as
> reported by NMT of over 17% of the heap size, so this estimate
> is way out.
>
> If the analysis below is accurate, then given the number of GC
> threads is
> 10 (ParallelGCThreads=8, ConcGCThreads=2), can there be many more
> taskqueues than GC threads?
>
> Or is there another explanation for the additional "GC" size?
>
> Thanks,
> Glyn
>
> [1]
> https://gist.github.com/glyn/f10b7dea77994ad0f5589a416fbc77fe
> <https://gist.github.com/glyn/f10b7dea77994ad0f5589a416fbc77fe>
>
> On Fri, Nov 10, 2017 at 7:05 PM, Zhengyu Gu <zgu at redhat.com
> <mailto:zgu at redhat.com>> wrote:
>
> Hi Glyn,
>
>
> Can anyone here tell me how the GC memory area size is
> determined? If
> there
> is documentation, so much the better as we'd prefer not
> to depend on code
> details that might flux arbitrarily.
>
>
> GC memory is mainly data structures used by GC runtime. It
> can be varied
> by collector used, size of the Java heap, the number of GC
> threads and etc.
> and, of course, the application itself.
>
> Some are *fixed* costs, which can be estimated. E.g. two
> marking bitmaps
> used by G1, each costs 1/64 of heap size (assuming default
> object
> alignment).
>
> Some are *semi-fixed*, e.g. taskqueue's fixed cost is about
> 1M for each
> queue on 64-bits VM, but it can overflow. And the number of
> task queues is
> proportional to the number of GC threads.
>
> Then there are factors from application itself, such as
> object mutation
> rate, inter-generation/region references, etc.
>
>
> I don't see a single formula for estimating GC memory size.
> If you are
> using G1, the biggest overhead comes from 2 bitmaps (1/32 *
> heap size).
>
> Thanks,
>
> -Zhengyu
>
>
>
>
>
>
>
>
>
> --
> Regards,
> Glyn
More information about the hotspot-dev
mailing list