< prev index next >

src/hotspot/share/gc/shared/memAllocator.cpp

Print this page

        

*** 42,52 **** class MemAllocator::Allocation: StackObj { friend class MemAllocator; const MemAllocator& _allocator; Thread* _thread; ! oop* _obj_ptr; bool _overhead_limit_exceeded; bool _allocated_outside_tlab; size_t _allocated_tlab_size; bool _tlab_end_reset_for_sample; --- 42,52 ---- class MemAllocator::Allocation: StackObj { friend class MemAllocator; const MemAllocator& _allocator; Thread* _thread; ! Handle _handle; bool _overhead_limit_exceeded; bool _allocated_outside_tlab; size_t _allocated_tlab_size; bool _tlab_end_reset_for_sample;
*** 62,78 **** void check_for_bad_heap_word_value() const; #ifdef ASSERT void check_for_valid_allocation_state() const; #endif - class PreserveObj; - public: ! Allocation(const MemAllocator& allocator, oop* obj_ptr) : _allocator(allocator), _thread(Thread::current()), - _obj_ptr(obj_ptr), _overhead_limit_exceeded(false), _allocated_outside_tlab(false), _allocated_tlab_size(0), _tlab_end_reset_for_sample(false) { --- 62,75 ---- void check_for_bad_heap_word_value() const; #ifdef ASSERT void check_for_valid_allocation_state() const; #endif public: ! Allocation(const MemAllocator& allocator) : _allocator(allocator), _thread(Thread::current()), _overhead_limit_exceeded(false), _allocated_outside_tlab(false), _allocated_tlab_size(0), _tlab_end_reset_for_sample(false) {
*** 84,117 **** verify_after(); notify_allocation(); } } ! oop obj() const { return *_obj_ptr; } ! }; ! ! class MemAllocator::Allocation::PreserveObj: StackObj { ! HandleMark _handle_mark; ! Handle _handle; ! oop* const _obj_ptr; ! ! public: ! PreserveObj(Thread* thread, oop* obj_ptr) ! : _handle_mark(thread), ! _handle(thread, *obj_ptr), ! _obj_ptr(obj_ptr) ! { ! *obj_ptr = NULL; ! } ! ! ~PreserveObj() { ! *_obj_ptr = _handle(); ! } ! ! oop operator()() const { ! return _handle(); ! } }; bool MemAllocator::Allocation::check_out_of_memory() { Thread* THREAD = _thread; assert(!HAS_PENDING_EXCEPTION, "Unexpected exception, will result in uninitialized storage"); --- 81,92 ---- verify_after(); notify_allocation(); } } ! void set_obj(oop obj) { _handle = Handle(_thread, obj); } ! oop obj() const { return _handle(); } }; bool MemAllocator::Allocation::check_out_of_memory() { Thread* THREAD = _thread; assert(!HAS_PENDING_EXCEPTION, "Unexpected exception, will result in uninitialized storage");
*** 196,221 **** // Sample if it's a non-TLAB allocation, or a TLAB allocation that either refills the TLAB // or expands it due to taking a sampler induced slow path. return; } ! // 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. size_t bytes_since_last = 0; { - PreserveObj obj_h(_thread, _obj_ptr); JvmtiSampledObjectAllocEventCollector collector; size_t size_in_bytes = _allocator._word_size * HeapWordSize; ThreadLocalAllocBuffer& tlab = _thread->tlab(); if (!_allocated_outside_tlab) { bytes_since_last = tlab.bytes_since_last_sample_point(); } ! _thread->heap_sampler().check_for_sampling(obj_h(), size_in_bytes, bytes_since_last); } if (_tlab_end_reset_for_sample || _allocated_tlab_size != 0) { // Tell tlab to forget bytes_since_last if we passed it to the heap sampler. _thread->tlab().set_sample_end(bytes_since_last != 0); --- 171,195 ---- // Sample if it's a non-TLAB allocation, or a TLAB allocation that either refills the TLAB // or expands it due to taking a sampler induced slow path. return; } ! // If we want to be sampling, the allocated object is protected with a Handle // before doing the callback. The callback is done in the destructor of // the JvmtiSampledObjectAllocEventCollector. size_t bytes_since_last = 0; { JvmtiSampledObjectAllocEventCollector collector; size_t size_in_bytes = _allocator._word_size * HeapWordSize; ThreadLocalAllocBuffer& tlab = _thread->tlab(); if (!_allocated_outside_tlab) { bytes_since_last = tlab.bytes_since_last_sample_point(); } ! _thread->heap_sampler().check_for_sampling(obj(), size_in_bytes, bytes_since_last); } if (_tlab_end_reset_for_sample || _allocated_tlab_size != 0) { // Tell tlab to forget bytes_since_last if we passed it to the heap sampler. _thread->tlab().set_sample_end(bytes_since_last != 0);
*** 362,380 **** return allocate_outside_tlab(allocation); } oop MemAllocator::allocate() const { ! oop obj = NULL; { ! Allocation allocation(*this, &obj); HeapWord* mem = mem_allocate(allocation); if (mem != NULL) { ! obj = initialize(mem); } } ! return obj; } void MemAllocator::mem_clear(HeapWord* mem) const { assert(mem != NULL, "cannot initialize NULL object"); const size_t hs = oopDesc::header_size(); --- 336,358 ---- return allocate_outside_tlab(allocation); } oop MemAllocator::allocate() const { ! HandleMark hm(_thread); ! Handle obj_h; { ! Allocation allocation(*this); HeapWord* mem = mem_allocate(allocation); if (mem != NULL) { ! oop obj = initialize(mem); ! // Save obj in a handle for destructor safepoints ! allocation.set_obj(obj); ! obj_h = Handle(_thread, obj); } } ! return obj_h(); } void MemAllocator::mem_clear(HeapWord* mem) const { assert(mem != NULL, "cannot initialize NULL object"); const size_t hs = oopDesc::header_size();
< prev index next >