--- old/src/hotspot/share/memory/metaspace/metaspaceCommon.hpp 2018-05-09 12:24:29.859546910 +0200 +++ new/src/hotspot/share/memory/metaspace/metaspaceCommon.hpp 2018-05-09 12:24:29.699545554 +0200 @@ -25,14 +25,23 @@ #ifndef SHARE_MEMORY_METASPACE_METASPACECOMMON_HPP_ #define SHARE_MEMORY_METASPACE_METASPACECOMMON_HPP_ +#include "utilities/debug.hpp" #include "utilities/globalDefinitions.hpp" - class outputStream; namespace metaspace { namespace internals { +enum ChunkSizes { // in words. + ClassSpecializedChunk = 128, + SpecializedChunk = 128, + ClassSmallChunk = 256, + SmallChunk = 512, + ClassMediumChunk = 4 * K, + MediumChunk = 8 * K +}; + // Print a size, in words, scaled. void print_scaled_words(outputStream* st, size_t word_size, size_t scale = 0, int width = -1); @@ -50,6 +59,72 @@ // larger than 99% but not 100% are displayed as ">100%". void print_percentage(outputStream* st, size_t total, size_t part); + +#define assert_is_aligned(value, alignment) \ + assert(is_aligned((value), (alignment)), \ + SIZE_FORMAT_HEX " is not aligned to " \ + SIZE_FORMAT, (size_t)(uintptr_t)value, (alignment)) + +// Internal statistics. +#ifdef ASSERT +struct internal_statistics_t { + // Number of allocations. + uintx num_allocs; + // Number of times a ClassLoaderMetaspace was born... + uintx num_metaspace_births; + // ... and died. + uintx num_metaspace_deaths; + // Number of times VirtualSpaceListNodes were created... + uintx num_vsnodes_created; + // ... and purged. + uintx num_vsnodes_purged; + // Number of times we expanded the committed section of the space. + uintx num_committed_space_expanded; + // Number of deallocations + uintx num_deallocs; + // Number of deallocations triggered from outside ("real" deallocations). + uintx num_external_deallocs; + // Number of times an allocation was satisfied from deallocated blocks. + uintx num_allocs_from_deallocated_blocks; +}; +extern internal_statistics_t g_internal_statistics; +#endif + +// ChunkIndex defines the type of chunk. +// Chunk types differ by size: specialized < small < medium, chunks +// larger than medium are humongous chunks of varying size. +enum ChunkIndex { + ZeroIndex = 0, + SpecializedIndex = ZeroIndex, + SmallIndex = SpecializedIndex + 1, + MediumIndex = SmallIndex + 1, + HumongousIndex = MediumIndex + 1, + NumberOfFreeLists = 3, + NumberOfInUseLists = 4 +}; + +// Utility functions. +size_t get_size_for_nonhumongous_chunktype(ChunkIndex chunk_type, bool is_class); +ChunkIndex get_chunk_type_by_size(size_t size, bool is_class); + +ChunkIndex next_chunk_index(ChunkIndex i); +ChunkIndex prev_chunk_index(ChunkIndex i); +// Returns a descriptive name for a chunk type. +const char* chunk_size_name(ChunkIndex index); + +// Verify chunk type. +inline bool is_valid_chunktype(ChunkIndex index) { + return index == SpecializedIndex || index == SmallIndex || + index == MediumIndex || index == HumongousIndex; +} + +inline bool is_valid_nonhumongous_chunktype(ChunkIndex index) { + return is_valid_chunktype(index) && index != HumongousIndex; +} + + + + } // namespace internals } // namespace metaspace