--- old/src/share/vm/memory/metaspace.cpp 2015-04-30 00:32:48.871939495 -0700 +++ new/src/share/vm/memory/metaspace.cpp 2015-04-30 00:32:48.827938845 -0700 @@ -252,14 +252,14 @@ // Used to manage the free list of Metablocks (a block corresponds // to the allocation of a quantum of metadata). class BlockFreelist VALUE_OBJ_CLASS_SPEC { - BlockTreeDictionary* _dictionary; + BlockTreeDictionary _dictionary; // Only allocate and split from freelist if the size of the allocation // is at least 1/4th the size of the available block. const static int WasteMultiplier = 4; // Accessors - BlockTreeDictionary* dictionary() const { return _dictionary; } + BlockTreeDictionary* dictionary() { return &_dictionary; } public: BlockFreelist(); @@ -269,13 +269,7 @@ MetaWord* get_block(size_t word_size); void return_block(MetaWord* p, size_t word_size); - size_t total_size() { - if (dictionary() == NULL) { - return 0; - } else { - return dictionary()->total_size(); - } -} + size_t total_size() { return dictionary()->total_size(); } void print_on(outputStream* st) const; }; @@ -814,30 +808,20 @@ // BlockFreelist methods -BlockFreelist::BlockFreelist() : _dictionary(NULL) {} +BlockFreelist::BlockFreelist() : _dictionary() {} BlockFreelist::~BlockFreelist() { - if (_dictionary != NULL) { - if (Verbose && TraceMetadataChunkAllocation) { - _dictionary->print_free_lists(gclog_or_tty); - } - delete _dictionary; + if (Verbose && TraceMetadataChunkAllocation) { + dictionary()->print_free_lists(gclog_or_tty); } } void BlockFreelist::return_block(MetaWord* p, size_t word_size) { Metablock* free_chunk = ::new (p) Metablock(word_size); - if (dictionary() == NULL) { - _dictionary = new BlockTreeDictionary(); - } dictionary()->return_chunk(free_chunk); } MetaWord* BlockFreelist::get_block(size_t word_size) { - if (dictionary() == NULL) { - return NULL; - } - if (word_size < TreeChunk >::min_size()) { // Dark matter. Too small for dictionary. return NULL; @@ -866,10 +850,7 @@ } void BlockFreelist::print_on(outputStream* st) const { - if (dictionary() == NULL) { - return; - } - dictionary()->print_free_lists(st); + const_cast(this)->dictionary()->print_free_lists(st); } // VirtualSpaceNode methods