RFR: 8267703: runtime/cds/appcds/cacheObject/HeapFragmentationTest.java crashed with OutOfMemory [v2]

Stefan Johansson sjohanss at openjdk.java.net
Tue Jun 1 09:23:21 UTC 2021

On Tue, 1 Jun 2021 09:16:43 GMT, Stefan Johansson <sjohanss at openjdk.org> wrote:

>> Please review this change to lower fragmentation when heap usage is low.
>> **Summary**
>> The above test case fails because the G1 Full GC fails to compact the single used region below the needed threshold. In this case the region needs to be compacted below region index 400 to be able to fit the large array. The reason this fails is that the full GC uses a lot of parallel workers and if the system is under load it is possible that the worker finding the region to compact hasn't been able to claim any regions low enough in the heap to compact the live objects to.
>> To fix this we can add a third thing to consider in the code calculating the number of workers to use for a given compaction. So far we only look at keeping the waste down and using the default adaptive calculations. If we also consider how much is used we can get a lower worker count in cases like this and that will make it much more likely to succeed with the compaction. In this case it will guarantee it since there is a single region used, so there will be only one worker and then it will compact the region to the bottom of the heap.
>> **Testing**
>> Manual verification that this will cause these collections to only use a single worker. Also currently running some performance regression testing to make sure this doesn't cause any big regressions.
> Stefan Johansson has updated the pull request incrementally with one additional commit since the last revision:
>   Revised approach.

I did some more analysis of the regression in GC time and found that the bulk of the regression was caused by not using all workers for clearing of bitmaps before and after the actual collection. To avoid this I now temporarily increase the number of workers when clearing the bitmap. 

I also changed the the limiting to only look at `heap->num_used_regions()` as mentioned above.


PR: https://git.openjdk.java.net/jdk/pull/4225

More information about the hotspot-gc-dev mailing list