RFR: JDK-8304954: SegmentedCodeCache fails when using large pages [v4]
Thomas Stuefe
stuefe at openjdk.org
Mon Jul 24 13:15:46 UTC 2023
On Mon, 24 Jul 2023 11:46:54 GMT, Damon Fenacci <dfenacci at openjdk.org> wrote:
>> # Issue
>>
>> When large pages are enabled and segmented code cache is used, the VM tries to use one page for each segment. If the amount of reserved code cache is limited, this can make the total size of the code cache bigger than the reserved size, which in turn makes the VM fail, claiming that there is not enough space (e.g. this happens when running `java -XX:+UseLargePages -XX:+SegmentedCodeCache -XX:InitialCodeCacheSize=2g -XX:ReservedCodeCacheSize=2g -XX:LargePageSizeInBytes=1g -Xlog:pagesize*=debug -version`).
>> This behaviour is not correct as the VM should fall back and try with a smaller page size (and print a warning).
>>
>> # Solution
>>
>> When reserving heap space for code cache we give a minimum of 8 pages. Since the page size is already calculated right before for segment sizes, it is saved and passed as an argument instead.
>>
>> https://github.com/openjdk/jdk/blob/67fbd87378a9b3861f1676977f9f2b36052add29/src/hotspot/share/code/codeCache.cpp#L315
>>
>> Additionally a warning is printed if large pages are enabled and we end up using a smaller page sizes for code caching.
>>
>> # Test
>>
>> The regression test runs a new VM with `-XX:+UseLargePages -XX:LargePageSizeInBytes=1g`. The `main` method then checks if the two flags have been "taken". If so, another process is started that checks for a specific output, otherwise the test passes (i.e. the current system doesn't allow 1GB large pages)
>
> Damon Fenacci has updated the pull request incrementally with one additional commit since the last revision:
>
> JDK-8304954: merge ifs checking when to print warning
src/hotspot/share/code/codeCache.cpp line 322:
> 320: byte_size_in_exact_unit(LargePageSizeInBytes), exact_unit_for_byte_size(LargePageSizeInBytes),
> 321: byte_size_in_exact_unit(ps), exact_unit_for_byte_size(ps));
> 322: log_warning(codecache)("%s", msg);
Also, no need to print into a temp buffer. log_xxx() accepts var-args, so you can pass the format string + args directly.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/14903#discussion_r1272246036
More information about the hotspot-compiler-dev
mailing list