< prev index next >

src/hotspot/share/memory/metaspace/metaspaceStatistics.cpp

Print this page
rev 57511 : [mq]: metaspace-improvement

*** 22,264 **** * questions. * */ #include "precompiled.hpp" ! #include "memory/metaspace/metachunk.hpp" #include "memory/metaspace/metaspaceCommon.hpp" #include "memory/metaspace/metaspaceStatistics.hpp" #include "utilities/debug.hpp" #include "utilities/globalDefinitions.hpp" #include "utilities/ostream.hpp" namespace metaspace { - // FreeChunksStatistics methods - - FreeChunksStatistics::FreeChunksStatistics() - : _num(0), _cap(0) - {} - - void FreeChunksStatistics::reset() { - _num = 0; _cap = 0; - } - - void FreeChunksStatistics::add(uintx n, size_t s) { - _num += n; _cap += s; - } - - void FreeChunksStatistics::add(const FreeChunksStatistics& other) { - _num += other._num; - _cap += other._cap; - } - - void FreeChunksStatistics::print_on(outputStream* st, size_t scale) const { - st->print(UINTX_FORMAT, _num); - st->print(" chunks, total capacity "); - print_scaled_words(st, _cap, scale); - } - // ChunkManagerStatistics methods ! void ChunkManagerStatistics::reset() { ! for (ChunkIndex i = ZeroIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { ! _chunk_stats[i].reset(); } } size_t ChunkManagerStatistics::total_capacity() const { ! return _chunk_stats[SpecializedIndex].cap() + ! _chunk_stats[SmallIndex].cap() + ! _chunk_stats[MediumIndex].cap() + ! _chunk_stats[HumongousIndex].cap(); } void ChunkManagerStatistics::print_on(outputStream* st, size_t scale) const { ! FreeChunksStatistics totals; ! for (ChunkIndex i = ZeroIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { st->cr(); ! st->print("%12s chunks: ", chunk_size_name(i)); ! if (_chunk_stats[i].num() > 0) { ! st->print(UINTX_FORMAT_W(4) ", capacity ", _chunk_stats[i].num()); ! print_scaled_words(st, _chunk_stats[i].cap(), scale); } else { st->print("(none)"); } - totals.add(_chunk_stats[i]); } st->cr(); ! st->print("%19s: " UINTX_FORMAT_W(4) ", capacity=", "Total", totals.num()); ! print_scaled_words(st, totals.cap(), scale); st->cr(); } // UsedChunksStatistics methods - UsedChunksStatistics::UsedChunksStatistics() - : _num(0), _cap(0), _used(0), _free(0), _waste(0), _overhead(0) - {} - - void UsedChunksStatistics::reset() { - _num = 0; - _cap = _overhead = _used = _free = _waste = 0; - } - - void UsedChunksStatistics::add(const UsedChunksStatistics& other) { - _num += other._num; - _cap += other._cap; - _used += other._used; - _free += other._free; - _waste += other._waste; - _overhead += other._overhead; - DEBUG_ONLY(check_sanity()); - } - void UsedChunksStatistics::print_on(outputStream* st, size_t scale) const { int col = st->position(); ! st->print(UINTX_FORMAT_W(4) " chunk%s, ", _num, _num != 1 ? "s" : ""); ! if (_num > 0) { col += 14; st->fill_to(col); ! print_scaled_words(st, _cap, scale, 5); st->print(" capacity, "); col += 18; st->fill_to(col); ! print_scaled_words_and_percentage(st, _used, _cap, scale, 5); st->print(" used, "); col += 20; st->fill_to(col); ! print_scaled_words_and_percentage(st, _free, _cap, scale, 5); st->print(" free, "); col += 20; st->fill_to(col); ! print_scaled_words_and_percentage(st, _waste, _cap, scale, 5); ! st->print(" waste, "); - col += 20; st->fill_to(col); - print_scaled_words_and_percentage(st, _overhead, _cap, scale, 5); - st->print(" overhead"); } DEBUG_ONLY(check_sanity()); } #ifdef ASSERT void UsedChunksStatistics::check_sanity() const { ! assert(_overhead == (Metachunk::overhead() * _num), "Sanity: Overhead."); ! assert(_cap == _used + _free + _waste + _overhead, "Sanity: Capacity."); } #endif // SpaceManagerStatistics methods - SpaceManagerStatistics::SpaceManagerStatistics() { reset(); } - - void SpaceManagerStatistics::reset() { - for (int i = 0; i < NumberOfInUseLists; i ++) { - _chunk_stats[i].reset(); - _free_blocks_num = 0; _free_blocks_cap_words = 0; - } - } - - void SpaceManagerStatistics::add_free_blocks_info(uintx num, size_t cap) { - _free_blocks_num += num; - _free_blocks_cap_words += cap; - } - void SpaceManagerStatistics::add(const SpaceManagerStatistics& other) { ! for (ChunkIndex i = ZeroIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { ! _chunk_stats[i].add(other._chunk_stats[i]); } ! _free_blocks_num += other._free_blocks_num; ! _free_blocks_cap_words += other._free_blocks_cap_words; } // Returns total chunk statistics over all chunk types. UsedChunksStatistics SpaceManagerStatistics::totals() const { UsedChunksStatistics stat; ! for (ChunkIndex i = ZeroIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { ! stat.add(_chunk_stats[i]); } return stat; } void SpaceManagerStatistics::print_on(outputStream* st, size_t scale, bool detailed) const { streamIndentor sti(st); if (detailed) { st->cr_indent(); ! st->print("Usage by chunk type:"); { streamIndentor sti2(st); ! for (ChunkIndex i = ZeroIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { st->cr_indent(); ! st->print("%15s: ", chunk_size_name(i)); ! if (_chunk_stats[i].num() == 0) { st->print(" (none)"); } else { ! _chunk_stats[i].print_on(st, scale); } } st->cr_indent(); st->print("%15s: ", "-total-"); totals().print_on(st, scale); } ! if (_free_blocks_num > 0) { st->cr_indent(); ! st->print("deallocated: " UINTX_FORMAT " blocks with ", _free_blocks_num); ! print_scaled_words(st, _free_blocks_cap_words, scale); } } else { totals().print_on(st, scale); st->print(", "); ! st->print("deallocated: " UINTX_FORMAT " blocks with ", _free_blocks_num); ! print_scaled_words(st, _free_blocks_cap_words, scale); } } // ClassLoaderMetaspaceStatistics methods - ClassLoaderMetaspaceStatistics::ClassLoaderMetaspaceStatistics() { reset(); } - - void ClassLoaderMetaspaceStatistics::reset() { - nonclass_sm_stats().reset(); - if (Metaspace::using_class_space()) { - class_sm_stats().reset(); - } - } - // Returns total space manager statistics for both class and non-class metaspace SpaceManagerStatistics ClassLoaderMetaspaceStatistics::totals() const { SpaceManagerStatistics stats; ! stats.add(nonclass_sm_stats()); ! if (Metaspace::using_class_space()) { ! stats.add(class_sm_stats()); ! } return stats; } - void ClassLoaderMetaspaceStatistics::add(const ClassLoaderMetaspaceStatistics& other) { - nonclass_sm_stats().add(other.nonclass_sm_stats()); - if (Metaspace::using_class_space()) { - class_sm_stats().add(other.class_sm_stats()); - } - } - void ClassLoaderMetaspaceStatistics::print_on(outputStream* st, size_t scale, bool detailed) const { streamIndentor sti(st); st->cr_indent(); if (Metaspace::using_class_space()) { st->print("Non-Class: "); } ! nonclass_sm_stats().print_on(st, scale, detailed); if (detailed) { st->cr(); } if (Metaspace::using_class_space()) { st->cr_indent(); st->print(" Class: "); ! class_sm_stats().print_on(st, scale, detailed); if (detailed) { st->cr(); } st->cr_indent(); st->print(" Both: "); --- 22,198 ---- * questions. * */ #include "precompiled.hpp" ! ! #include "memory/metaspace/chunkLevel.hpp" #include "memory/metaspace/metaspaceCommon.hpp" #include "memory/metaspace/metaspaceStatistics.hpp" + #include "utilities/debug.hpp" #include "utilities/globalDefinitions.hpp" #include "utilities/ostream.hpp" namespace metaspace { // ChunkManagerStatistics methods ! ChunkManagerStatistics::ChunkManagerStatistics() { ! for (chklvl_t l = chklvl::LOWEST_CHUNK_LEVEL; l <= chklvl::HIGHEST_CHUNK_LEVEL; l ++) { ! num_chunks[l] = 0; ! committed_word_size[l] = 0; } } size_t ChunkManagerStatistics::total_capacity() const { ! size_t cap = 0; ! for (chklvl_t l = chklvl::LOWEST_CHUNK_LEVEL; l <= chklvl::HIGHEST_CHUNK_LEVEL; l ++) { ! cap += num_chunks[l] * chklvl::word_size_for_level(l); ! } ! return cap; } void ChunkManagerStatistics::print_on(outputStream* st, size_t scale) const { ! size_t total_size = 0; ! size_t total_committed_size = 0; ! for (chklvl_t l = chklvl::LOWEST_CHUNK_LEVEL; l <= chklvl::HIGHEST_CHUNK_LEVEL; l ++) { st->cr(); ! st->print(SIZE_FORMAT "K chunks: ", (chklvl::word_size_for_level(l) * BytesPerWord) / K); ! if (num_chunks[l] > 0) { ! const size_t word_size = num_chunks[l] * chklvl::word_size_for_level(l); ! ! st->print("%4d, capacity=", num_chunks[l]); ! print_scaled_words(st, word_size, scale); ! ! st->print(", committed="); ! print_scaled_words_and_percentage(st, committed_word_size[l], word_size, scale); ! ! total_size += word_size; ! total_committed_size += committed_word_size[l]; } else { st->print("(none)"); } } st->cr(); ! st->print("Total capacity: "); ! print_scaled_words(st, total_size, scale); ! st->print(", committed: "); ! print_scaled_words_and_percentage(st, total_committed_size, total_size, scale); st->cr(); } // UsedChunksStatistics methods void UsedChunksStatistics::print_on(outputStream* st, size_t scale) const { int col = st->position(); ! st->print("%4d chunk%s, ", num, num != 1 ? "s" : ""); ! if (num > 0) { col += 14; st->fill_to(col); ! print_scaled_words(st, cap, scale, 5); st->print(" capacity, "); col += 18; st->fill_to(col); ! print_scaled_words_and_percentage(st, used, cap, scale, 5); st->print(" used, "); col += 20; st->fill_to(col); ! print_scaled_words_and_percentage(st, free, cap, scale, 5); st->print(" free, "); col += 20; st->fill_to(col); ! print_scaled_words_and_percentage(st, waste, cap, scale, 5); ! st->print(" waste "); } DEBUG_ONLY(check_sanity()); } #ifdef ASSERT void UsedChunksStatistics::check_sanity() const { ! assert(cap == used + free + waste, "Sanity: Capacity."); } #endif // SpaceManagerStatistics methods void SpaceManagerStatistics::add(const SpaceManagerStatistics& other) { ! for (chklvl_t l = chklvl::LOWEST_CHUNK_LEVEL; l <= chklvl::HIGHEST_CHUNK_LEVEL; l ++) { ! chunk_stats[l].add(other.chunk_stats[l]); } ! free_blocks_num += other.free_blocks_num; ! free_blocks_word_size += other.free_blocks_word_size; } // Returns total chunk statistics over all chunk types. UsedChunksStatistics SpaceManagerStatistics::totals() const { UsedChunksStatistics stat; ! for (chklvl_t l = chklvl::LOWEST_CHUNK_LEVEL; l <= chklvl::HIGHEST_CHUNK_LEVEL; l ++) { ! stat.add(chunk_stats[l]); } return stat; } void SpaceManagerStatistics::print_on(outputStream* st, size_t scale, bool detailed) const { streamIndentor sti(st); if (detailed) { st->cr_indent(); ! st->print("Usage by chunk level:"); { streamIndentor sti2(st); ! for (chklvl_t l = chklvl::LOWEST_CHUNK_LEVEL; l <= chklvl::HIGHEST_CHUNK_LEVEL; l ++) { st->cr_indent(); ! st->print(SIZE_FORMAT "k chunks: ", (chklvl::word_size_for_level(l) * BytesPerWord) / K); ! if (chunk_stats[l].num == 0) { st->print(" (none)"); } else { ! chunk_stats[l].print_on(st, scale); } } st->cr_indent(); st->print("%15s: ", "-total-"); totals().print_on(st, scale); } ! if (free_blocks_num > 0) { st->cr_indent(); ! st->print("deallocated: " UINTX_FORMAT " blocks with ", free_blocks_num); ! print_scaled_words(st, free_blocks_word_size, scale); } } else { totals().print_on(st, scale); st->print(", "); ! st->print("deallocated: " UINTX_FORMAT " blocks with ", free_blocks_num); ! print_scaled_words(st, free_blocks_word_size, scale); } } // ClassLoaderMetaspaceStatistics methods // Returns total space manager statistics for both class and non-class metaspace SpaceManagerStatistics ClassLoaderMetaspaceStatistics::totals() const { SpaceManagerStatistics stats; ! stats.add(sm_stats[ClassType]); ! stats.add(sm_stats[NonClassType]); return stats; } void ClassLoaderMetaspaceStatistics::print_on(outputStream* st, size_t scale, bool detailed) const { streamIndentor sti(st); st->cr_indent(); if (Metaspace::using_class_space()) { st->print("Non-Class: "); } ! sm_stats[NonClassType].print_on(st, scale, detailed); if (detailed) { st->cr(); } if (Metaspace::using_class_space()) { st->cr_indent(); st->print(" Class: "); ! sm_stats[ClassType].print_on(st, scale, detailed); if (detailed) { st->cr(); } st->cr_indent(); st->print(" Both: ");
< prev index next >