< prev index next >

src/hotspot/share/gc/shared/collectedHeap.inline.hpp

Print this page
rev 50392 : JEP 331

*** 32,41 **** --- 32,42 ---- #include "memory/universe.hpp" #include "oops/arrayOop.hpp" #include "oops/oop.inline.hpp" #include "prims/jvmtiExport.hpp" #include "runtime/sharedRuntime.hpp" + #include "runtime/handles.inline.hpp" #include "runtime/thread.inline.hpp" #include "services/lowMemoryDetector.hpp" #include "utilities/align.hpp" #include "utilities/copy.hpp"
*** 152,165 **** if (result != NULL) { NOT_PRODUCT(Universe::heap()-> check_for_non_bad_heap_word_value(result, size)); assert(!HAS_PENDING_EXCEPTION, "Unexpected exception, will result in uninitialized storage"); ! THREAD->incr_allocated_bytes(size * HeapWordSize); ! AllocTracer::send_allocation_outside_tlab(klass, result, size * HeapWordSize, THREAD); return result; } if (!gc_overhead_limit_was_exceeded) { --- 153,170 ---- if (result != NULL) { NOT_PRODUCT(Universe::heap()-> check_for_non_bad_heap_word_value(result, size)); assert(!HAS_PENDING_EXCEPTION, "Unexpected exception, will result in uninitialized storage"); ! size_t size_in_bytes = size * HeapWordSize; ! THREAD->incr_allocated_bytes(size_in_bytes); ! AllocTracer::send_allocation_outside_tlab(klass, result, size_in_bytes, THREAD); + if (ThreadHeapSampler::enabled()) { + THREAD->heap_sampler().check_for_sampling(result, size_in_bytes); + } return result; } if (!gc_overhead_limit_was_exceeded) {
*** 210,235 **** assert(size >= hs, "unexpected object size"); ((oop)obj)->set_klass_gap(0); Copy::fill_to_aligned_words(obj + hs, size - hs); } oop CollectedHeap::obj_allocate(Klass* klass, int size, TRAPS) { debug_only(check_for_valid_allocation_state()); assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed"); assert(size >= 0, "int won't convert to size_t"); ! HeapWord* obj = common_mem_allocate_init(klass, size, CHECK_NULL); ! post_allocation_setup_obj(klass, obj, size); NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size)); return (oop)obj; } oop CollectedHeap::class_allocate(Klass* klass, int size, TRAPS) { debug_only(check_for_valid_allocation_state()); assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed"); assert(size >= 0, "int won't convert to size_t"); ! HeapWord* obj = common_mem_allocate_init(klass, size, CHECK_NULL); ! post_allocation_setup_class(klass, obj, size); // set oop_size NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size)); return (oop)obj; } oop CollectedHeap::array_allocate(Klass* klass, --- 215,286 ---- assert(size >= hs, "unexpected object size"); ((oop)obj)->set_klass_gap(0); Copy::fill_to_aligned_words(obj + hs, size - hs); } + HeapWord* CollectedHeap::common_allocate_memory(Klass* klass, int size, + void (*post_setup)(Klass*, HeapWord*, int), + int size_for_post, bool init_memory, + TRAPS) { + HeapWord* obj; + if (init_memory) { + obj = common_mem_allocate_init(klass, size, CHECK_NULL); + } else { + obj = common_mem_allocate_noinit(klass, size, CHECK_NULL); + } + post_setup(klass, obj, size_for_post); + return obj; + } + + HeapWord* CollectedHeap::allocate_memory(Klass* klass, int size, + void (*post_setup)(Klass*, HeapWord*, int), + int size_for_post, bool init_memory, + TRAPS) { + HeapWord* obj; + + assert(JavaThread::current()->heap_sampler().add_sampling_collector(), + "Should never return false."); + + if (JvmtiExport::should_post_sampled_object_alloc()) { + HandleMark hm(THREAD); + Handle obj_h; + { + JvmtiSampledObjectAllocEventCollector collector; + obj = common_allocate_memory(klass, size, post_setup, size_for_post, + init_memory, CHECK_NULL); + // If we want to be sampling, protect the allocated object with a Handle + // before doing the callback. The callback is done in the destructor of + // the JvmtiSampledObjectAllocEventCollector. + obj_h = Handle(THREAD, (oop) obj); + } + obj = (HeapWord*) obj_h(); + } else { + obj = common_allocate_memory(klass, size, post_setup, size_for_post, + init_memory, CHECK_NULL); + } + + assert(JavaThread::current()->heap_sampler().remove_sampling_collector(), + "Should never return false."); + return obj; + } + oop CollectedHeap::obj_allocate(Klass* klass, int size, TRAPS) { debug_only(check_for_valid_allocation_state()); assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed"); assert(size >= 0, "int won't convert to size_t"); ! HeapWord* obj = allocate_memory(klass, size, post_allocation_setup_obj, ! size, true, CHECK_NULL); NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size)); return (oop)obj; } oop CollectedHeap::class_allocate(Klass* klass, int size, TRAPS) { debug_only(check_for_valid_allocation_state()); assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed"); assert(size >= 0, "int won't convert to size_t"); ! HeapWord* obj = allocate_memory(klass, size, post_allocation_setup_class, ! size, true, CHECK_NULL); NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size)); return (oop)obj; } oop CollectedHeap::array_allocate(Klass* klass,
*** 237,248 **** int length, TRAPS) { debug_only(check_for_valid_allocation_state()); assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed"); assert(size >= 0, "int won't convert to size_t"); ! HeapWord* obj = common_mem_allocate_init(klass, size, CHECK_NULL); ! post_allocation_setup_array(klass, obj, length); NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size)); return (oop)obj; } oop CollectedHeap::array_allocate_nozero(Klass* klass, --- 288,299 ---- int length, TRAPS) { debug_only(check_for_valid_allocation_state()); assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed"); assert(size >= 0, "int won't convert to size_t"); ! HeapWord* obj = allocate_memory(klass, size, post_allocation_setup_array, ! length, true, CHECK_NULL); NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size)); return (oop)obj; } oop CollectedHeap::array_allocate_nozero(Klass* klass,
*** 250,262 **** int length, TRAPS) { debug_only(check_for_valid_allocation_state()); assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed"); assert(size >= 0, "int won't convert to size_t"); ! HeapWord* obj = common_mem_allocate_noinit(klass, size, CHECK_NULL); ! ((oop)obj)->set_klass_gap(0); ! post_allocation_setup_array(klass, obj, length); #ifndef PRODUCT const size_t hs = oopDesc::header_size()+1; Universe::heap()->check_for_non_bad_heap_word_value(obj+hs, size-hs); #endif return (oop)obj; --- 301,313 ---- int length, TRAPS) { debug_only(check_for_valid_allocation_state()); assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed"); assert(size >= 0, "int won't convert to size_t"); ! ! HeapWord* obj = allocate_memory(klass, size, post_allocation_setup_array, ! length, false, CHECK_NULL); #ifndef PRODUCT const size_t hs = oopDesc::header_size()+1; Universe::heap()->check_for_non_bad_heap_word_value(obj+hs, size-hs); #endif return (oop)obj;
< prev index next >