Hi Ram,
Noted, thank you for the response. I'd be happy to share my experiment.
32GB JVM 40 hour lifetime
https://gceasy.io/my-gc-report.jsp?p=YXJjaGl2ZWQvMjAyMi8wMi8yMy8tLTMyR0JHMUdDLS0xMS01Ny0yMA==&channel=API
48GB JVM 40 hour lifetime
https://gceasy.io/my-gc-report.jsp?p=YXJjaGl2ZWQvMjAyMi8wMi8yMy8tLTQ4R0JHMUdDLS0xMS01Ny00&channel=API
I have seen positive results so far and I'd like to share it. Kindly check the GC times, graphs, and the micrometrics when comparing both.
1. FGC: None
2. YGC Count: 32GB: 392, 48GB 298
As expected, reduction in YGC for the 48GB heap. Mixed collections were around the same.
3. Avg GC Pause Time: 32GB:208ms, 48GB: 303ms
Only increase in 93ms for the 48GB heap
4. Created bytes: 32GB: 4.88 tb, 48GB: 6.69 tb
Created bytes increased by 37%. This means the additional 16GB allocated is not wasted, our application is fully utilizing all the space. Checking the young gen peak it also shows that young gen is hitting its maximum allocation of 60%.
5. Total Pause Time: 32GB: 2 min 4 sec 590 ms, 48GB: 2 min 18 sec 370 ms.
Total pause time only 14s more for the 48GB heap, acceptable for our application.
6. Throughput: 32GB 99.914, 48GB 99.905
Reduction by 0.009, acceptable for our application
7. Longest Pause Time: Hard to tell from the graph as the longest GC in both instances were during the JVM startup. But all subsequent YGC were under 600s as the Avg GC Pause Time would tell above.
8. Avg creation rate: 32GB 35.16 mb/sec, 48GB 48.39 mb/sec
Increase by 37% for the 48GB heap. This is very good as we can now process 37% more transactions.
9. GC Causes
32GB:
- G1 Evacuation Pause: 438
- G1 Humongous Allocation: 47
- GCLocker Initiated GC: 10
48GB:
- G1 Evacuation Pause: 336
- G1 Humongous Allocation: 33
- GCLocker Initiated GC: 13
All areas are reduced with the 48GB heap. Our application is creating large objects so the G1RegionSize was set to 32MB for the 48GB heap, giving total of 1536 regions. Due to the bigger region size we saw less Humongous Allocations
As expected, larger heap would allow for more room in young gen and S0/S1, reducing the evacuation pause events.
The aim of my study is the opposite of your study. My aim is to eliminate all allocation/evacuation failures by giving eden/s0/s1 enough space, allowing objects to live its natural life and die in young generation without being promoted to old gen. This approach saves old generation for to-space exhaustion issues when young generation is completely filled, old generation will have lots of space to accommodate. It also shows that we are able to process a lot more customer transactions (37% increase) while only adding 97ms of average GC time. We are able to significantly reduce the chances of FGCs because old gen utilization is low since we now have a very low promotion rate.
I will continue to share my findings as we progress.
I took a look at the 117GB heap report, let me share my thoughts.
In my opinion it is very inefficient. Young Gen is capped at around 4GB, leaving 113GB for old gen. The heap is poorly utilized. Given the insane object creation rate of 1.03gb/s, this means young gen will fill in 4 seconds leading to a lot of promotions to old gen which is evident from the graphs. High promotion rate is the opposite of what we want as collections in old gen (mixed) are longer that young gen. Too many mixed gc and ygc would take place in a short period of time. While they may be short because of small young gen, the frequency will be high due to the creation rate leading to overall high total gc pause times effectively reducing throughput. Maybe this approach is one that is adopted but my study goes in the opposite direction.
Regards,
Stephen
Edit your Comment