void ThreadLocalAllocBuffer::accumulate_statistics_before_gc() { global_stats()->initialize(); #ifdef COLORED_TLABS if(UseColoredSpaces) { for(JavaThread *thread = Threads::first(); thread; thread = thread->next()) { //tty->print("early: %p\n", thread); thread->tlab(HC_RED).accumulate_statistics(); thread->tlab(HC_RED).initialize_statistics(); thread->tlab(HC_BLUE).accumulate_statistics(); thread->tlab(HC_BLUE).initialize_statistics(); } } else { for(JavaThread *thread = Threads::first(); thread; thread = thread->next()) { //tty->print("early: %p\n", thread); thread->tlab().accumulate_statistics(); thread->tlab().initialize_statistics(); } } #else for (JavaThread *thread = Threads::first(); thread != NULL; thread = thread->next()) { thread->tlab().accumulate_statistics(); thread->tlab().initialize_statistics(); } #endif // Publish new stats if some allocation occurred. if (global_stats()->allocation() != 0) { global_stats()->publish(); if (PrintTLAB) { global_stats()->print(); } } }
void ThreadLocalAllocBuffer::accumulate_statistics_before_gc() { global_stats()->initialize(); for(JavaThread *thread = Threads::first(); thread; thread = thread->next()) { thread->tlab().accumulate_statistics(); thread->tlab().initialize_statistics(); } // Publish new stats if some allocation occurred. if (global_stats()->allocation() != 0) { global_stats()->publish(); if (PrintTLAB) { global_stats()->print(); } } }
size_t ThreadLocalAllocBuffer::initial_desired_size() { size_t init_sz = 0; if (TLABSize > 0) { init_sz = TLABSize / HeapWordSize; } else if (global_stats() != NULL) { // Initial size is a function of the average number of allocating threads. unsigned nof_threads = global_stats()->allocating_threads_avg(); init_sz = (Universe::heap()->tlab_capacity(myThread()) / HeapWordSize) / (nof_threads * target_refills()); init_sz = align_object_size(init_sz); } init_sz = MIN2(MAX2(init_sz, min_size()), max_size()); return init_sz; }
void ThreadLocalAllocBuffer::accumulate_statistics() { Thread* thread = myThread(); size_t capacity = Universe::heap()->tlab_capacity(thread); size_t used = Universe::heap()->tlab_used(thread); _gc_waste += (unsigned)remaining(); size_t total_allocated = thread->allocated_bytes(); size_t allocated_since_last_gc = total_allocated - _allocated_before_last_gc; _allocated_before_last_gc = total_allocated; if (PrintTLAB && (_number_of_refills > 0 || Verbose)) { print_stats("gc"); } if (_number_of_refills > 0) { // Update allocation history if a reasonable amount of eden was allocated. bool update_allocation_history = used > 0.5 * capacity; if (update_allocation_history) { // Average the fraction of eden allocated in a tlab by this // thread for use in the next resize operation. // _gc_waste is not subtracted because it's included in // "used". // The result can be larger than 1.0 due to direct to old allocations. // These allocations should ideally not be counted but since it is not possible // to filter them out here we just cap the fraction to be at most 1.0. double alloc_frac = MIN2(1.0, (double) allocated_since_last_gc / used); _allocation_fraction.sample(alloc_frac); } global_stats()->update_allocating_threads(); global_stats()->update_number_of_refills(_number_of_refills); global_stats()->update_allocation(_number_of_refills * desired_size()); global_stats()->update_gc_waste(_gc_waste); global_stats()->update_slow_refill_waste(_slow_refill_waste); global_stats()->update_fast_refill_waste(_fast_refill_waste); } else { assert(_number_of_refills == 0 && _fast_refill_waste == 0 && _slow_refill_waste == 0 && _gc_waste == 0, "tlab stats == 0"); } global_stats()->update_slow_allocations(_slow_allocations); }
void ThreadLocalAllocBuffer::accumulate_statistics() { size_t capacity = Universe::heap()->tlab_capacity(myThread()) / HeapWordSize; size_t unused = Universe::heap()->unsafe_max_tlab_alloc(myThread()) / HeapWordSize; size_t used = capacity - unused; // Update allocation history if a reasonable amount of eden was allocated. bool update_allocation_history = used > 0.5 * capacity; _gc_waste += (unsigned)remaining(); if (PrintTLAB && (_number_of_refills > 0 || Verbose)) { print_stats("gc"); } if (_number_of_refills > 0) { if (update_allocation_history) { // Average the fraction of eden allocated in a tlab by this // thread for use in the next resize operation. // _gc_waste is not subtracted because it's included in // "used". size_t allocation = _number_of_refills * desired_size(); double alloc_frac = allocation / (double) used; _allocation_fraction.sample(alloc_frac); } global_stats()->update_allocating_threads(); global_stats()->update_number_of_refills(_number_of_refills); global_stats()->update_allocation(_number_of_refills * desired_size()); global_stats()->update_gc_waste(_gc_waste); global_stats()->update_slow_refill_waste(_slow_refill_waste); global_stats()->update_fast_refill_waste(_fast_refill_waste); } else { assert(_number_of_refills == 0 && _fast_refill_waste == 0 && _slow_refill_waste == 0 && _gc_waste == 0, "tlab stats == 0"); } global_stats()->update_slow_allocations(_slow_allocations); }