< 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 >