< prev index next >

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

Print this page
rev 47590 : [mq]: heap8
rev 47592 : [mq]: heap14_rebased


  76   void accumulate_statistics();
  77   void initialize_statistics();
  78 
  79   void set_start(HeapWord* start)                { _start = start; }
  80   void set_end(HeapWord* end)                    { _end = end; }
  81   void set_actual_end(HeapWord* actual_end)      { _actual_end = actual_end; }
  82   void set_slow_path_end(HeapWord* slow_path_end)    { _slow_path_end = slow_path_end; }
  83   void set_top(HeapWord* top)                    { _top = top; }
  84   void set_pf_top(HeapWord* pf_top)              { _pf_top = pf_top; }
  85   void set_desired_size(size_t desired_size)     { _desired_size = desired_size; }
  86   void set_refill_waste_limit(size_t waste)      { _refill_waste_limit = waste;  }
  87   void set_bytes_until_sample(size_t bytes)      { _bytes_until_sample = bytes;  }
  88 
  89   size_t initial_refill_waste_limit()            { return desired_size() / TLABRefillWasteFraction; }
  90 
  91   static int    target_refills()                 { return _target_refills; }
  92   size_t initial_desired_size();
  93 
  94   size_t remaining()                             { return end() == NULL ? 0 : pointer_delta(hard_end(), top()); }
  95 




  96   // Make parsable and release it.
  97   void reset();
  98 
  99   // Resize based on amount of allocation, etc.
 100   void resize();
 101 
 102   void invariants() const { assert(top() >= start() && top() <= end(), "invalid tlab"); }
 103 
 104   void initialize(HeapWord* start, HeapWord* top, HeapWord* end);
 105 
 106   void print_stats(const char* tag);
 107 
 108   Thread* myThread();
 109 
 110   // statistics
 111 
 112   int number_of_refills() const { return _number_of_refills; }
 113   int fast_refill_waste() const { return _fast_refill_waste; }
 114   int slow_refill_waste() const { return _slow_refill_waste; }
 115   int gc_waste() const          { return _gc_waste; }
 116   int slow_allocations() const  { return _slow_allocations; }
 117 
 118   static GlobalTLABStats* _global_stats;
 119   static GlobalTLABStats* global_stats() { return _global_stats; }
 120 
 121 public:
 122   ThreadLocalAllocBuffer() : _allocation_fraction(TLABAllocationWeight), _allocated_before_last_gc(0) {
 123     // do nothing.  tlabs must be inited by initialize() calls
 124   }
 125 
 126   static size_t min_size()                       { return align_object_size(MinTLABSize / HeapWordSize) + alignment_reserve(); }
 127   static size_t max_size()                       { assert(_max_size != 0, "max_size not set up"); return _max_size; }
 128   static size_t max_size_in_bytes()              { return max_size() * BytesPerWord; }
 129   static void set_max_size(size_t max_size)      { _max_size = max_size; }
 130 
 131   HeapWord* start() const                        { return _start; }
 132   HeapWord* end() const                          { return _end; }
 133   HeapWord* slow_path_end() const                { return _slow_path_end; }
 134   HeapWord* actual_end() const                   { return _actual_end; }
 135   HeapWord* hard_end();
 136   HeapWord* top() const                          { return _top; }
 137   HeapWord* pf_top() const                       { return _pf_top; }
 138   size_t desired_size() const                    { return _desired_size; }
 139   size_t used() const                            { return pointer_delta(top(), start()); }
 140   size_t used_bytes() const                      { return pointer_delta(top(), start(), 1); }
 141   size_t free() const                            { return pointer_delta(end(), top()); }
 142   // Don't discard tlab if remaining space is larger than this.
 143   size_t refill_waste_limit() const              { return _refill_waste_limit; }
 144 
 145   // Allocate size HeapWords. The memory is NOT initialized to zero.
 146   inline HeapWord* allocate(size_t size);
 147 
 148   // Reserve space at the end of TLAB
 149   static size_t end_reserve() {
 150     int reserve_size = typeArrayOopDesc::header_size(T_INT);
 151     return MAX2(reserve_size, _reserve_for_allocation_prefetch);
 152   }
 153   static size_t alignment_reserve()              { return align_object_size(end_reserve()); }
 154   static size_t alignment_reserve_in_bytes()     { return alignment_reserve() * HeapWordSize; }
 155 


 163 
 164   // Initialization at startup
 165   static void startup_initialization();
 166 
 167   // Make an in-use tlab parsable, optionally retiring and/or zapping it.
 168   void make_parsable(bool retire, bool zap = true);
 169 
 170   // Retire in-use tlab before allocation of a new tlab
 171   void clear_before_allocation();
 172 
 173   // Accumulate statistics across all tlabs before gc
 174   static void accumulate_statistics_before_gc();
 175 
 176   // Resize tlabs for all threads
 177   static void resize_all_tlabs();
 178 
 179   void fill(HeapWord* start, HeapWord* top, size_t new_size);
 180   void initialize();
 181 
 182   void pick_next_sample(size_t diff = 0);
 183   void set_sample_end();
 184   void set_back_actual_end();
 185   void handle_sample(Thread* thread, HeapWord* result, size_t size);
 186   size_t bytes_until_sample() { return _bytes_until_sample; }
 187   size_t *bytes_until_sample_addr() { return &_bytes_until_sample; }
 188   bool should_sample() { return bytes_until_sample() == 0; }
 189 
 190   static size_t refill_waste_limit_increment()   { return TLABWasteIncrement; }
 191 
 192   // Code generation support
 193   static ByteSize start_offset()                 { return byte_offset_of(ThreadLocalAllocBuffer, _start); }
 194   static ByteSize end_offset()                   { return byte_offset_of(ThreadLocalAllocBuffer, _end  ); }
 195   static ByteSize actual_end_offset()            { return byte_offset_of(ThreadLocalAllocBuffer, _actual_end  ); }
 196   static ByteSize top_offset()                   { return byte_offset_of(ThreadLocalAllocBuffer, _top  ); }
 197   static ByteSize pf_top_offset()                { return byte_offset_of(ThreadLocalAllocBuffer, _pf_top  ); }
 198   static ByteSize size_offset()                  { return byte_offset_of(ThreadLocalAllocBuffer, _desired_size ); }
 199   static ByteSize refill_waste_limit_offset()    { return byte_offset_of(ThreadLocalAllocBuffer, _refill_waste_limit ); }
 200 
 201   static ByteSize number_of_refills_offset()     { return byte_offset_of(ThreadLocalAllocBuffer, _number_of_refills ); }
 202   static ByteSize fast_refill_waste_offset()     { return byte_offset_of(ThreadLocalAllocBuffer, _fast_refill_waste ); }
 203   static ByteSize slow_allocations_offset()      { return byte_offset_of(ThreadLocalAllocBuffer, _slow_allocations ); }
 204 
 205   void verify();
 206 };
 207 
 208 class GlobalTLABStats: public CHeapObj<mtThread> {
 209 private:
 210 
 211   // Accumulate perfdata in private variables because
 212   // PerfData should be write-only for security reasons
 213   // (see perfData.hpp)
 214   unsigned _allocating_threads;
 215   unsigned _total_refills;




  76   void accumulate_statistics();
  77   void initialize_statistics();
  78 
  79   void set_start(HeapWord* start)                { _start = start; }
  80   void set_end(HeapWord* end)                    { _end = end; }
  81   void set_actual_end(HeapWord* actual_end)      { _actual_end = actual_end; }
  82   void set_slow_path_end(HeapWord* slow_path_end)    { _slow_path_end = slow_path_end; }
  83   void set_top(HeapWord* top)                    { _top = top; }
  84   void set_pf_top(HeapWord* pf_top)              { _pf_top = pf_top; }
  85   void set_desired_size(size_t desired_size)     { _desired_size = desired_size; }
  86   void set_refill_waste_limit(size_t waste)      { _refill_waste_limit = waste;  }
  87   void set_bytes_until_sample(size_t bytes)      { _bytes_until_sample = bytes;  }
  88 
  89   size_t initial_refill_waste_limit()            { return desired_size() / TLABRefillWasteFraction; }
  90 
  91   static int    target_refills()                 { return _target_refills; }
  92   size_t initial_desired_size();
  93 
  94   size_t remaining()                             { return end() == NULL ? 0 : pointer_delta(hard_end(), top()); }
  95 
  96   // Obtain the actual end of the TLAB.
  97   HeapWord* hard_end();
  98   void set_sample_end();
  99 
 100   // Make parsable and release it.
 101   void reset();
 102 
 103   // Resize based on amount of allocation, etc.
 104   void resize();
 105 
 106   void invariants() const { assert(top() >= start() && top() <= end(), "invalid tlab"); }
 107 
 108   void initialize(HeapWord* start, HeapWord* top, HeapWord* end);
 109 
 110   void print_stats(const char* tag);
 111 
 112   Thread* myThread();
 113 
 114   // statistics
 115 
 116   int number_of_refills() const { return _number_of_refills; }
 117   int fast_refill_waste() const { return _fast_refill_waste; }
 118   int slow_refill_waste() const { return _slow_refill_waste; }
 119   int gc_waste() const          { return _gc_waste; }
 120   int slow_allocations() const  { return _slow_allocations; }
 121 
 122   static GlobalTLABStats* _global_stats;
 123   static GlobalTLABStats* global_stats() { return _global_stats; }
 124 
 125 public:
 126   ThreadLocalAllocBuffer() : _allocation_fraction(TLABAllocationWeight), _allocated_before_last_gc(0) {
 127     // do nothing.  tlabs must be inited by initialize() calls
 128   }
 129 
 130   static size_t min_size()                       { return align_object_size(MinTLABSize / HeapWordSize) + alignment_reserve(); }
 131   static size_t max_size()                       { assert(_max_size != 0, "max_size not set up"); return _max_size; }
 132   static size_t max_size_in_bytes()              { return max_size() * BytesPerWord; }
 133   static void set_max_size(size_t max_size)      { _max_size = max_size; }
 134 
 135   HeapWord* start() const                        { return _start; }
 136   HeapWord* end() const                          { return _end; }



 137   HeapWord* top() const                          { return _top; }
 138   HeapWord* pf_top() const                       { return _pf_top; }
 139   size_t desired_size() const                    { return _desired_size; }
 140   size_t used() const                            { return pointer_delta(top(), start()); }
 141   size_t used_bytes() const                      { return pointer_delta(top(), start(), 1); }
 142   size_t free() const                            { return pointer_delta(end(), top()); }
 143   // Don't discard tlab if remaining space is larger than this.
 144   size_t refill_waste_limit() const              { return _refill_waste_limit; }
 145 
 146   // Allocate size HeapWords. The memory is NOT initialized to zero.
 147   inline HeapWord* allocate(size_t size);
 148 
 149   // Reserve space at the end of TLAB
 150   static size_t end_reserve() {
 151     int reserve_size = typeArrayOopDesc::header_size(T_INT);
 152     return MAX2(reserve_size, _reserve_for_allocation_prefetch);
 153   }
 154   static size_t alignment_reserve()              { return align_object_size(end_reserve()); }
 155   static size_t alignment_reserve_in_bytes()     { return alignment_reserve() * HeapWordSize; }
 156 


 164 
 165   // Initialization at startup
 166   static void startup_initialization();
 167 
 168   // Make an in-use tlab parsable, optionally retiring and/or zapping it.
 169   void make_parsable(bool retire, bool zap = true);
 170 
 171   // Retire in-use tlab before allocation of a new tlab
 172   void clear_before_allocation();
 173 
 174   // Accumulate statistics across all tlabs before gc
 175   static void accumulate_statistics_before_gc();
 176 
 177   // Resize tlabs for all threads
 178   static void resize_all_tlabs();
 179 
 180   void fill(HeapWord* start, HeapWord* top, size_t new_size);
 181   void initialize();
 182 
 183   void pick_next_sample(size_t diff = 0);

 184   void set_back_actual_end();
 185   void handle_sample(Thread* thread, HeapWord* result, size_t size);
 186   bool should_sample() { return _bytes_until_sample == 0; }


 187 
 188   static size_t refill_waste_limit_increment()   { return TLABWasteIncrement; }
 189 
 190   // Code generation support
 191   static ByteSize start_offset()                 { return byte_offset_of(ThreadLocalAllocBuffer, _start); }
 192   static ByteSize end_offset()                   { return byte_offset_of(ThreadLocalAllocBuffer, _end  ); }

 193   static ByteSize top_offset()                   { return byte_offset_of(ThreadLocalAllocBuffer, _top  ); }
 194   static ByteSize pf_top_offset()                { return byte_offset_of(ThreadLocalAllocBuffer, _pf_top  ); }
 195   static ByteSize size_offset()                  { return byte_offset_of(ThreadLocalAllocBuffer, _desired_size ); }
 196   static ByteSize refill_waste_limit_offset()    { return byte_offset_of(ThreadLocalAllocBuffer, _refill_waste_limit ); }
 197 
 198   static ByteSize number_of_refills_offset()     { return byte_offset_of(ThreadLocalAllocBuffer, _number_of_refills ); }
 199   static ByteSize fast_refill_waste_offset()     { return byte_offset_of(ThreadLocalAllocBuffer, _fast_refill_waste ); }
 200   static ByteSize slow_allocations_offset()      { return byte_offset_of(ThreadLocalAllocBuffer, _slow_allocations ); }
 201 
 202   void verify();
 203 };
 204 
 205 class GlobalTLABStats: public CHeapObj<mtThread> {
 206 private:
 207 
 208   // Accumulate perfdata in private variables because
 209   // PerfData should be write-only for security reasons
 210   // (see perfData.hpp)
 211   unsigned _allocating_threads;
 212   unsigned _total_refills;


< prev index next >