--- old/src/hotspot/share/gc/shared/memAllocator.cpp 2019-03-27 16:10:30.271035555 +0100 +++ new/src/hotspot/share/gc/shared/memAllocator.cpp 2019-03-27 16:10:29.971030591 +0100 @@ -374,9 +374,13 @@ Copy::fill_to_aligned_words(mem + hs, _word_size - hs); } -oop MemAllocator::finish(HeapWord* mem) const { +inline void MemAllocator::finish_mark(HeapWord* mem) const { assert(mem != NULL, "NULL object pointer"); oopDesc::set_mark_raw(mem, Klass::default_prototype_header(_klass)); +} + +oop MemAllocator::finish(HeapWord* mem) const { + finish_mark(mem); // Need a release store to ensure array/class length, mark word, and // object zeroing are visible before setting the klass non-NULL, for // concurrent collectors. @@ -384,6 +388,12 @@ return oop(mem); } +oop MemAllocator::finish_with_properties(HeapWord* mem, ArrayStorageProperties storage_props) const { + finish_mark(mem); + oopDesc::release_set_metadata(mem, storage_props, _klass); + return oop(mem); +} + oop ObjAllocator::initialize(HeapWord* mem) const { mem_clear(mem); return finish(mem); @@ -407,7 +417,7 @@ mem_clear(mem); } arrayOopDesc::set_length(mem, _length); - return finish(mem); + return finish_with_properties(mem, ArrayKlass::cast(_klass)->storage_properties()); } oop ClassAllocator::initialize(HeapWord* mem) const {