Why does G1GC do Full GC when it only needs 40 bytes?

YU ZHANG yu.zhang at oracle.com
Mon Jun 9 21:04:00 UTC 2014


Thanks for the log.  Please see my comments in line

Thanks,
Jenny

On 6/9/2014 7:29 AM, Martin Makundi wrote:
> 1. "-XX:InitiatingHeapOccupancyPercent=0 should trigger concurrent gcs 
> too much. "
>
> We use InitiatingHeapOccupancyPercent to make sure the gc is always 
> active. How is InitiatingHeapOccupancyPercent related to Full GC:s?
InitiatingHeapOccupancyPercentdetermines when concurrent gcs are 
triggered, so that we can do mixed gc.  In your case,the heap usage 
after full gc is 15.5g, you can try to set this to 60.

But this is not the reason why you get full gcs.

The mixed gc should be able to clean more.
In the gc log, there are a lot of messages like:
1. "750.559: [G1Ergonomics (CSet Construction) finish adding old regions 
to CSet, reason: reclaimable percentage not over threshold, old: 38 
regions, max: 379 regions, reclaimable: 3172139640 bytes (9.99 %), 
threshold: 10.00 %]"

the 10% threshold is controlled by -XX:G1HeapWastePercent=10.  You can 
try 5% so that more mixed gcs will happen after the concurrent cycles.

2. Depending on if target pause time =500 is critical.
Currently, the gc pause is > 500ms.  If keeping gc pause <500 is 
critical, you need to decrease Eden size.
We need to take another look at the gc logs then.

If you can relax the target pause time, please increase it, so that we 
do not see too many
" 5099.012: [G1Ergonomics (CSet Construction) finish adding old regions 
to CSet, reason: predicted time is too high, predicted time: 3.34 ms, 
remaining time: 0.00 ms, old: 100 regions, min: 100 regions]", maybe 
even to try,  -XX:G1MixedGCCountTarget=<4>. This determines the minimum 
old regions added to CSet

This workload has high reference process time.  It is good that you have 
enabled parallel reference processing.   It seems the parallel work is 
distributed among the 13 gc threads well.  Though the work termination 
time is high.  If you are not cpu bound, you can try to increase the gc 
threads to 16 using -XX:ParallelGCThreads=16, ASSUMING you are not cpu 
bound, your system has 20-cpu threads?

There are a lot of system cpu activities, which might contribute to 
longer gc pause.  I used to see people reported this is due to logging.  
Not sure if this applies to your case.
>
> 2. "What is the jdk version?
>
> java version "1.7.0_55"
> Java(TM) SE Runtime Environment (build 1.7.0_55-b13)
> Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)
>
>
> 3. Can you share the gc log?"
>
> Log is available at 81.22.250.165/log <http://81.22.250.165/log>
>
> 4. I wonder if it is possible to have mixed set of 
> different/automatically varying  sizes of G1HeapRegionSize's small for 
> smaller objects and larger for larger objects?
Currently we do not have mixed region size.
>
>
> **
> Martin
>
>
> 2014-06-07 11:03 GMT+03:00 Martin Makundi 
> <martin.makundi at koodaripalvelut.com 
> <mailto:martin.makundi at koodaripalvelut.com>>:
>
>     Why does G1GC do Full GC when it only needs only 40 bytes?
>
>     Is there a way to tune this so that it would try to free up "some"
>     chunk of memory and escape the full gc when enough memory has been
>     freed? This  would lower the freeze time?
>
>     See logs:
>
>      [Times: user=12.89 sys=0.16, real=1.25 secs]
>     2014-06-06T17:11:48.727+0300: 34022.631: [GC
>     concurrent-root-region-scan-start]
>     2014-06-06T17:11:48.727+0300: 34022.631: [GC
>     concurrent-root-region-scan-end, 0.0000180 secs]
>     2014-06-06T17:11:48.727+0300: 34022.631: [GC concurrent-mark-start]
>      34022.632: [G1Ergonomics (Heap Sizing) attempt heap expansion,
>     reason: allocation request failed, allocation request: 40 bytes]
>      34022.632: [G1Ergonomics (Heap Sizing) expand the heap, requested
>     expansion amount: 8388608 bytes, attempted expansion amount:
>     8388608 bytes]
>      34022.632: [G1Ergonomics (Heap Sizing) did not expand the heap,
>     reason: heap expansion operation failed]
>     {Heap before GC invocations=1867 (full 1):
>      garbage-first heap   total 31457280K, used 31453781K
>     [0x00007f1724000000, 0x00007f1ea4000000, 0x00007f1ea4000000)
>       region size 8192K, 0 young (0K), 0 survivors (0K)
>      compacting perm gen  total 524288K, used 166271K
>     [0x00007f1ea4000000, 0x00007f1ec4000000, 0x00007f1ec4000000)
>        the space 524288K,  31% used [0x00007f1ea4000000,
>     0x00007f1eae25fdc8, 0x00007f1eae25fe00, 0x00007f1ec4000000)
>     No shared spaces configured.
>     2014-06-06T17:11:48.728+0300: 34022.632: [Full GC 29G->13G(30G),
>     47.7918670 secs]
>
>
>     Settings:
>
>     -server -XX:InitiatingHeapOccupancyPercent=0 -Xss4096k
>     -XX:MaxPermSize=512m -XX:PermSize=512m -Xms20G -Xmx30G -Xnoclassgc
>     -XX:-OmitStackTraceInFastThrow -XX:+UseNUMA
>     -XX:+UseFastAccessorMethods -XX:ReservedCodeCacheSize=128m
>     -XX:-UseStringCache -XX:+UseGCOverheadLimit -Duser.timezone=EET
>     -XX:+UseCompressedOops -XX:+DisableExplicitGC -XX:+AggressiveOpts
>     -XX:CMSInitiatingOccupancyFraction=70 -XX:+ParallelRefProcEnabled
>     -XX:+UseAdaptiveSizePolicy -XX:MaxGCPauseMillis=500 -XX:+UseG1GC
>     -XX:G1HeapRegionSize=8M -XX:GCPauseIntervalMillis=10000
>     -XX:+PrintGCDetails -XX:+PrintHeapAtGC
>     -XX:+PrintAdaptiveSizePolicy -XX:+PrintGCDateStamps -XX:+PrintGC
>     -Xloggc:gc.log
>
>
>
>
> _______________________________________________
> hotspot-gc-use mailing list
> hotspot-gc-use at openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/hotspot-gc-use

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-gc-use/attachments/20140609/34eab789/attachment.html>


More information about the hotspot-gc-use mailing list