--- old/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp 2012-07-24 11:52:11.368587268 -0700 +++ new/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp 2012-07-24 11:52:11.147754834 -0700 @@ -3580,7 +3580,11 @@ DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set(); size_t buffer_size = dcqs.buffer_size(); size_t buffer_num = dcqs.completed_buffers_num(); - return buffer_size * buffer_num + extra_cards; + + // PtrQueueSet::buffer_size() and PtrQueue:size() return sizes + // in bytes - not the number of 'entries'. We need to convert + // into a number of cards. + return (buffer_size * buffer_num + extra_cards) / oopSize; } size_t G1CollectedHeap::max_pending_card_num() {