# HG changeset patch # User rkennke # Date 1538128588 -7200 # Fri Sep 28 11:56:28 2018 +0200 # Node ID a55a0607c9c8657bab78c31c72399e4db3955820 # Parent c573d2633417affce16a2ac0f27aa667bb44b899 8211270: GC abstraction to get real object and headers size 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 @@ -586,3 +586,15 @@ void CollectedHeap::deduplicate_string(oop str) { // Do nothing, unless overridden in subclass. } + +size_t CollectedHeap::obj_size(oop obj) const { + return obj->size(); +} + +size_t CollectedHeap::obj_header_size() const { + return oopDesc::header_size(); +} + +size_t CollectedHeap::array_header_size(BasicType type) const { + return arrayOopDesc::header_size(type); +} 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 @@ -576,6 +576,10 @@ virtual bool is_oop(oop object) const; + virtual size_t obj_size(oop obj) const; + virtual size_t obj_header_size() const; + virtual size_t array_header_size(BasicType element_type) const; + // Non product verification and debugging. #ifndef PRODUCT // Support for PromotionFailureALot. Return true if it's time to cause a 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 @@ -44,7 +44,10 @@ _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; + CollectedHeap* heap = Universe::heap(); + int rsv_regular = heap->obj_header_size(); + int rsv_array = align_object_size(heap->array_header_size(T_INT)); + AlignmentReserve = rsv_regular > MinObjAlignment ? rsv_array : 0; 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); @@ -82,6 +85,8 @@ size_t PLAB::retire_internal() { size_t result = 0; if (_top < _hard_end) { + assert(pointer_delta(_hard_end, _top) >= (size_t)(Universe::heap()->obj_header_size()), + "better have enough space left to fill with dummy"); Universe::heap()->fill_with_dummy_object(_top, _hard_end, true); result += invalidate(); } 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,7 @@ JvmtiEnv::GetObjectSize(jobject object, jlong* size_ptr) { oop mirror = JNIHandles::resolve_external_guard(object); NULL_CHECK(mirror, JVMTI_ERROR_INVALID_OBJECT); - *size_ptr = (jlong)mirror->size() * wordSize; + *size_ptr = (jlong)Universe::heap()->obj_size(mirror) * 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 @@ -371,7 +371,7 @@ WB_ENTRY(jlong, WB_GetObjectSize(JNIEnv* env, jobject o, jobject obj)) oop p = JNIHandles::resolve(obj); - return p->size() * HeapWordSize; + return Universe::heap()->obj_size(p) * HeapWordSize; WB_END WB_ENTRY(jlong, WB_GetHeapSpaceAlignment(JNIEnv* env, jobject o))