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