RFR[XS] 8210043 Invalid assert(HeapBaseMinAddress > 0) in ReservedHeapSpace::initialize_compressed_heap

Jiangli Zhou jiangli.zhou at oracle.com
Tue Aug 28 22:18:08 UTC 2018


On 8/28/18 2:30 PM, Ioi Lam wrote:

> Hi Jiangli,
>
>
> I think the current code is pretty self-explanatory -- we will try to 
> map at any arbitrary address specified by the user, but there's no 
> guarantee that it will succeed.
>
> I don't think there's need to specifically talk about 
> HeapBaseMinAddress==0, as the user might just as well specify 
> HeapBaseMinAddress=12345678 and that doesn't affect the logic.
>
>   // Attempt to alloc at user-given address.
>   if (!FLAG_IS_DEFAULT(HeapBaseMinAddress)) {
>     try_reserve_heap(size + noaccess_prefix, alignment, large, 
> aligned_heap_base_min_address);
>     if (_base != aligned_heap_base_min_address) { // Enforce this 
> exact address.
>       release();
>     }
>   }
For any non-zero value, it is aligned up to the heap alignment and the 
VM tries to reserve at the requested address when possible. For 0 
HeapBaseMinAddress, it just maps at any arbitrary address. zero is a 
special but acceptable case for HeapBaseMinAddress in 
ReservedHeapSpace::initialize_compressed_heap(). I was hoping a comment 
could be added to clarify that. But, I'm okay if you decide to not add 
comment with the change.

Thanks,
Jiangli
>
> Thanks
> - Ioi
>
> On 8/28/18 1:45 PM, Jiangli Zhou wrote:
>> Hi Ioi,
>>
>> Thanks for the additional explanation. Just did some more 
>> experiments. With '-Xmx1024m -XX:HeapBaseMinAddress=0', the VM 
>> allocates the java heap at the same address range as with '-Xmx1024m' 
>> (when the default HeapBaseMinAddress is taking effect). That eased my 
>> concern. Also, the existing argument checks guarantee that negative 
>> value cannot be passed to HeapBaseMinAddress. Based on those, it 
>> seems removing the assert is ok. Could you please add a comment in 
>> ReservedHeapSpace::initialize_compressed_heap() with the explanation 
>> for the 0 HeapBaseMinAddress case?
>>
>> Thanks,
>>
>> Jiangli
>>
>>
>> On 8/28/18 11:18 AM, Ioi Lam wrote:
>>> Hi Jiangli,
>>>
>>> Thanks for the review.
>>>
>>> The VM doesn’t really have any ideas of what’s a good value for 
>>> HeapBaseMinAddress. All it does is to try to map the address as 
>>> given by the user. If it fails, then the VM will ask the os to 
>>> allocate a block at an address picked by the os.
>>>
>>> The mapping at 0 will invariably fail, because on all OSes this 
>>> range is not mappable by the user program.
>>>
>>> When MaxHeapSize is not set, the GC ergonomics code tries to pick a 
>>> “good” address that is likely to work well for compressed oops, etc. 
>>> I think that’s why it overrides HeapBaseMinAddress (although there’s 
>>> no comment so I don’t know exactly why). However, if MaxHeapSize and 
>>> HeapBaseMinAddress are both specified by the user, the user probably 
>>> knows what they are doing and I don’t think the VM should interfere.
>>>
>>> As I mentioned above, picking any HeapMinAddress is safe as the VM 
>>> will simply ignore the values that don’t work.
>>>
>>> Thanks
>>> Ioi
>>>
>>>
>>>> On Aug 28, 2018, at 10:46 AM, Jiangli Zhou 
>>>> <jiangli.zhou at oracle.com> wrote:
>>>>
>>>> Hi Ioi,
>>>>
>>>> This probably is not a safe change and masks the bug that happens 
>>>> elsewhere. When running with '-XX:HeapBaseMinAddress=0 -version', 
>>>> Arguments::set_heap_size() resets HeapBaseMinAddress to 
>>>> DefaultHeapBaseMinAddress. That's why the assert in 
>>>> ReservedHeapSpace::initialize_compressed_heap() is not hit.
>>>>
>>>> I just ran '-Xmx1024m -XX:HeapBaseMinAddress=0' in gdb. Adjusting 
>>>> the HeapBaseMinAddress is not happening in this case because 
>>>> MaxHeapSize is not default. That causes 0 being seen as the 
>>>> HeapBaseMinAddress later in 
>>>> ReservedHeapSpace::initialize_compressed_heap().
>>>>
>>>> Thanks,
>>>>
>>>> Jiangli
>>>>
>>>>
>>>>> On 8/27/18 11:18 PM, Ioi Lam wrote:
>>>>> Hi, please review this one-liner change:
>>>>>
>>>>>
>>>>> https://bugs.openjdk.java.net/browse/JDK-8210043
>>>>>
>>>>> There is code that ensures HeapBaseMinAddress >= 
>>>>> DefaultHeapBaseMinAddress,
>>>>> but that happens only when MaxHeapSize is default, so the assert 
>>>>> doesn't match
>>>>> the existing behavior.
>>>>>
>>>>> The JVM works just fine if we remove the assert.
>>>>>
>>>>> $ hg diff src/hotspot/share/memory/virtualspace.cpp
>>>>> diff -r 2e928420389d src/hotspot/share/memory/virtualspace.cpp
>>>>> --- a/src/hotspot/share/memory/virtualspace.cpp    Tue Aug 21 
>>>>> 20:23:34 2018 -0700
>>>>> +++ b/src/hotspot/share/memory/virtualspace.cpp    Mon Aug 27 
>>>>> 23:05:18 2018 -0700
>>>>> @@ -490,7 +490,6 @@
>>>>>     guarantee(size + noaccess_prefix_size(alignment) <= 
>>>>> OopEncodingHeapMax,
>>>>>               "can not allocate compressed oop heap for this size");
>>>>>     guarantee(alignment == MAX2(alignment, 
>>>>> (size_t)os::vm_page_size()), "alignment too small");
>>>>> -  assert(HeapBaseMinAddress > 0, "sanity");
>>>>>
>>>>>     const size_t granularity = os::vm_allocation_granularity();
>>>>>     assert((size & (granularity - 1)) == 0,
>>>>>
>>
>



More information about the hotspot-runtime-dev mailing list