Hi Kim,
On 08/15/2016 05:15 AM, Kim Barrett wrote:
>I have a feeling that these pauses are now unnecessary. Will try to check with
some experiments…
I found that the DirectBufferAllocTest will sometimes fail if the pauses are
taken out.
I think what’s going on is that the multiple threads are competing for
resources, and
some threads in that test lose out if all of them are waiting and wake up at
the same
time. The exponentially increasing back-off scatters the threads enough for
that to
become very unlikely, though with sufficiently bad luck… But I think the current
implementation could also fail that test with similarly bad luck. It just
requires*very*
bad luck, so we’re not seeing it as a problem. And that test is a pretty
extreme stress
test.
I get the same results when experimenting with this. Another option
would be to enclose the whole logic of (retrying reservation while
waiting for Reference processing progress followed by System.gc() and
another round of reservation retries while waiting for Reference
processing) into a synchronized block so that multiple reservation
threads could not barge for reservations. This approach works and might
even be triggering less System.gc() rounds, but it is not much better
than current approach.
Regards, Peter