Hi,

On 09.03.20 11:32, Thomas Schatzl wrote:
Hi,

On 08.03.20 06:01, Eugeniu Rabii wrote:
Hello,

I have a very simple program that constantly allocates some byte arrays (of 2 MB) each (running with the latest jdk-13). I run it with :

[...]

So the next cycle will have 9 Eden Regions and 2 Survivor ones (at least this is how I read the source code of where this is logged)

The nine eden regions are estimates based on pause time and some factors like estimated allocation rate. The two survivor ones are actually survivor regions allowed in the current GC (allowed survivor region length is always determined at the start of GC). It should probably read

Survivor regions: 0(2)->1

In this case the limit for entire young gen is G1MaxNewSizePercent, which by default is 60%; 60% of 20M is 12M, which is distributed across Survivor and Eden according to SurvivorRatio (=8).

Note that in my local runs I always get

Eden regions: 1->0(10)
Survivor regions: 0->0(2)

In the stable state, that is, after initial allocations in young gen by the runtime have been moved into old gen.

[0.076s][debug][gc,heap           ] GC(2) Heap before GC invocations=2 (full 0): garbage-first heap   total 20480K, used 7148K [0x00000007fec00000, 0x0000000800000000) [0.076s][debug][gc,heap           ] GC(2)   region size 1024K, 2 young (2048K), 1 survivors (1024K)

How come 2 young, 1 survivors? When the previous cycle said 9 Eden, 2 Survivor.

Humongous allocations can make initial estimations about young gen size obsolete.

I.e. the humongous allocations (directly into old gen) made old gen occupancy cross the current threshold to start old gen reclamation. Otherwise the humongous objects would have filled up the entire heap, causing full gc.


And actually answering the question: The number of young regions at the time of GC (e.g. "2") depend on when these extra GCs occur, i.e. how full eden/survivor were at that time.

The GC log also tells you that the root cause for the GCs has been a humongous allocation, i.e.

[info][gc,start] GC(xyz) Pause Young (Concurrent Start) (G1 Humongous Allocation)

Other log output before that (with the settings you gave) told you that the reason for the "concurrent cycle request" (read: gc) has been old gen occupancy being higher than a threshold, e.g.

[...][gc,ergo,ihop] Request concurrent cycle initiation (occupancy higher than threshold) occupancy: ...B allocation request: ...B threshold ...B (45.00) source: concurrent humongous allocation [...][gc,ergo] Request concurrent cycle initiation (requested by GC cause). GC cause: G1 Humongous Allocation

I.e. the humongous objects caused the gc in order to try to clean them out from old gen.

Thanks,
  Thomas
_______________________________________________
hotspot-gc-use mailing list
hotspot-gc-use@openjdk.java.net
https://mail.openjdk.java.net/mailman/listinfo/hotspot-gc-use

Reply via email to