# HG changeset patch # User rkennke # Date 1539251938 -7200 # Thu Oct 11 11:58:58 2018 +0200 # Node ID 2213180807417c86d2d67d5b66406caafdeb3779 # Parent c4a39588a0754f259b43c80cf41f7a4722472372 8211955: GC abstraction for LAB reserve diff --git a/src/hotspot/share/gc/shared/collectedHeap.cpp b/src/hotspot/share/gc/shared/collectedHeap.cpp --- a/src/hotspot/share/gc/shared/collectedHeap.cpp +++ b/src/hotspot/share/gc/shared/collectedHeap.cpp @@ -445,6 +445,15 @@ CollectedHeap::fill_with_object(start, end, zap); } +size_t CollectedHeap::min_dummy_object_size() const { + return cell_size(oopDesc::header_size()); +} + +size_t CollectedHeap::tlab_alloc_reserve() const { + size_t min_size = min_dummy_object_size(); + return min_size > (size_t)MinObjAlignment ? align_object_size(min_size) : 0; +} + HeapWord* CollectedHeap::allocate_new_tlab(size_t min_size, size_t requested_size, size_t* actual_size) { @@ -586,7 +595,3 @@ void CollectedHeap::deduplicate_string(oop str) { // Do nothing, unless overridden in subclass. } - -size_t CollectedHeap::obj_size(oop obj) const { - return obj->size(); -} diff --git a/src/hotspot/share/gc/shared/collectedHeap.hpp b/src/hotspot/share/gc/shared/collectedHeap.hpp --- a/src/hotspot/share/gc/shared/collectedHeap.hpp +++ b/src/hotspot/share/gc/shared/collectedHeap.hpp @@ -309,6 +309,8 @@ } virtual void fill_with_dummy_object(HeapWord* start, HeapWord* end, bool zap); + size_t min_dummy_object_size() const; + size_t tlab_alloc_reserve() const; // Return the address "addr" aligned by "alignment_in_bytes" if such // an address is below "end". Return NULL otherwise. @@ -576,7 +578,7 @@ virtual bool is_oop(oop object) const; - virtual size_t obj_size(oop obj) const; + virtual size_t cell_size(size_t obj_size) const { return obj_size; } // Non product verification and debugging. #ifndef PRODUCT diff --git a/src/hotspot/share/gc/shared/plab.cpp b/src/hotspot/share/gc/shared/plab.cpp --- a/src/hotspot/share/gc/shared/plab.cpp +++ b/src/hotspot/share/gc/shared/plab.cpp @@ -27,7 +27,6 @@ #include "gc/shared/plab.inline.hpp" #include "gc/shared/threadLocalAllocBuffer.hpp" #include "logging/log.hpp" -#include "oops/arrayOop.hpp" #include "oops/oop.inline.hpp" size_t PLAB::min_size() { @@ -43,8 +42,7 @@ _word_sz(desired_plab_sz_), _bottom(NULL), _top(NULL), _end(NULL), _hard_end(NULL), _allocated(0), _wasted(0), _undo_wasted(0) { - // ArrayOopDesc::header_size depends on command line initialization. - AlignmentReserve = oopDesc::header_size() > MinObjAlignment ? align_object_size(arrayOopDesc::header_size(T_INT)) : 0; + AlignmentReserve = Universe::heap()->tlab_alloc_reserve(); assert(min_size() > AlignmentReserve, "Minimum PLAB size " SIZE_FORMAT " must be larger than alignment reserve " SIZE_FORMAT " " "to be able to contain objects", min_size(), AlignmentReserve); diff --git a/src/hotspot/share/gc/shared/threadLocalAllocBuffer.cpp b/src/hotspot/share/gc/shared/threadLocalAllocBuffer.cpp --- a/src/hotspot/share/gc/shared/threadLocalAllocBuffer.cpp +++ b/src/hotspot/share/gc/shared/threadLocalAllocBuffer.cpp @@ -23,6 +23,7 @@ */ #include "precompiled.hpp" +#include "gc/shared/collectedHeap.hpp" #include "gc/shared/threadLocalAllocBuffer.inline.hpp" #include "logging/log.hpp" #include "memory/resourceArea.hpp" @@ -461,3 +462,8 @@ _perf_max_slow_allocations ->set_value(_max_slow_allocations); } } + +size_t ThreadLocalAllocBuffer::end_reserve() { + size_t reserve_size = Universe::heap()->tlab_alloc_reserve(); + return MAX2(reserve_size, (size_t)_reserve_for_allocation_prefetch); +} diff --git a/src/hotspot/share/gc/shared/threadLocalAllocBuffer.hpp b/src/hotspot/share/gc/shared/threadLocalAllocBuffer.hpp --- a/src/hotspot/share/gc/shared/threadLocalAllocBuffer.hpp +++ b/src/hotspot/share/gc/shared/threadLocalAllocBuffer.hpp @@ -26,7 +26,6 @@ #define SHARE_VM_GC_SHARED_THREADLOCALALLOCBUFFER_HPP #include "gc/shared/gcUtil.hpp" -#include "oops/typeArrayOop.hpp" #include "runtime/perfData.hpp" #include "runtime/vm_version.hpp" @@ -138,10 +137,7 @@ inline HeapWord* allocate(size_t size); // Reserve space at the end of TLAB - static size_t end_reserve() { - int reserve_size = typeArrayOopDesc::header_size(T_INT); - return MAX2(reserve_size, _reserve_for_allocation_prefetch); - } + static size_t end_reserve(); static size_t alignment_reserve() { return align_object_size(end_reserve()); } static size_t alignment_reserve_in_bytes() { return alignment_reserve() * HeapWordSize; } diff --git a/src/hotspot/share/prims/jvmtiEnv.cpp b/src/hotspot/share/prims/jvmtiEnv.cpp --- a/src/hotspot/share/prims/jvmtiEnv.cpp +++ b/src/hotspot/share/prims/jvmtiEnv.cpp @@ -470,7 +470,8 @@ JvmtiEnv::GetObjectSize(jobject object, jlong* size_ptr) { oop mirror = JNIHandles::resolve_external_guard(object); NULL_CHECK(mirror, JVMTI_ERROR_INVALID_OBJECT); - *size_ptr = (jlong)Universe::heap()->obj_size(mirror) * wordSize; + size_t obj_size = mirror->size(); + *size_ptr = (jlong)Universe::heap()->cell_size(obj_size) * wordSize; return JVMTI_ERROR_NONE; } /* end GetObjectSize */ diff --git a/src/hotspot/share/prims/whitebox.cpp b/src/hotspot/share/prims/whitebox.cpp --- a/src/hotspot/share/prims/whitebox.cpp +++ b/src/hotspot/share/prims/whitebox.cpp @@ -372,7 +372,8 @@ WB_ENTRY(jlong, WB_GetObjectSize(JNIEnv* env, jobject o, jobject obj)) oop p = JNIHandles::resolve(obj); - return Universe::heap()->obj_size(p) * HeapWordSize; + size_t obj_size = p->size(); + return Universe::heap()->cell_size(obj_size) * HeapWordSize; WB_END WB_ENTRY(jlong, WB_GetHeapSpaceAlignment(JNIEnv* env, jobject o))