Min vs Max vs Soft Memory Limits
per.liden at oracle.com
Mon May 24 12:25:12 UTC 2021
On 5/19/21 4:57 PM, Mike Rettig wrote:
> On Wed, May 19, 2021 at 2:53 AM Per Liden <per.liden at oracle.com
> <mailto:per.liden at oracle.com>> wrote:
> On 5/13/21 3:24 AM, Mike Rettig wrote:
> > Ideally ZGC would provide a set of options so that it knows the
> > priorities of the application. With G1, this is easy. You specify
> > min and max memory and a max pause time target. G1 will adjust
> > accordingly to meet those goals. ZGC needs something similar to
> G1's max
> > pause time. Since the pause time is consistently below 1ms, the
> > time target doesn't make sense. Maybe ZGC needs a pause frequency
> That's essentially what you have today in ZGC, with Xmx and
> SoftMaxHeapSize. These options control the heap size, which directly
> correlates with GC frequency.
> Finding the right SoftMaxHeapSize is tedious. It's going to be different
> based on the hardware and load. Also the number will change as features
> are added to the application. It would be much easier if ZGC could be
> configured based on the acceptable limits (min memory, max memory, pause
> target). Does ZGC use the min memory for anything? IME ZGC immediately
> uses all the memory up to max.
-Xms guides how much of the heap ZGC should never uncommit.
> > My goal with ZGC is to pause as infrequently as possible. I think
> > is a common goal for developers. ZGC benchmarks often compare the
> > and max pause times compared to G1 but in some cases the overall
> > time for ZGC is greater than G1 because it pauses more frequently.
> Are you sure you're looking at the right numbers here? If you're on JDK
> 16, then pauses are normally ~50us, so that means ZGC would run GC
> cycles something like 1000 times more often then G1, which doesn't
> right. Did you perhaps get the accumulated GC time from the
> GarbageCollectorMXBean? If so, that doesn't show you the accumulated GC
> pasuse times, but the accumulated time for complete GC cycles. Btw,
> was changed in JDK 17 (see https://github.com/openjdk/jdk/pull/3483
> I am using jdk 16 and I get my numbers from the safepoints in the GC
> log. Pauses average 100-200us for each stage (ZMarketStart, ZMarkEnd,
> ZRelocateStart). If an average collection takes ~500us for all 3 stages,
> then it can quickly approach the collection time for G1 if the typical
> G1 pause is 3ms.
Ok, the typical pause profiles I had in mind was 150us (50us x 3) for
ZGC vs. 150ms for G1.
> > Recently I've disabled the proactive pauses. Why bother to do a
> > collection when the heap is 30% full when it can done in the same
> > of time when the heap is at 80%?
> If you get proactive GC cycles, it means you application is more or
> idle, or at least it's not allocating very much. Proactive GC cycles
> happen for two main reasons:
> 1) Avoid expanding the heap, since an (almost) idle application doesn't
> need that memory.
> 2) Even if the application is idle for periods of time, you still want
> Finalizers to run.
> What are the thresholds for an app being idle? IME ZGC appears to be
> very aggregresive for proactive pauses. I know the app isn't completely
> idle. I think there is an assumption that ZGC collections are
> essentially free so you might as well do them frequently. I still
> consider them very costly. Stopping user threads should only be done
> when absolutely necessary.
ZGC doesn't assume proactive GCs are free. It aims to only do a
proactive GC if the estimated application throughput drops by at most 1%
> Does G1 do proactive pauses?
> G1 pause times increase with the size of
> the heap so proactive pauses could help G1 stay within the pause target.
More information about the zgc-dev