< prev index next >

src/share/vm/gc/cms/compactibleFreeListSpace.cpp

Print this page

        

*** 398,416 **** st->print_cr(" _fitStrategy = %s", BOOL_TO_STR(_fitStrategy)); } void CompactibleFreeListSpace::print_indexed_free_lists(outputStream* st) const { ! reportIndexedFreeListStatistics(); ! gclog_or_tty->print_cr("Layout of Indexed Freelists"); ! gclog_or_tty->print_cr("---------------------------"); AdaptiveFreeList<FreeChunk>::print_labels_on(st, "size"); for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { ! _indexedFreeList[i].print_on(gclog_or_tty); ! for (FreeChunk* fc = _indexedFreeList[i].head(); fc != NULL; ! fc = fc->next()) { ! gclog_or_tty->print_cr("\t[" PTR_FORMAT "," PTR_FORMAT ") %s", p2i(fc), p2i((HeapWord*)fc + i), fc->cantCoalesce() ? "\t CC" : ""); } } } --- 398,415 ---- st->print_cr(" _fitStrategy = %s", BOOL_TO_STR(_fitStrategy)); } void CompactibleFreeListSpace::print_indexed_free_lists(outputStream* st) const { ! reportIndexedFreeListStatistics(st); ! st->print_cr("Layout of Indexed Freelists"); ! st->print_cr("---------------------------"); AdaptiveFreeList<FreeChunk>::print_labels_on(st, "size"); for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { ! _indexedFreeList[i].print_on(st); ! for (FreeChunk* fc = _indexedFreeList[i].head(); fc != NULL; fc = fc->next()) { ! st->print_cr("\t[" PTR_FORMAT "," PTR_FORMAT ") %s", p2i(fc), p2i((HeapWord*)fc + i), fc->cantCoalesce() ? "\t CC" : ""); } } }
*** 420,430 **** _promoInfo.print_on(st); } void CompactibleFreeListSpace::print_dictionary_free_lists(outputStream* st) const { ! _dictionary->report_statistics(); st->print_cr("Layout of Freelists in Tree"); st->print_cr("---------------------------"); _dictionary->print_free_lists(st); } --- 419,429 ---- _promoInfo.print_on(st); } void CompactibleFreeListSpace::print_dictionary_free_lists(outputStream* st) const { ! _dictionary->report_statistics(st); st->print_cr("Layout of Freelists in Tree"); st->print_cr("---------------------------"); _dictionary->print_free_lists(st); }
*** 470,527 **** } } return sz; } ! void CompactibleFreeListSpace::dump_at_safepoint_with_locks(CMSCollector* c, ! outputStream* st) { ! st->print_cr("\n========================="); st->print_cr("Block layout in CMS Heap:"); st->print_cr("========================="); BlkPrintingClosure bpcl(c, this, c->markBitMap(), st); blk_iterate(&bpcl); ! st->print_cr("\n======================================="); st->print_cr("Order & Layout of Promotion Info Blocks"); st->print_cr("======================================="); print_promo_info_blocks(st); ! st->print_cr("\n==========================="); st->print_cr("Order of Indexed Free Lists"); st->print_cr("========================="); print_indexed_free_lists(st); ! st->print_cr("\n================================="); st->print_cr("Order of Free Lists in Dictionary"); st->print_cr("================================="); print_dictionary_free_lists(st); } ! void CompactibleFreeListSpace::reportFreeListStatistics() const { assert_lock_strong(&_freelistLock); ! assert(PrintFLSStatistics != 0, "Reporting error"); ! _dictionary->report_statistics(); ! if (PrintFLSStatistics > 1) { ! reportIndexedFreeListStatistics(); size_t total_size = totalSizeInIndexedFreeLists() + _dictionary->total_chunk_size(DEBUG_ONLY(freelistLock())); ! gclog_or_tty->print(" free=" SIZE_FORMAT " frag=%1.4f\n", total_size, flsFrag()); } } ! void CompactibleFreeListSpace::reportIndexedFreeListStatistics() const { assert_lock_strong(&_freelistLock); ! gclog_or_tty->print("Statistics for IndexedFreeLists:\n" ! "--------------------------------\n"); size_t total_size = totalSizeInIndexedFreeLists(); size_t free_blocks = numFreeBlocksInIndexedFreeLists(); ! gclog_or_tty->print("Total Free Space: " SIZE_FORMAT "\n", total_size); ! gclog_or_tty->print("Max Chunk Size: " SIZE_FORMAT "\n", maxChunkSizeInIndexedFreeLists()); ! gclog_or_tty->print("Number of Blocks: " SIZE_FORMAT "\n", free_blocks); if (free_blocks != 0) { ! gclog_or_tty->print("Av. Block Size: " SIZE_FORMAT "\n", total_size/free_blocks); } } size_t CompactibleFreeListSpace::numFreeBlocksInIndexedFreeLists() const { size_t res = 0; --- 469,530 ---- } } return sz; } ! void CompactibleFreeListSpace::dump_at_safepoint_with_locks(CMSCollector* c, outputStream* st) { ! st->print_cr("========================="); st->print_cr("Block layout in CMS Heap:"); st->print_cr("========================="); BlkPrintingClosure bpcl(c, this, c->markBitMap(), st); blk_iterate(&bpcl); ! st->print_cr("======================================="); st->print_cr("Order & Layout of Promotion Info Blocks"); st->print_cr("======================================="); print_promo_info_blocks(st); ! st->print_cr("==========================="); st->print_cr("Order of Indexed Free Lists"); st->print_cr("========================="); print_indexed_free_lists(st); ! st->print_cr("================================="); st->print_cr("Order of Free Lists in Dictionary"); st->print_cr("================================="); print_dictionary_free_lists(st); } ! void CompactibleFreeListSpace::reportFreeListStatistics(const char* title) const { assert_lock_strong(&_freelistLock); ! LogHandle(gc, freelist, stats) log; ! if (!log.is_debug()) { ! return; ! } ! log.debug("%s", title); ! _dictionary->report_statistics(log.debug_stream()); ! if (log.is_trace()) { ! ResourceMark rm; ! reportIndexedFreeListStatistics(log.trace_stream()); size_t total_size = totalSizeInIndexedFreeLists() + _dictionary->total_chunk_size(DEBUG_ONLY(freelistLock())); ! log.trace(" free=" SIZE_FORMAT " frag=%1.4f", total_size, flsFrag()); } } ! void CompactibleFreeListSpace::reportIndexedFreeListStatistics(outputStream* st) const { assert_lock_strong(&_freelistLock); ! st->print_cr("Statistics for IndexedFreeLists:"); ! st->print_cr("--------------------------------"); size_t total_size = totalSizeInIndexedFreeLists(); size_t free_blocks = numFreeBlocksInIndexedFreeLists(); ! st->print_cr("Total Free Space: " SIZE_FORMAT, total_size); ! st->print_cr("Max Chunk Size: " SIZE_FORMAT, maxChunkSizeInIndexedFreeLists()); ! st->print_cr("Number of Blocks: " SIZE_FORMAT, free_blocks); if (free_blocks != 0) { ! st->print_cr("Av. Block Size: " SIZE_FORMAT, total_size/free_blocks); } } size_t CompactibleFreeListSpace::numFreeBlocksInIndexedFreeLists() const { size_t res = 0;
*** 1822,1849 **** } void CompactibleFreeListSpace::gc_prologue() { assert_locked(); ! if (PrintFLSStatistics != 0) { ! gclog_or_tty->print("Before GC:\n"); ! reportFreeListStatistics(); ! } refillLinearAllocBlocksIfNeeded(); } void CompactibleFreeListSpace::gc_epilogue() { assert_locked(); assert(_promoInfo.noPromotions(), "_promoInfo inconsistency"); _promoInfo.stopTrackingPromotions(); repairLinearAllocationBlocks(); ! // Print Space's stats ! if (PrintFLSStatistics != 0) { ! gclog_or_tty->print("After GC:\n"); ! reportFreeListStatistics(); ! } } // Iteration support, mostly delegated from a CMS generation void CompactibleFreeListSpace::save_marks() { --- 1825,1845 ---- } void CompactibleFreeListSpace::gc_prologue() { assert_locked(); ! reportFreeListStatistics("Before GC:"); refillLinearAllocBlocksIfNeeded(); } void CompactibleFreeListSpace::gc_epilogue() { assert_locked(); assert(_promoInfo.noPromotions(), "_promoInfo inconsistency"); _promoInfo.stopTrackingPromotions(); repairLinearAllocationBlocks(); ! reportFreeListStatistics("After GC:"); } // Iteration support, mostly delegated from a CMS generation void CompactibleFreeListSpace::save_marks() {
*** 2012,2024 **** float intra_sweep_estimate) { assert_locked(); size_t i; for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { AdaptiveFreeList<FreeChunk>* fl = &_indexedFreeList[i]; ! if (PrintFLSStatistics > 1) { ! gclog_or_tty->print("size[" SIZE_FORMAT "] : ", i); ! } fl->compute_desired(inter_sweep_current, inter_sweep_estimate, intra_sweep_estimate); fl->set_coal_desired((ssize_t)((double)fl->desired() * CMSSmallCoalSurplusPercent)); fl->set_before_sweep(fl->count()); fl->set_bfr_surp(fl->surplus()); } --- 2008,2018 ---- float intra_sweep_estimate) { assert_locked(); size_t i; for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { AdaptiveFreeList<FreeChunk>* fl = &_indexedFreeList[i]; ! log_trace(gc, freelist)("size[" SIZE_FORMAT "] : ", i); fl->compute_desired(inter_sweep_current, inter_sweep_estimate, intra_sweep_estimate); fl->set_coal_desired((ssize_t)((double)fl->desired() * CMSSmallCoalSurplusPercent)); fl->set_before_sweep(fl->count()); fl->set_bfr_surp(fl->surplus()); }
*** 2063,2082 **** fl->set_split_deaths(0); } } void CompactibleFreeListSpace::endSweepFLCensus(size_t sweep_count) { ! if (PrintFLSStatistics > 0) { ! HeapWord* largestAddr = (HeapWord*) dictionary()->find_largest_dict(); ! gclog_or_tty->print_cr("CMS: Large block " PTR_FORMAT, ! p2i(largestAddr)); ! } setFLSurplus(); setFLHints(); - if (PrintGC && PrintFLSCensus > 0) { printFLCensus(sweep_count); - } clearFLCensus(); assert_locked(); _dictionary->end_sweep_dict_census(CMSLargeSplitSurplusPercent); } --- 2057,2070 ---- fl->set_split_deaths(0); } } void CompactibleFreeListSpace::endSweepFLCensus(size_t sweep_count) { ! log_debug(gc, freelist)("CMS: Large block " PTR_FORMAT, p2i(dictionary()->find_largest_dict())); setFLSurplus(); setFLHints(); printFLCensus(sweep_count); clearFLCensus(); assert_locked(); _dictionary->end_sweep_dict_census(CMSLargeSplitSurplusPercent); }
*** 2211,2228 **** guarantee(_sp->verify_chunk_in_free_list(fc), "Chunk should be on a free list"); } } if (res == 0) { ! gclog_or_tty->print_cr("Livelock: no rank reduction!"); ! gclog_or_tty->print_cr( ! " Current: addr = " PTR_FORMAT ", size = " SIZE_FORMAT ", obj = %s, live = %s \n" " Previous: addr = " PTR_FORMAT ", size = " SIZE_FORMAT ", obj = %s, live = %s \n", p2i(addr), res, was_obj ?"true":"false", was_live ?"true":"false", p2i(_last_addr), _last_size, _last_was_obj?"true":"false", _last_was_live?"true":"false"); ! _sp->print_on(gclog_or_tty); ! guarantee(false, "Seppuku!"); } _last_addr = addr; _last_size = res; _last_was_obj = was_obj; _last_was_live = was_live; --- 2199,2217 ---- guarantee(_sp->verify_chunk_in_free_list(fc), "Chunk should be on a free list"); } } if (res == 0) { ! LogHandle(gc, verify) log; ! log.info("Livelock: no rank reduction!"); ! log.info(" Current: addr = " PTR_FORMAT ", size = " SIZE_FORMAT ", obj = %s, live = %s \n" " Previous: addr = " PTR_FORMAT ", size = " SIZE_FORMAT ", obj = %s, live = %s \n", p2i(addr), res, was_obj ?"true":"false", was_live ?"true":"false", p2i(_last_addr), _last_size, _last_was_obj?"true":"false", _last_was_live?"true":"false"); ! ResourceMark rm; ! _sp->print_on(log.info_stream()); ! guarantee(false, "Verification failed."); } _last_addr = addr; _last_size = res; _last_was_obj = was_obj; _last_was_live = was_live;
*** 2384,2404 **** } #endif void CompactibleFreeListSpace::printFLCensus(size_t sweep_count) const { assert_lock_strong(&_freelistLock); AdaptiveFreeList<FreeChunk> total; ! gclog_or_tty->print("end sweep# " SIZE_FORMAT "\n", sweep_count); ! AdaptiveFreeList<FreeChunk>::print_labels_on(gclog_or_tty, "size"); size_t total_free = 0; for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { const AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[i]; total_free += fl->count() * fl->size(); if (i % (40*IndexSetStride) == 0) { ! AdaptiveFreeList<FreeChunk>::print_labels_on(gclog_or_tty, "size"); } ! fl->print_on(gclog_or_tty); total.set_bfr_surp( total.bfr_surp() + fl->bfr_surp() ); total.set_surplus( total.surplus() + fl->surplus() ); total.set_desired( total.desired() + fl->desired() ); total.set_prev_sweep( total.prev_sweep() + fl->prev_sweep() ); total.set_before_sweep(total.before_sweep() + fl->before_sweep()); --- 2373,2399 ---- } #endif void CompactibleFreeListSpace::printFLCensus(size_t sweep_count) const { assert_lock_strong(&_freelistLock); + LogHandle(gc, freelist, census) log; + if (!log.is_debug()) { + return; + } AdaptiveFreeList<FreeChunk> total; ! log.debug("end sweep# " SIZE_FORMAT, sweep_count); ! ResourceMark rm; ! outputStream* out = log.debug_stream(); ! AdaptiveFreeList<FreeChunk>::print_labels_on(out, "size"); size_t total_free = 0; for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { const AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[i]; total_free += fl->count() * fl->size(); if (i % (40*IndexSetStride) == 0) { ! AdaptiveFreeList<FreeChunk>::print_labels_on(out, "size"); } ! fl->print_on(out); total.set_bfr_surp( total.bfr_surp() + fl->bfr_surp() ); total.set_surplus( total.surplus() + fl->surplus() ); total.set_desired( total.desired() + fl->desired() ); total.set_prev_sweep( total.prev_sweep() + fl->prev_sweep() ); total.set_before_sweep(total.before_sweep() + fl->before_sweep());
*** 2406,2423 **** total.set_coal_births( total.coal_births() + fl->coal_births() ); total.set_coal_deaths( total.coal_deaths() + fl->coal_deaths() ); total.set_split_births(total.split_births() + fl->split_births()); total.set_split_deaths(total.split_deaths() + fl->split_deaths()); } ! total.print_on(gclog_or_tty, "TOTAL"); ! gclog_or_tty->print_cr("Total free in indexed lists " ! SIZE_FORMAT " words", total_free); ! gclog_or_tty->print("growth: %8.5f deficit: %8.5f\n", (double)(total.split_births()+total.coal_births()-total.split_deaths()-total.coal_deaths())/ (total.prev_sweep() != 0 ? (double)total.prev_sweep() : 1.0), (double)(total.desired() - total.count())/(total.desired() != 0 ? (double)total.desired() : 1.0)); ! _dictionary->print_dict_census(); } /////////////////////////////////////////////////////////////////////////// // CFLS_LAB /////////////////////////////////////////////////////////////////////////// --- 2401,2417 ---- total.set_coal_births( total.coal_births() + fl->coal_births() ); total.set_coal_deaths( total.coal_deaths() + fl->coal_deaths() ); total.set_split_births(total.split_births() + fl->split_births()); total.set_split_deaths(total.split_deaths() + fl->split_deaths()); } ! total.print_on(out, "TOTAL"); ! log.debug("Total free in indexed lists " SIZE_FORMAT " words", total_free); ! log.debug("growth: %8.5f deficit: %8.5f", (double)(total.split_births()+total.coal_births()-total.split_deaths()-total.coal_deaths())/ (total.prev_sweep() != 0 ? (double)total.prev_sweep() : 1.0), (double)(total.desired() - total.count())/(total.desired() != 0 ? (double)total.desired() : 1.0)); ! _dictionary->print_dict_census(out); } /////////////////////////////////////////////////////////////////////////// // CFLS_LAB ///////////////////////////////////////////////////////////////////////////
*** 2542,2555 **** _global_num_blocks[i]/(_global_num_workers[i]*CMSOldPLABNumRefills)))); } // Reset counters for next round _global_num_workers[i] = 0; _global_num_blocks[i] = 0; ! if (PrintOldPLAB) { ! gclog_or_tty->print_cr("[" SIZE_FORMAT "]: " SIZE_FORMAT, ! i, (size_t)_blocks_to_claim[i].average()); ! } } } } // If this is changed in the future to allow parallel --- 2536,2546 ---- _global_num_blocks[i]/(_global_num_workers[i]*CMSOldPLABNumRefills)))); } // Reset counters for next round _global_num_workers[i] = 0; _global_num_blocks[i] = 0; ! log_trace(gc, plab)("[" SIZE_FORMAT "]: " SIZE_FORMAT, i, (size_t)_blocks_to_claim[i].average()); } } } // If this is changed in the future to allow parallel
*** 2582,2595 **** // Reset this list. _indexedFreeList[i] = AdaptiveFreeList<FreeChunk>(); _indexedFreeList[i].set_size(i); } } ! if (PrintOldPLAB) { ! gclog_or_tty->print_cr("%d[" SIZE_FORMAT "]: " SIZE_FORMAT "/" SIZE_FORMAT "/" SIZE_FORMAT, tid, i, num_retire, _num_blocks[i], (size_t)_blocks_to_claim[i].average()); - } // Reset stats for next round _num_blocks[i] = 0; } } } --- 2573,2584 ---- // Reset this list. _indexedFreeList[i] = AdaptiveFreeList<FreeChunk>(); _indexedFreeList[i].set_size(i); } } ! log_trace(gc, plab)("%d[" SIZE_FORMAT "]: " SIZE_FORMAT "/" SIZE_FORMAT "/" SIZE_FORMAT, tid, i, num_retire, _num_blocks[i], (size_t)_blocks_to_claim[i].average()); // Reset stats for next round _num_blocks[i] = 0; } } }
< prev index next >