Print this page
rev 3486 : 7185699: G1: Prediction model discrepancies
Summary: Correct the result value of G1CollectedHeap::pending_card_num(). Change the code that calculates the GC efficiency of a non-young heap region to use historical data from mixed GCs and the actual number of live bytes when predicting how long it would take to collect the region.
Reviewed-by:

Split Close
Expand all
Collapse all
          --- old/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
          +++ new/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
↓ open down ↓ 3572 lines elided ↑ open up ↑
3573 3573    size_t extra_cards = 0;
3574 3574    JavaThread *curr = Threads::first();
3575 3575    while (curr != NULL) {
3576 3576      DirtyCardQueue& dcq = curr->dirty_card_queue();
3577 3577      extra_cards += dcq.size();
3578 3578      curr = curr->next();
3579 3579    }
3580 3580    DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
3581 3581    size_t buffer_size = dcqs.buffer_size();
3582 3582    size_t buffer_num = dcqs.completed_buffers_num();
3583      -  return buffer_size * buffer_num + extra_cards;
     3583 +
     3584 +  // PtrQueueSet::buffer_size() and PtrQueue:size() return sizes
     3585 +  // in bytes - not the number of 'entries'. We need to convert
     3586 +  // into a number of cards.
     3587 +  return (buffer_size * buffer_num + extra_cards) / oopSize;
3584 3588  }
3585 3589  
3586 3590  size_t G1CollectedHeap::max_pending_card_num() {
3587 3591    DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
3588 3592    size_t buffer_size = dcqs.buffer_size();
3589 3593    size_t buffer_num  = dcqs.completed_buffers_num();
3590 3594    int thread_num  = Threads::number_of_threads();
3591 3595    return (buffer_num + thread_num) * buffer_size;
3592 3596  }
3593 3597  
↓ open down ↓ 2824 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX