--- old/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp 2014-11-06 01:36:44.309526400 -0800 +++ new/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp 2014-11-06 01:36:44.217526403 -0800 @@ -69,6 +69,7 @@ ObjToScanQueueSet* work_queue_set_, Stack* overflow_stacks_, size_t desired_plab_sz_, + ParNewTracer* gc_tracer, ParallelTaskTerminator& term_) : _to_space(to_space_), _old_gen(old_gen_), _young_gen(gen_), _thread_num(thread_num_), _work_queue(work_queue_set_->queue(thread_num_)), _to_space_full(false), @@ -83,6 +84,7 @@ work_queue_set_, &term_), _is_alive_closure(gen_), _scan_weak_ref_closure(gen_, this), _keep_alive_closure(&_scan_weak_ref_closure), + _gc_tracer(gc_tracer), _strong_roots_time(0.0), _term_time(0.0) { #if TASKQUEUE_STATS @@ -222,7 +224,9 @@ assert(young_gen()->overflow_list() == NULL, "Error"); } -HeapWord* ParScanThreadState::alloc_in_to_space_slow(size_t word_sz) { +HeapWord* ParScanThreadState::alloc_in_to_space_slow(size_t word_sz, + const oop old, + const uint age) { // Otherwise, if the object is small enough, try to reallocate the // buffer. @@ -252,6 +256,8 @@ plab->set_word_size(buf_size); plab->set_buf(buf_space); record_survivor_plab(buf_space, buf_size); + gc_tracer()->report_promotion_in_new_plab_event(old, word_sz, age, false, + buf_size); obj = plab->allocate_aligned(word_sz, SurvivorAlignmentInBytes); // Note that we cannot compare buf_size < word_sz below // because of AlignmentReserve (see ParGCAllocBuffer::allocate()). @@ -267,6 +273,7 @@ } else { // Too large; allocate the object individually. + gc_tracer()->report_promotion_outside_plab_event(old, word_sz, age, false); obj = sp->par_allocate(word_sz); } } @@ -303,6 +310,7 @@ ObjToScanQueueSet& queue_set, Stack* overflow_stacks_, size_t desired_plab_sz, + ParNewTracer* gc_tracer, ParallelTaskTerminator& term); ~ParScanThreadStateSet() { TASKQUEUE_STATS_ONLY(reset_stats()); } @@ -337,7 +345,8 @@ int num_threads, Space& to_space, ParNewGeneration& gen, Generation& old_gen, ObjToScanQueueSet& queue_set, Stack* overflow_stacks, - size_t desired_plab_sz, ParallelTaskTerminator& term) + size_t desired_plab_sz, ParNewTracer* gc_tracer, + ParallelTaskTerminator& term) : ResourceArray(sizeof(ParScanThreadState), num_threads), _gen(gen), _next_gen(old_gen), _term(term) { @@ -348,7 +357,7 @@ for (int i = 0; i < num_threads; ++i) { new ((ParScanThreadState*)_data + i) ParScanThreadState(&to_space, &gen, &old_gen, i, &queue_set, - overflow_stacks, desired_plab_sz, term); + overflow_stacks, desired_plab_sz, gc_tracer, term); } } @@ -980,7 +989,8 @@ ParallelTaskTerminator _term(n_workers, task_queues()); ParScanThreadStateSet thread_state_set(workers->active_workers(), *to(), *this, *_next_gen, *task_queues(), - _overflow_stacks, desired_plab_sz(), _term); + _overflow_stacks, desired_plab_sz(), + &gc_tracer, _term); ParNewGenTask tsk(this, _next_gen, reserved().end(), &thread_state_set); gch->set_par_threads(n_workers); @@ -1178,7 +1188,7 @@ // Try allocating obj in to-space (unless too old) if (dummyOld.age() < tenuring_threshold()) { - new_obj = (oop)par_scan_state->alloc_in_to_space(sz); + new_obj = (oop)par_scan_state->alloc_in_to_space(sz, old, dummyOld.age()); if (new_obj == NULL) { set_survivor_overflow(true); } @@ -1196,8 +1206,9 @@ return real_forwardee(old); } - new_obj = _next_gen->par_promote(par_scan_state->thread_num(), - old, m, sz); + new_obj = _next_gen->par_promote(par_scan_state->gc_tracer(), + par_scan_state->thread_num(), + old, m, sz); if (new_obj == NULL) { // promotion failed, forward to self @@ -1305,7 +1316,7 @@ // Try allocating obj in to-space (unless too old) if (dummyOld.age() < tenuring_threshold()) { - new_obj = (oop)par_scan_state->alloc_in_to_space(sz); + new_obj = (oop)par_scan_state->alloc_in_to_space(sz, old, dummyOld.age()); if (new_obj == NULL) { set_survivor_overflow(true); } @@ -1314,8 +1325,9 @@ if (new_obj == NULL) { // Either to-space is full or we decided to promote // try allocating obj tenured - new_obj = _next_gen->par_promote(par_scan_state->thread_num(), - old, m, sz); + new_obj = _next_gen->par_promote(par_scan_state->gc_tracer(), + par_scan_state->thread_num(), + old, m, sz); if (new_obj == NULL) { // promotion failed, forward to self