RFR: 8212656: Clean up heap filler insertion
Roman Kennke
rkennke at redhat.com
Thu Oct 18 14:55:24 UTC 2018
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.
Thanks,
Roman
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://mail.openjdk.org/pipermail/hotspot-gc-dev/attachments/20181018/1d9bdcfe/signature.asc>
More information about the hotspot-gc-dev
mailing list