< prev index next >
src/share/vm/memory/binaryTreeDictionary.cpp
Print this page
@@ -27,10 +27,11 @@
#include "gc/shared/spaceDecorator.hpp"
#include "memory/binaryTreeDictionary.hpp"
#include "memory/freeBlockDictionary.hpp"
#include "memory/freeList.hpp"
#include "memory/metachunk.hpp"
+#include "memory/resourceArea.hpp"
#include "runtime/globals.hpp"
#include "utilities/macros.hpp"
#include "utilities/ostream.hpp"
#if INCLUDE_ALL_GCS
#include "gc/cms/adaptiveFreeList.hpp"
@@ -1187,31 +1188,33 @@
template <class Chunk_t, class FreeList_t>
void BinaryTreeDictionary<Chunk_t, FreeList_t>::end_sweep_dict_census(double splitSurplusPercent) {
// Does walking the tree 3 times hurt?
set_tree_surplus(splitSurplusPercent);
set_tree_hints();
- if (PrintGC && Verbose) {
- report_statistics();
+ LogHandle(gc, freelist, stats) log;
+ if (log.is_trace()) {
+ ResourceMark rm;
+ report_statistics(log.trace_stream());
}
clear_tree_census();
}
// Print summary statistics
template <class Chunk_t, class FreeList_t>
-void BinaryTreeDictionary<Chunk_t, FreeList_t>::report_statistics() const {
+void BinaryTreeDictionary<Chunk_t, FreeList_t>::report_statistics(outputStream* st) const {
FreeBlockDictionary<Chunk_t>::verify_par_locked();
- gclog_or_tty->print("Statistics for BinaryTreeDictionary:\n"
- "------------------------------------\n");
+ st->print_cr("Statistics for BinaryTreeDictionary:");
+ st->print_cr("------------------------------------");
size_t total_size = total_chunk_size(debug_only(NULL));
size_t free_blocks = num_free_blocks();
- gclog_or_tty->print("Total Free Space: " SIZE_FORMAT "\n", total_size);
- gclog_or_tty->print("Max Chunk Size: " SIZE_FORMAT "\n", max_chunk_size());
- gclog_or_tty->print("Number of Blocks: " SIZE_FORMAT "\n", free_blocks);
+ st->print_cr("Total Free Space: " SIZE_FORMAT, total_size);
+ st->print_cr("Max Chunk Size: " SIZE_FORMAT, max_chunk_size());
+ st->print_cr("Number of Blocks: " SIZE_FORMAT, free_blocks);
if (free_blocks > 0) {
- gclog_or_tty->print("Av. Block Size: " SIZE_FORMAT "\n", total_size/free_blocks);
+ st->print_cr("Av. Block Size: " SIZE_FORMAT, total_size/free_blocks);
}
- gclog_or_tty->print("Tree Height: " SIZE_FORMAT "\n", tree_height());
+ st->print_cr("Tree Height: " SIZE_FORMAT, tree_height());
}
// Print census information - counts, births, deaths, etc.
// for each list in the tree. Also print some summary
// information.
@@ -1227,26 +1230,31 @@
_total_free = 0;
}
FreeList_t* total() { return &_total; }
size_t total_free() { return _total_free; }
void do_list(FreeList<Chunk_t>* fl) {
+ LogHandle(gc, freelist, census) log;
+ outputStream* out = log.debug_stream();
if (++_print_line >= 40) {
- FreeList_t::print_labels_on(gclog_or_tty, "size");
+ ResourceMark rm;
+ FreeList_t::print_labels_on(out, "size");
_print_line = 0;
}
- fl->print_on(gclog_or_tty);
- _total_free += fl->count() * fl->size() ;
- total()->set_count( total()->count() + fl->count() );
+ fl->print_on(out);
+ _total_free += fl->count() * fl->size();
+ total()->set_count(total()->count() + fl->count());
}
#if INCLUDE_ALL_GCS
void do_list(AdaptiveFreeList<Chunk_t>* fl) {
+ LogHandle(gc, freelist, census) log;
+ outputStream* out = log.debug_stream();
if (++_print_line >= 40) {
- FreeList_t::print_labels_on(gclog_or_tty, "size");
+ FreeList_t::print_labels_on(out, "size");
_print_line = 0;
}
- fl->print_on(gclog_or_tty);
+ fl->print_on(out);
_total_free += fl->count() * fl->size() ;
total()->set_count( total()->count() + fl->count() );
total()->set_bfr_surp( total()->bfr_surp() + fl->bfr_surp() );
total()->set_surplus( total()->split_deaths() + fl->surplus() );
total()->set_desired( total()->desired() + fl->desired() );
@@ -1259,36 +1267,34 @@
}
#endif // INCLUDE_ALL_GCS
};
template <class Chunk_t, class FreeList_t>
-void BinaryTreeDictionary<Chunk_t, FreeList_t>::print_dict_census(void) const {
+void BinaryTreeDictionary<Chunk_t, FreeList_t>::print_dict_census(outputStream* st) const {
- gclog_or_tty->print("\nBinaryTree\n");
- FreeList_t::print_labels_on(gclog_or_tty, "size");
+ st->print("BinaryTree");
+ FreeList_t::print_labels_on(st, "size");
PrintTreeCensusClosure<Chunk_t, FreeList_t> ptc;
ptc.do_tree(root());
FreeList_t* total = ptc.total();
- FreeList_t::print_labels_on(gclog_or_tty, " ");
+ FreeList_t::print_labels_on(st, " ");
}
#if INCLUDE_ALL_GCS
template <>
-void AFLBinaryTreeDictionary::print_dict_census(void) const {
+void AFLBinaryTreeDictionary::print_dict_census(outputStream* st) const {
- gclog_or_tty->print("\nBinaryTree\n");
- AdaptiveFreeList<FreeChunk>::print_labels_on(gclog_or_tty, "size");
+ st->print_cr("BinaryTree");
+ AdaptiveFreeList<FreeChunk>::print_labels_on(st, "size");
PrintTreeCensusClosure<FreeChunk, AdaptiveFreeList<FreeChunk> > ptc;
ptc.do_tree(root());
AdaptiveFreeList<FreeChunk>* total = ptc.total();
- AdaptiveFreeList<FreeChunk>::print_labels_on(gclog_or_tty, " ");
- total->print_on(gclog_or_tty, "TOTAL\t");
- gclog_or_tty->print(
- "total_free(words): " SIZE_FORMAT_W(16)
- " growth: %8.5f deficit: %8.5f\n",
+ AdaptiveFreeList<FreeChunk>::print_labels_on(st, " ");
+ total->print_on(st, "TOTAL\t");
+ st->print_cr("total_free(words): " SIZE_FORMAT_W(16) " growth: %8.5f deficit: %8.5f",
ptc.total_free(),
(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())
@@ -1309,11 +1315,11 @@
void do_list(FreeList_t* fl) {
if (++_print_line >= 40) {
FreeList_t::print_labels_on(_st, "size");
_print_line = 0;
}
- fl->print_on(gclog_or_tty);
+ fl->print_on(_st);
size_t sz = fl->size();
for (Chunk_t* fc = fl->head(); fc != NULL;
fc = fc->next()) {
_st->print_cr("\t[" PTR_FORMAT "," PTR_FORMAT ") %s",
p2i(fc), p2i((HeapWord*)fc + sz),
< prev index next >