src/share/vm/gc_implementation/g1/g1RemSet.cpp
Print this page
*** 32,41 ****
--- 32,42 ----
#include "gc_implementation/g1/g1HotCardCache.hpp"
#include "gc_implementation/g1/g1GCPhaseTimes.hpp"
#include "gc_implementation/g1/g1OopClosures.inline.hpp"
#include "gc_implementation/g1/g1RemSet.inline.hpp"
#include "gc_implementation/g1/heapRegionSeq.inline.hpp"
+ #include "gc_implementation/g1/heapRegionRemSet.hpp"
#include "memory/iterator.hpp"
#include "oops/oop.inline.hpp"
#include "utilities/intHisto.hpp"
#define CARD_REPEAT_HISTO 0
*** 71,88 ****
G1RemSet::G1RemSet(G1CollectedHeap* g1, CardTableModRefBS* ct_bs)
: _g1(g1), _conc_refine_cards(0),
_ct_bs(ct_bs), _g1p(_g1->g1_policy()),
_cg1r(g1->concurrent_g1_refine()),
_cset_rs_update_cl(NULL),
! _cards_scanned(NULL), _total_cards_scanned(0)
{
_seq_task = new SubTasksDone(NumSeqTasks);
guarantee(n_workers() > 0, "There should be some workers");
_cset_rs_update_cl = NEW_C_HEAP_ARRAY(OopsInHeapRegionClosure*, n_workers(), mtGC);
for (uint i = 0; i < n_workers(); i++) {
_cset_rs_update_cl[i] = NULL;
}
}
G1RemSet::~G1RemSet() {
delete _seq_task;
for (uint i = 0; i < n_workers(); i++) {
--- 72,91 ----
G1RemSet::G1RemSet(G1CollectedHeap* g1, CardTableModRefBS* ct_bs)
: _g1(g1), _conc_refine_cards(0),
_ct_bs(ct_bs), _g1p(_g1->g1_policy()),
_cg1r(g1->concurrent_g1_refine()),
_cset_rs_update_cl(NULL),
! _cards_scanned(NULL), _total_cards_scanned(0),
! _last_period_summary()
{
_seq_task = new SubTasksDone(NumSeqTasks);
guarantee(n_workers() > 0, "There should be some workers");
_cset_rs_update_cl = NEW_C_HEAP_ARRAY(OopsInHeapRegionClosure*, n_workers(), mtGC);
for (uint i = 0; i < n_workers(); i++) {
_cset_rs_update_cl[i] = NULL;
}
+ _last_period_summary.initialize(this, n_workers());
}
G1RemSet::~G1RemSet() {
delete _seq_task;
for (uint i = 0; i < n_workers(); i++) {
*** 695,792 ****
"invalid result at non safepoint");
return has_refs_into_cset;
}
! class HRRSStatsIter: public HeapRegionClosure {
! size_t _occupied;
! size_t _total_mem_sz;
! size_t _max_mem_sz;
! HeapRegion* _max_mem_sz_region;
! public:
! HRRSStatsIter() :
! _occupied(0),
! _total_mem_sz(0),
! _max_mem_sz(0),
! _max_mem_sz_region(NULL)
! {}
! bool doHeapRegion(HeapRegion* r) {
! if (r->continuesHumongous()) return false;
! size_t mem_sz = r->rem_set()->mem_size();
! if (mem_sz > _max_mem_sz) {
! _max_mem_sz = mem_sz;
! _max_mem_sz_region = r;
! }
! _total_mem_sz += mem_sz;
! size_t occ = r->rem_set()->occupied();
! _occupied += occ;
! return false;
! }
! size_t total_mem_sz() { return _total_mem_sz; }
! size_t max_mem_sz() { return _max_mem_sz; }
! size_t occupied() { return _occupied; }
! HeapRegion* max_mem_sz_region() { return _max_mem_sz_region; }
! };
! class PrintRSThreadVTimeClosure : public ThreadClosure {
! public:
! virtual void do_thread(Thread *t) {
! ConcurrentG1RefineThread* crt = (ConcurrentG1RefineThread*) t;
! gclog_or_tty->print(" %5.2f", crt->vtime_accum());
! }
! };
void G1RemSet::print_summary_info() {
! G1CollectedHeap* g1 = G1CollectedHeap::heap();
#if CARD_REPEAT_HISTO
gclog_or_tty->print_cr("\nG1 card_repeat count histogram: ");
gclog_or_tty->print_cr(" # of repeats --> # of cards with that number.");
card_repeat_count.print_on(gclog_or_tty);
#endif
! gclog_or_tty->print_cr("\n Concurrent RS processed %d cards",
! _conc_refine_cards);
! DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
! jint tot_processed_buffers =
! dcqs.processed_buffers_mut() + dcqs.processed_buffers_rs_thread();
! gclog_or_tty->print_cr(" Of %d completed buffers:", tot_processed_buffers);
! gclog_or_tty->print_cr(" %8d (%5.1f%%) by conc RS threads.",
! dcqs.processed_buffers_rs_thread(),
! 100.0*(float)dcqs.processed_buffers_rs_thread()/
! (float)tot_processed_buffers);
! gclog_or_tty->print_cr(" %8d (%5.1f%%) by mutator threads.",
! dcqs.processed_buffers_mut(),
! 100.0*(float)dcqs.processed_buffers_mut()/
! (float)tot_processed_buffers);
! gclog_or_tty->print_cr(" Conc RS threads times(s)");
! PrintRSThreadVTimeClosure p;
! gclog_or_tty->print(" ");
! g1->concurrent_g1_refine()->threads_do(&p);
! gclog_or_tty->print_cr("");
!
! HRRSStatsIter blk;
! g1->heap_region_iterate(&blk);
! gclog_or_tty->print_cr(" Total heap region rem set sizes = "SIZE_FORMAT"K."
! " Max = "SIZE_FORMAT"K.",
! blk.total_mem_sz()/K, blk.max_mem_sz()/K);
! gclog_or_tty->print_cr(" Static structures = "SIZE_FORMAT"K,"
! " free_lists = "SIZE_FORMAT"K.",
! HeapRegionRemSet::static_mem_size() / K,
! HeapRegionRemSet::fl_mem_size() / K);
! gclog_or_tty->print_cr(" "SIZE_FORMAT" occupied cards represented.",
! blk.occupied());
! HeapRegion* max_mem_sz_region = blk.max_mem_sz_region();
! HeapRegionRemSet* rem_set = max_mem_sz_region->rem_set();
! gclog_or_tty->print_cr(" Max size region = "HR_FORMAT", "
! "size = "SIZE_FORMAT "K, occupied = "SIZE_FORMAT"K.",
! HR_FORMAT_PARAMS(max_mem_sz_region),
! (rem_set->mem_size() + K - 1)/K,
! (rem_set->occupied() + K - 1)/K);
! gclog_or_tty->print_cr(" Did %d coarsenings.",
! HeapRegionRemSet::n_coarsenings());
}
void G1RemSet::prepare_for_verify() {
if (G1HRRSFlushLogBuffersOnVerify &&
(VerifyBeforeGC || VerifyAfterGC)
--- 698,738 ----
"invalid result at non safepoint");
return has_refs_into_cset;
}
! void G1RemSet::print_periodic_summary_info() {
! G1RemSetSummary current;
! current.initialize(this, n_workers());
! _last_period_summary.subtract_from(¤t);
! print_summary_info(&_last_period_summary);
! _last_period_summary.set(¤t);
! }
void G1RemSet::print_summary_info() {
! G1RemSetSummary current;
! current.initialize(this, n_workers());
!
! print_summary_info(¤t, " Cumulative RS summary");
! }
!
! void G1RemSet::print_summary_info(G1RemSetSummary * summary, const char * header) {
! assert(summary != NULL, "just checking");
!
! if (header != NULL) {
! gclog_or_tty->print_cr("%s", header);
! }
#if CARD_REPEAT_HISTO
gclog_or_tty->print_cr("\nG1 card_repeat count histogram: ");
gclog_or_tty->print_cr(" # of repeats --> # of cards with that number.");
card_repeat_count.print_on(gclog_or_tty);
#endif
! summary->print_on(gclog_or_tty);
}
void G1RemSet::prepare_for_verify() {
if (G1HRRSFlushLogBuffersOnVerify &&
(VerifyBeforeGC || VerifyAfterGC)