RFR: 8257230: assert(InitialHeapSize >= MinHeapSize) failed: Ergonomics decided on incompatible initial and minimum heap sizes

Jie Fu jiefu at openjdk.java.net
Mon Nov 30 14:41:56 UTC 2020


On Mon, 30 Nov 2020 13:52:43 GMT, Stefan Johansson <sjohanss at openjdk.org> wrote:

>> Hi all,
>> 
>> Ergonomics for InitialHeapSize can be broken if the memory resource is limited by the administrator.
>> For example, this assert [1] fired on our testing boxes.
>> 
>> It can be reproduced by the following two steps on Linux-64:
>>   1) ulimit -v 8388608
>>   2) java -XX:MinHeapSize=5g -version
>> The reason was that limit_by_allocatable_memory() [2] returns a value less than MinHeapSize.
>> 
>> One more important fact is that this bug can be more common on Linux-32 systems.
>> Since the virtual memory is limited to 3800M [3] on Linux-32, it can be always reproduced when MinHeapSize > 1900M.
>> 
>> Testing:
>>   - tier1 ~ tier3 on Linux/x64
>> 
>> Thanks.
>> Best regards,
>> Jie
>> 
>> [1] https://github.com/openjdk/jdk/blob/master/src/hotspot/share/gc/shared/gcArguments.cpp#L96
>> [2] https://github.com/openjdk/jdk/blob/master/src/hotspot/share/runtime/arguments.cpp#L1907
>> [3] https://github.com/openjdk/jdk/blob/master/src/hotspot/os/posix/os_posix.cpp#L567
>
> src/hotspot/share/runtime/arguments.cpp line 1909:
> 
>> 1907:       reasonable_initial = limit_by_allocatable_memory(reasonable_initial);
>> 1908: 
>> 1909:       FLAG_SET_ERGO(InitialHeapSize, MAX2((size_t)reasonable_initial, MinHeapSize));
> 
> I'm not sure this is a good fix, this would violate the limit set by:
> `limit_by_allocatable_memory(reasonable_initial);`
> 
> Wouldn't the proper fix be to make sure that MinHeapSize is also limited by what's allowed to allocate?

The change just follows what is done for MaxHeapSize.

MaxHeapSize is limited by reasonable_max = limit_by_allocatable_memory(reasonable_max) [1].
But it will be set to MAX2(reasonable_max, (julong)MinHeapSize) [2] if MinHeapSize is set. 

What do you think?

[1] https://github.com/openjdk/jdk/blob/master/src/hotspot/share/runtime/arguments.cpp#L1876
[2] https://github.com/openjdk/jdk/blob/master/src/hotspot/share/runtime/arguments.cpp#L1885

-------------

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


More information about the hotspot-gc-dev mailing list