RFR: 8212656: Clean up heap filler insertion
Per Lidén
per.liden at oracle.com
Thu Oct 18 15:44:11 UTC 2018
> On 18 Oct 2018, at 16:55, Roman Kennke <rkennke at redhat.com> wrote:
>
> Hi Per,
>
>> Hi Roman,
>>
>>> On 10/18/2018 03:57 PM, Roman Kennke wrote:
>>> Hi Per,
>>>
>>> I'll try to weave that into Shenandoah and see how that goes :-)
>>>
>>> One thing that I don't see how it could work is how we could do extra
>>> initialization for the fwd ptr? We can currently do it by overriding
>>> fill_with_dummy_object(..) like this:
>>>
>>> void ShenandoahHeap::fill_with_dummy_object(HeapWord* start, HeapWord*
>>> end, bool zap) {
>>> HeapWord* obj = post_allocation_setup(start); // Bumps start by 1 word
>>> CollectedHeap::fill_with_object(obj, end);
>>> }
>>>
>>> This seems to have gone with your patch.
>>
>> Ok, so if we do something like this:
>>
>> --- a/src/hotspot/share/gc/shared/fill.cpp
>> +++ b/src/hotspot/share/gc/shared/fill.cpp
>> @@ -76,14 +76,14 @@
>>
>> void Fill::fill_with_object(HeapWord* start) {
>> const size_t size = object_header_size();
>> - ObjAllocator allocator(SystemDictionary::Object_klass(), size);
>> - allocator.initialize(start);
>> + ObjAllocator allocator(SystemDictionary::Object_klass(), size -
>> _extra_header_size);
>> + allocator.initialize(start + _extra_header_size);
>> }
>>
>> void Fill::fill_with_array(HeapWord* start, size_t size) {
>> - const size_t length = array_length(size);
>> - ObjArrayAllocator allocator(Universe::intArrayKlassObj(), size,
>> (int)length, false /* do_zero */);
>> - allocator.initialize(start);
>> + const size_t length = array_length(size - _extra_header_size);
>> + ObjArrayAllocator allocator(Universe::intArrayKlassObj(), size -
>> _extra_header_size, (int)length, false /* do_zero */);
>> + allocator.initialize(start + _extra_header_size);
>>
>> if (ZapFillerObjects) {
>> HeapWord* const payload_start = start + array_header_size();
>>
>> Then the object will be initialized in the correct position. You will
>> not have the forwarding pointer initialized (we only made space for it
>> to keep the layout intact), but I suspect that should not be needed for
>> this purpose. The only reason this object exists is to make the heap
>> parsable, so you should only be reading the klass pointer anyway, right?
>
> Or, instead of hardwiring to ObjAllocator and ArrayAllocator, call
> CH::obj_allocate() and CH::array_allocate() which will be overridden by
> our own stuff, and should do the right thing? I'll try this approach in
> a bit.
I’m afraid that will call allocator.allocate() rather than just allocator.initialize().
/Per
>
> Thanks,
> Roman
>
More information about the hotspot-gc-dev
mailing list