< prev index next >

src/hotspot/share/gc/shared/threadLocalAllocBuffer.hpp

Print this page
rev 50392 : JEP 331

*** 35,55 **** // ThreadLocalAllocBuffer: a descriptor for thread-local storage used by // the threads for allocation. // It is thread-private at any time, but maybe multiplexed over // time across multiple threads. The park()/unpark() pair is // used to make it available for such multiplexing. class ThreadLocalAllocBuffer: public CHeapObj<mtThread> { friend class VMStructs; friend class JVMCIVMStructs; private: HeapWord* _start; // address of TLAB HeapWord* _top; // address after last allocation HeapWord* _pf_top; // allocation prefetch watermark ! HeapWord* _end; // allocation end (excluding alignment_reserve) size_t _desired_size; // desired size (including alignment_reserve) size_t _refill_waste_limit; // hold onto tlab if free() is larger than this size_t _allocated_before_last_gc; // total bytes allocated up until the last gc static size_t _max_size; // maximum size of any TLAB static int _reserve_for_allocation_prefetch; // Reserve at the end of the TLAB static unsigned _target_refills; // expected number of refills between GCs --- 35,64 ---- // ThreadLocalAllocBuffer: a descriptor for thread-local storage used by // the threads for allocation. // It is thread-private at any time, but maybe multiplexed over // time across multiple threads. The park()/unpark() pair is // used to make it available for such multiplexing. + // + // Heap sampling is performed via the end and allocation_end + // fields. + // allocation_end contains the real end of the tlab allocation, + // whereas end can be set to an arbitrary spot in the tlab to + // trip the return and sample the allocation. class ThreadLocalAllocBuffer: public CHeapObj<mtThread> { friend class VMStructs; friend class JVMCIVMStructs; private: HeapWord* _start; // address of TLAB HeapWord* _top; // address after last allocation HeapWord* _pf_top; // allocation prefetch watermark ! HeapWord* _end; // allocation end (can be the sampling end point or _allocation_end) ! HeapWord* _allocation_end; // end for allocations (actual TLAB end, excluding alignment_reserve) ! size_t _desired_size; // desired size (including alignment_reserve) size_t _refill_waste_limit; // hold onto tlab if free() is larger than this size_t _allocated_before_last_gc; // total bytes allocated up until the last gc + size_t _bytes_since_last_sample_point; // bytes since last sample point. static size_t _max_size; // maximum size of any TLAB static int _reserve_for_allocation_prefetch; // Reserve at the end of the TLAB static unsigned _target_refills; // expected number of refills between GCs
*** 65,85 **** void accumulate_statistics(); void initialize_statistics(); void set_start(HeapWord* start) { _start = start; } void set_end(HeapWord* end) { _end = end; } void set_top(HeapWord* top) { _top = top; } void set_pf_top(HeapWord* pf_top) { _pf_top = pf_top; } void set_desired_size(size_t desired_size) { _desired_size = desired_size; } void set_refill_waste_limit(size_t waste) { _refill_waste_limit = waste; } size_t initial_refill_waste_limit() { return desired_size() / TLABRefillWasteFraction; } static int target_refills() { return _target_refills; } size_t initial_desired_size(); ! size_t remaining() const { return end() == NULL ? 0 : pointer_delta(hard_end(), top()); } bool is_last_allocation(HeapWord* obj, size_t size) { return pointer_delta(top(), obj) == size; } // Make parsable and release it. void reset(); --- 74,95 ---- void accumulate_statistics(); void initialize_statistics(); void set_start(HeapWord* start) { _start = start; } void set_end(HeapWord* end) { _end = end; } + void set_allocation_end(HeapWord* ptr) { _allocation_end = ptr; } void set_top(HeapWord* top) { _top = top; } void set_pf_top(HeapWord* pf_top) { _pf_top = pf_top; } void set_desired_size(size_t desired_size) { _desired_size = desired_size; } void set_refill_waste_limit(size_t waste) { _refill_waste_limit = waste; } size_t initial_refill_waste_limit() { return desired_size() / TLABRefillWasteFraction; } static int target_refills() { return _target_refills; } size_t initial_desired_size(); ! size_t remaining(); bool is_last_allocation(HeapWord* obj, size_t size) { return pointer_delta(top(), obj) == size; } // Make parsable and release it. void reset();
*** 116,137 **** static size_t max_size_in_bytes() { return max_size() * BytesPerWord; } static void set_max_size(size_t max_size) { _max_size = max_size; } HeapWord* start() const { return _start; } HeapWord* end() const { return _end; } - HeapWord* hard_end() const { return _end + alignment_reserve(); } HeapWord* top() const { return _top; } HeapWord* pf_top() const { return _pf_top; } size_t desired_size() const { return _desired_size; } size_t used() const { return pointer_delta(top(), start()); } size_t used_bytes() const { return pointer_delta(top(), start(), 1); } size_t free() const { return pointer_delta(end(), top()); } // Don't discard tlab if remaining space is larger than this. size_t refill_waste_limit() const { return _refill_waste_limit; } // Allocate size HeapWords. The memory is NOT initialized to zero. inline HeapWord* allocate(size_t size); // Undo last allocation. inline bool undo_allocate(HeapWord* obj, size_t size); // Reserve space at the end of TLAB --- 126,149 ---- static size_t max_size_in_bytes() { return max_size() * BytesPerWord; } static void set_max_size(size_t max_size) { _max_size = max_size; } HeapWord* start() const { return _start; } HeapWord* end() const { return _end; } HeapWord* top() const { return _top; } + HeapWord* hard_end(); HeapWord* pf_top() const { return _pf_top; } size_t desired_size() const { return _desired_size; } size_t used() const { return pointer_delta(top(), start()); } size_t used_bytes() const { return pointer_delta(top(), start(), 1); } size_t free() const { return pointer_delta(end(), top()); } // Don't discard tlab if remaining space is larger than this. size_t refill_waste_limit() const { return _refill_waste_limit; } + size_t bytes_since_last_sample_point() const { return _bytes_since_last_sample_point; } // Allocate size HeapWords. The memory is NOT initialized to zero. inline HeapWord* allocate(size_t size); + HeapWord* allocate_sampled_object(size_t size); // Undo last allocation. inline bool undo_allocate(HeapWord* obj, size_t size); // Reserve space at the end of TLAB
*** 169,178 **** --- 181,193 ---- static void resize_all_tlabs(); void fill(HeapWord* start, HeapWord* top, size_t new_size); void initialize(); + void set_back_allocation_end(); + void set_sample_end(); + static size_t refill_waste_limit_increment() { return TLABWasteIncrement; } template <typename T> void addresses_do(T f) { f(&_start); f(&_top);
< prev index next >