PING: RFR: 8217432: MetaspaceGC::_capacity_until_GC exceeds MaxMetaspaceSize

Yasumasa Suenaga suenaga.yasumasa at nttcom.co.jp
Fri Jan 25 02:35:40 UTC 2019


PING: Could you review this?


Yasumasa


On 2019/01/21 17:52, Yasumasa Suenaga wrote:
> Hi all,
> 
> I filed this issue to JBS:
>    https://bugs.openjdk.java.net/browse/JDK-8217432
> 
> I investigated it, and I found that `minimum_desired_capacity` and
> `maximum_desired_capacity` in `MetaspaceGC::compute_new_size()`
> might exceed MaxMetaspaceSize.
> They shouldn't exceed MaxMetaspaceSize.
> 
> I uploaded webrev for this bug. Could you review it?
>    http://cr.openjdk.java.net/~ysuenaga/JDK-8217432/webrev.00/
> 
> This change has passed all tests on submit repo, :vmTestbase_vm_metaspace,
> and :vmTestbase_nsk_sysdict jtreg tests.
> 
> 
> Thanks,
> 
> Yasumasa
> 
> 
> On 2019/01/15 18:30, Yasumasa Suenaga wrote:
>> PING: Did you read my email?
>>
>> I wrote the problem and suggested fix in it.
>> Please tell me if you have question(s).
>>
>> I can file it to JBS if it is a bug.
>>
>>
>> Thanks,
>>
>> Yasumasa
>>
>>
>> On 2019/01/10 18:02, Yasumasa Suenaga wrote:
>>> Hi all,
>>>
>>> I'm Yasumasa Suenaga (OpenJDK reviewer: ysuenaga)
>>>
>>> My customer uses OpenJDK 8u131 with following commandline arguments:
>>>
>>>    -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80
>>>    -XX:CompressedClassSpaceSize=128m -Xms4500m -Xmx4500m
>>>    -XX:MaxMetaspaceSize=256m -Xmn=768m -XX:MaxTenuringThreshold=15
>>>    -XX:OnOutOfMemoryError="/bin/kill -ABRT %p"
>>>    -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseConcMarkSweepGC
>>>
>>> Their system has encountered OutOfMemoryError which is caused by Metaspace.
>>>
>>> I checked core image which was collected by OnOutOfMemoryError, and I saw
>>> strange values in it as below:
>>>
>>> -------------------
>>> (gdb) p Metaspace::_space_list->_reserved_words
>>> $67 = 31195136
>>> (gdb) p Metaspace::_class_space_list->_reserved_words
>>> $68 = 16777216
>>> (gdb) p MetaspaceGC::_capacity_until_GC
>>> $75 = 448045056
>>> -------------------
>>>
>>> MaxMetaspaceSize and CompressedClassSpaceSize seem to affect Metaspace.
>>> However, MetaspaceGC::_capacity_until_GC exceeds MaxMetaspaceSize.
>>> Is it correct?
>>>
>>> I checked used and committed memory from the core, they seem to be enough
>>> to allocate new objects as below:
>>>
>>> -------------------
>>> (gdb) p MetaspaceAux::_used_words
>>> $62 = {1742673, 17905981}
>>> (gdb) p Metaspace::_space_list->_committed_words
>>> $64 = 30932992
>>> (gdb) p Metaspace::_class_space_list->_committed_words
>>> $65 = 2621440
>>> -------------------
>>>
>>> I guess the cause of OOME is invalid value in _capacity_until_GC.
>>> _capacity_until_GC is used for expanding / shrinking Metaspace.
>>> However it is not checked when it changes.
>>>
>>> So I think we need to add the code to check it as below:
>>> (The change is for jdk/jdk)
>>> -------------------
>>> diff -r 32c6cc430526 src/hotspot/share/memory/metaspace.cpp
>>> --- a/src/hotspot/share/memory/metaspace.cpp    Wed Jan 09 22:59:49 2019 +0100
>>> +++ b/src/hotspot/share/memory/metaspace.cpp    Thu Jan 10 17:56:55 2019 +0900
>>> @@ -143,6 +143,10 @@
>>>       new_value = align_down(max_uintx, Metaspace::commit_alignment());
>>>     }
>>>
>>> +  if (new_value > MaxMetaspaceSize) {
>>> +    return false;
>>> +  }
>>> +
>>>     size_t prev_value = Atomic::cmpxchg(new_value, &_capacity_until_GC, old_capacity_until_GC);
>>>
>>>     if (old_capacity_until_GC != prev_value) {
>>> -------------------
>>>
>>> _capacity_until_GC is set to MaxMetaspaceSize at MetaspaceGC::initialize(),
>>> and it set to committed size or MetaspaceSize at MetaspaceGC::post_initialize().
>>> So I guess max value of it is MaxMetaspaceSize.
>>>
>>>
>>> What do you think?
>>> If it is a bug, I will file JBS and send review request.
>>>
>>>
>>> Thanks,
>>>
>>> Yasumasa
>>>
>>>
>>>
>>>


More information about the hotspot-gc-dev mailing list