RFR 8220238 : Enhancing j.l.Runtime/System::gc specification with an explicit 'no guarantee' statement
Peter Levart
peter.levart at gmail.com
Sun Jun 2 07:21:36 UTC 2019
On 5/31/19 7:24 PM, Roger Riggs wrote:
> Hi Martin,
>
> True, calling System.gc() and then checking for its hoped-for/expected
> side-effects is the norm.
> But its robustness depends on a combination of gc implementation
> behavior and
> the particular side-effect expected: allocation, reference processing,
> etc.
>
> Roger
>
> On 05/30/2019 01:30 PM, Martin Buchholz wrote:
>> If you are calling System.gc() for correctness (e.g. in a test), it
>> is probably because some sort of finalization is being triggered.
>> And that happens in some Java thread (e.g. Reference Handler) that
>> System.gc() has no control over. So in practice, users need to call
>> System.gc() and then wait for subsequent reference processing somehow.
>
...there is an internal API
(java.lang.ref.Reference#waitForReferenceProcessing) and a usage of it
(java.nio.Bits#reserveMemory) where it is hoped that there is a "happens
before" between making the newly discovered and cleared Reference(s)
available for enqueue-ing/processing (in Reference Handler thread) and
System.gc() returning. In such case, there is a minimum possible latency
between requesting System.gc() and actual processing of Reference(s)
such that there is no Thread.sleep() involved. But there's also delay
based fallback in case the "effort" by System.gc() is not synchronous...
So if some (futre) GC(s) make System.gc() method (partly) asynchronous,
the above usage will still work, but perhaps with more latency when
native memory is exhausted.
Regards, Peter
More information about the core-libs-dev
mailing list