RFR(XS) 8210523 runtime/appcds/cacheObject/DifferentHeapSizes.java crash
Ioi Lam
ioi.lam at oracle.com
Mon Sep 10 23:23:47 UTC 2018
On 9/10/2018 10:37 AM, Jiangli Zhou wrote:
> Hi Ioi,
>
> The fix looks correct. Please rename
> start_address_with_archived_oop_encoding_mode() to
> start_address_with_relocated_oop_encoding_mode(). The original name
> might be a confusing factor that caused the bug (adding the delta to
> the result of start_address_with_archived_oop_encoding_mode()).
>
start_address_with_archived_oop_encoding_mode() internally calls
HeapShared::decode_with_archived_oop_encoding_mode(), so the naming is
consistent there. I didn't want to use "relocated ..." because
relocation may or may not happen. In many cases, delta == 0.
> Some more comments will be beneficial for readers who are not familiar
> with the region relocation code. We should explain that the first
> HeapShared::init_narrow_oop_decoding() call sets the relocation
> decoding mode and all addresses decoded using it afterwards are
> relocated. The second HeapShared::init_narrow_oop_decoding() resets
> the relocation decoding mode and adjusts alignment.
>
Hmm, I could do
// sets the relocation decoding mode and all addresses decoded using
the calculated delta
log_info(cds)("CDS heap data relocation delta = " INTX_FORMAT "
bytes", delta);
HeapShared::init_narrow_oop_decoding(narrow_oop_base() + delta,
narrow_oop_shift());
But that doesn't seem to add any info that's not already in the code ....
Commenting about this is tricky, and the involved code is rather small
(just FileMapInfo::map_heap_regions_impl and
HeapShared::decode_with_archived_oop_encoding_mode()). I feel that
writing comments about what it does will just be translating the code
into English, which will probably get out of date. I think it should be
sufficient to understand the code with the existing comments and the
-Xlog:cds output.
What do you think?
Thanks
- Ioi
> Thanks,
>
> Jiangi
>
> On 9/9/18 4:21 PM, Ioi Lam wrote:
>> https://bugs.openjdk.java.net/browse/JDK-8210523
>> http://cr.openjdk.java.net/~iklam/jdk12/8210523-DifferentHeapSizes-crash.v01/
>>
>>
>> The bug is here:
>>
>> address relocated_strings_bottom =
>> start_address_with_archived_oop_encoding_mode(si);
>> - if (!is_aligned(relocated_strings_bottom + delta,
>> HeapRegion::GrainBytes)) {
>> + if (!is_aligned(relocated_strings_bottom, HeapRegion::GrainBytes)) {
>>
>> relocated_strings_bottom was already relocated, so you don't need the
>> "+ delta"
>> here. The bug was hidden because in all of our test runs, delta had been
>> a multiple of HeapRegion::GrainBytes, so that didn't affect the
>> result of the
>> is_align() call.
>>
>> Then, just by chance (probably due to Address Space Layout Randomization
>> on MacOS), we have a delta / GrainBytes == (29509025792 / 4194304.0)
>> = 7035.5,
>> so the bug is uncovered.
>>
>> Thanks
>> - Ioi
>>
>>
>
More information about the hotspot-runtime-dev
mailing list