[G1]Why run Full GC at System.gc() call?
stefan.johansson at oracle.com
stefan.johansson at oracle.com
Mon Aug 24 07:22:56 UTC 2020
Hi,
You are correct. When calling System.gc() with G1 a full GC is
scheduled. You can change this by running with the option:
-XX:+ExplicitGCInvokesConcurrent
Doing so will instead initiate a concurrent cycle by running a young
collection. There have been discussions if this should be the default
behavior for G1, but there are arguments both ways. I think the current
behavior is good, since it makes it really obvious this is an expensive
operation that we do not really encourage people to use.
One of the few good uses of System.gc() is when you know your
application doesn't suffer from doing garbage collections, for example,
you know you have a lot of dead objects and currently no requests you
have to handle. In this case a full collection is a better fit since it
will reclaim as much memory as possible, while the concurrent cycle will
only start reclaiming memory from the old generation in the mixed
collections that will follow.
I hope this helps,
Stefan
On 2020-08-23 19:54, Manavjeet Singh wrote:
> Hi!
> I was trying to understand what happens when System.gc() is called from a
> java application with G1 as the garbage collector. I understood
> G1CollectedHeap::collect() is called and then
> G1CollectedHeap::try_collect().
> But going through the code of G1CollectedHeap::try_collect() and using the
> "-verbose" flag while running the java application, I realised only a full
> GC will always be scheduled.
> Can you please help me understand this design decision or if I am wrong in
> understanding it.
> Thanks!
> Manavjeet Singh
>
More information about the hotspot-gc-dev
mailing list