--- old/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp 2018-05-09 00:05:49.736144838 +0200 +++ new/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp 2018-05-09 00:05:49.591146636 +0200 @@ -24,6 +24,7 @@ #include "precompiled.hpp" #include "memory/allocation.hpp" +#include "gc/shared/collectedHeap.inline.hpp" #include "gc/shared/gcTimer.hpp" #include "gc/shared/gcTraceTime.inline.hpp" #include "gc/shared/parallelCleaning.hpp" @@ -800,18 +801,30 @@ return _free_set->allocate(word_size, type, in_new_region); } -HeapWord* ShenandoahHeap::mem_allocate(size_t size, - bool* gc_overhead_limit_was_exceeded) { - HeapWord* filler = allocate_memory(size + BrooksPointer::word_size(), _alloc_shared); - HeapWord* result = filler + BrooksPointer::word_size(); - if (filler != NULL) { - BrooksPointer::initialize(oop(result)); +HeapWord* ShenandoahHeap::mem_allocate(size_t size, Klass* klass, Thread* thread, + bool* gc_overhead_limit_was_exceeded) { - assert(! in_collection_set(result), "never allocate in targetted region"); - return result; - } else { - return NULL; + size += BrooksPointer::word_size(); + HeapWord* obj = allocate_from_tlab(klass, thread, size); + if (obj == NULL) { + obj = allocate_memory(size, _alloc_shared); + } + + if (obj != NULL) { + obj = obj + BrooksPointer::word_size(); + BrooksPointer::initialize(oop(obj)); + assert(! in_collection_set(obj), "never allocate in targetted region"); + } + return obj; +} + +void ShenandoahHeap::fill_with_object_impl(HeapWord* start, size_t words, bool zap) { + if (words > 0) { + start += BrooksPointer::word_size(); + words -= BrooksPointer::word_size(); } + CollectedHeap::fill_with_object_impl(start, words, zap); + BrooksPointer::initialize(oop(start)); } class ShenandoahEvacuateUpdateRootsClosure: public ExtendedOopClosure { @@ -1862,13 +1875,6 @@ set_gc_state_mask(EVACUATION, in_progress); } -HeapWord* ShenandoahHeap::tlab_post_allocation_setup(HeapWord* obj) { - // Initialize Brooks pointer for the next object - HeapWord* result = obj + BrooksPointer::word_size(); - BrooksPointer::initialize(oop(result)); - return result; -} - uint ShenandoahHeap::oop_extra_words() { return BrooksPointer::word_size(); }