src/hotspot/share/memory/metaspace/spaceManager.cpp
author stuefe
Fri, 01 Nov 2019 10:28:15 +0100
branchstuefe-new-metaspace-branch
changeset 59155 b537e6386306
parent 59107 245a39d9e24d
permissions -rw-r--r--
LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     1
/*
54623
1126f0607c70 8222811: Consolidate MutexLockerEx and MutexLocker
coleenp
parents: 53970
diff changeset
     2
 * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
     3
 * Copyright (c) 2018, 2019 SAP SE. All rights reserved.
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     4
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     5
 *
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     6
 * This code is free software; you can redistribute it and/or modify it
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     7
 * under the terms of the GNU General Public License version 2 only, as
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     8
 * published by the Free Software Foundation.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     9
 *
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    14
 * accompanied this code).
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    15
 *
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    19
 *
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    22
 * questions.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    23
 *
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    24
 */
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    25
#include "precompiled.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    26
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    27
#include "logging/log.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    28
#include "logging/logStream.hpp"
59155
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
    29
#include "memory/metaspace/blockFreelist.hpp"
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    30
#include "memory/metaspace/chunkManager.hpp"
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    31
#include "memory/metaspace/internStat.hpp"
59155
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
    32
#include "memory/metaspace/leftOverBins.inline.hpp"
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    33
#include "memory/metaspace/metachunk.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    34
#include "memory/metaspace/metaDebug.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    35
#include "memory/metaspace/metaspaceCommon.hpp"
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    36
#include "memory/metaspace/metaspaceStatistics.hpp"
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    37
#include "memory/metaspace/smallBlocks.hpp"
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    38
#include "memory/metaspace/spaceManager.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    39
#include "memory/metaspace/virtualSpaceList.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    40
#include "runtime/atomic.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    41
#include "runtime/init.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    42
#include "services/memoryService.hpp"
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    43
#include "utilities/align.hpp"
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    44
#include "utilities/debug.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    45
#include "utilities/globalDefinitions.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    46
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    47
namespace metaspace {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    48
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
    49
#define LOGFMT_SPCMGR         "SpcMgr @" PTR_FORMAT " (%s)"
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
    50
#define LOGFMT_SPCMGR_ARGS    p2i(this), this->_name
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
    51
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
    52
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    53
// Given a net allocation word size, return the raw word size
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    54
// we need to actually allocate in order to:
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    55
// 1) be able to deallocate the allocation - deallocated blocks are stored either in SmallBlocks
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    56
//    (an array of short lists) or, beyond a certain size, in a dictionary tree.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    57
//    For that to work the allocated block must be at least three words.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    58
// 2) be aligned to sizeof(void*)
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    59
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    60
// Note: externally visible for gtests.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    61
//static
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    62
size_t get_raw_allocation_word_size(size_t net_word_size) {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    63
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    64
  size_t byte_size = net_word_size * BytesPerWord;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    65
  byte_size = MAX2(byte_size, (size_t)SmallBlocks::small_block_min_byte_size());
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    66
  byte_size = align_up(byte_size, Metachunk::allocation_alignment_bytes);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    67
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    68
  size_t word_size = byte_size / BytesPerWord;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    69
  assert(word_size * BytesPerWord == byte_size, "Sanity");
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    70
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    71
  return word_size;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    72
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    73
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    74
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    75
static const size_t highest_possible_delta_between_raw_and_net_size = get_raw_allocation_word_size(1) - 1;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    76
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    77
// The inverse function to get_raw_allocation_word_size: Given a raw size, return the max net word size
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    78
// fitting into it.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    79
static size_t get_net_allocation_word_size(size_t raw_word_size) {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    80
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    81
  size_t byte_size = raw_word_size * BytesPerWord;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    82
  byte_size = align_down(byte_size, Metachunk::allocation_alignment_bytes);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    83
  if (byte_size < SmallBlocks::small_block_min_byte_size()) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    84
    return 0;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    85
  }
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    86
  return byte_size / BytesPerWord;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    87
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    88
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    89
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    90
// Given a requested word size, will allocate a chunk large enough to at least fit that
58085
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
    91
// size, but may be larger according to internal heuristics.
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
    92
//
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
    93
// On success, it will replace the current chunk with the newly allocated one, which will
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
    94
// become the current chunk. The old current chunk should be retired beforehand.
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
    95
//
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
    96
// May fail if we could not allocate a new chunk. In that case the current chunk remains
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
    97
// unchanged and false is returned.
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
    98
bool SpaceManager::allocate_new_current_chunk(size_t requested_word_size) {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    99
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   100
  assert_lock_strong(lock());
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   101
58228
6e61beb13680 Fix gc/class_unloading/.. tests
stuefe
parents: 58227
diff changeset
   102
  guarantee(requested_word_size <= chklvl::MAX_CHUNK_WORD_SIZE,
6e61beb13680 Fix gc/class_unloading/.. tests
stuefe
parents: 58227
diff changeset
   103
            "Requested size too large (" SIZE_FORMAT ") - max allowed size per allocation is " SIZE_FORMAT ".",
6e61beb13680 Fix gc/class_unloading/.. tests
stuefe
parents: 58227
diff changeset
   104
            requested_word_size, chklvl::MAX_CHUNK_WORD_SIZE);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   105
58085
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   106
  // If we have a current chunk, it should have been retired (almost empty) beforehand.
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   107
  // See: retire_current_chunk().
58883
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   108
  assert(current_chunk() == NULL ||
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   109
         (_is_micro_loader || current_chunk()->free_below_committed_words() <= 10), "Must retire chunk beforehand");
58085
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   110
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   111
  const chklvl_t min_level = chklvl::level_fitting_word_size(requested_word_size);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   112
  chklvl_t pref_level = _chunk_alloc_sequence->get_next_chunk_level(_chunks.size());
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   113
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   114
  if (pref_level > min_level) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   115
    pref_level = min_level;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   116
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   117
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   118
  log_trace(metaspace)(LOGFMT_SPCMGR ": requested word size_ " SIZE_FORMAT ", num chunks so far: %d, preferred level: "
58716
960e372a6065 Fix error in chunk allocation strategy which caused small chunks to dominate
stuefe
parents: 58683
diff changeset
   119
                       CHKLVL_FORMAT ", min level: " CHKLVL_FORMAT ".",
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   120
                       LOGFMT_SPCMGR_ARGS, requested_word_size, _chunks.size(), pref_level, min_level);
58716
960e372a6065 Fix error in chunk allocation strategy which caused small chunks to dominate
stuefe
parents: 58683
diff changeset
   121
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   122
  Metachunk* c = _chunk_manager->get_chunk(min_level, pref_level);
58085
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   123
  if (c == NULL) {
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   124
    log_debug(metaspace)(LOGFMT_SPCMGR ": failed to allocate new chunk for requested word size " SIZE_FORMAT ".",
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   125
                         LOGFMT_SPCMGR_ARGS, requested_word_size);
58085
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   126
    return false;
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   127
  }
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   128
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   129
  assert(c->is_in_use(), "Wrong chunk state.");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   130
  assert(c->level() <= min_level && c->level() >= pref_level, "Sanity");
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   131
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   132
  _chunks.add(c);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   133
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   134
  log_debug(metaspace)(LOGFMT_SPCMGR ": allocated new chunk " METACHUNK_FORMAT " for requested word size " SIZE_FORMAT ".",
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   135
                       LOGFMT_SPCMGR_ARGS, METACHUNK_FORMAT_ARGS(c), requested_word_size);
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   136
58840
7678903a348f Add workaround for 8233019
stuefe
parents: 58716
diff changeset
   137
  // Workaround for JDK-8233019: never return space allocated at a 32bit aligned address
7678903a348f Add workaround for 8233019
stuefe
parents: 58716
diff changeset
   138
  if (Settings::do_not_return_32bit_aligned_addresses() &&
7678903a348f Add workaround for 8233019
stuefe
parents: 58716
diff changeset
   139
      (((intptr_t)c->base()) & 0xFFFFFFFF) == 0)
7678903a348f Add workaround for 8233019
stuefe
parents: 58716
diff changeset
   140
  {
7678903a348f Add workaround for 8233019
stuefe
parents: 58716
diff changeset
   141
    bool ignored;
7678903a348f Add workaround for 8233019
stuefe
parents: 58716
diff changeset
   142
    c->allocate(1, &ignored);
59107
245a39d9e24d Fix counter mismatch after workaround for JDK-8233019
stuefe
parents: 58883
diff changeset
   143
    _total_used_words_counter->increment();
58840
7678903a348f Add workaround for 8233019
stuefe
parents: 58716
diff changeset
   144
  }
7678903a348f Add workaround for 8233019
stuefe
parents: 58716
diff changeset
   145
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   146
  return c;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   147
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   148
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   149
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   150
void SpaceManager::create_block_freelist() {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   151
  assert(_block_freelist == NULL, "Only call once");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   152
  _block_freelist = new BlockFreelist();
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   153
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   154
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   155
void SpaceManager::add_allocation_to_block_freelist(MetaWord* p, size_t word_size) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   156
  if (_block_freelist == NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   157
    _block_freelist = new BlockFreelist(); // Create only on demand
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   158
  }
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   159
  _block_freelist->return_block(p, word_size);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   160
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   161
59155
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   162
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   163
void SpaceManager::create_lom() {
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   164
  assert(_lom == NULL, "Only call once");
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   165
  _lom = new LeftOverManager();
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   166
}
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   167
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   168
void SpaceManager::add_allocation_to_lom(MetaWord* p, size_t word_size) {
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   169
  if (_lom == NULL) {
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   170
    _lom = new LeftOverManager(); // Create only on demand
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   171
  }
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   172
  _lom->add_block(p, word_size);
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   173
}
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   174
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   175
SpaceManager::SpaceManager(ChunkManager* chunk_manager,
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   176
             const ChunkAllocSequence* alloc_sequence,
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   177
             Mutex* lock,
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   178
             SizeAtomicCounter* total_used_words_counter,
58883
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   179
             const char* name,
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   180
             bool is_micro_loader)
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   181
: _lock(lock),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   182
  _chunk_manager(chunk_manager),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   183
  _chunk_alloc_sequence(alloc_sequence),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   184
  _chunks(),
59155
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   185
  _block_freelist(NULL), _lom(NULL),
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   186
  _total_used_words_counter(total_used_words_counter),
58883
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   187
  _name(name),
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   188
  _is_micro_loader(is_micro_loader)
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   189
{
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   190
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   191
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   192
SpaceManager::~SpaceManager() {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   193
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   194
  MutexLocker fcl(lock(), Mutex::_no_safepoint_check_flag);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   195
  Metachunk* c = _chunks.first();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   196
  Metachunk* c2 = NULL;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   197
  while(c) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   198
    // c may become invalid. Take care while iterating.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   199
    c2 = c->next();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   200
    _total_used_words_counter->decrement_by(c->used_words());
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   201
    _chunks.remove(c);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   202
    _chunk_manager->return_chunk(c);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   203
    c = c2;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   204
  }
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   205
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   206
  DEBUG_ONLY(chunk_manager()->verify(true);)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   207
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   208
  delete _block_freelist;
59155
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   209
  delete _lom;
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   210
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   211
}
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   212
58085
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   213
// The remaining committed free space in the current chunk is chopped up and stored in the block
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   214
// free list for later use. As a result, the current chunk will remain current but completely
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   215
// used up. This is a preparation for calling allocate_new_current_chunk().
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   216
void SpaceManager::retire_current_chunk() {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   217
  assert_lock_strong(lock());
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   218
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   219
  Metachunk* c = current_chunk();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   220
  assert(c != NULL, "Sanity");
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   221
58085
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   222
  // Side note:
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   223
  // In theory it could happen that we are asked to retire a completely empty chunk. This may be the
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   224
  // result of rolled back allocations (see deallocate in place) and a lot of luck.
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   225
  // But since these cases should be exceedingly rare, we do not handle them special in order to keep
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   226
  // the code simple.
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   227
58085
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   228
  size_t raw_remaining_words = c->free_below_committed_words();
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   229
  size_t net_remaining_words = get_net_allocation_word_size(raw_remaining_words);
58883
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   230
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   231
  // Note: Micro class loaders (lambdas, reflection) are typically the vast majority of loaders. They
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   232
  //  will typically only once - if at all - ever retire a chunk, and the remaining size is typically
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   233
  //  very small.
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   234
  // That means that the structure needed to manage this left over space will not see much action. However,
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   235
  //  that structure is expensive as well (pointer lists) and therefore we only should generate it if the
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   236
  //  benefit of managing free space out-weights the costs for that structure.
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   237
  // Non-micro loaders may continue loading, deallocating and retiring more chunks, so the cost of that
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   238
  //  structure may amortize over time. But micro loaders probably never will.
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   239
  const size_t dont_bother_below_word_size = _is_micro_loader ? 64 : 0;
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   240
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   241
  if (net_remaining_words > dont_bother_below_word_size) {
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   242
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   243
    log_debug(metaspace)(LOGFMT_SPCMGR " @" PTR_FORMAT " : retiring chunk " METACHUNK_FULL_FORMAT ".",
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   244
                         LOGFMT_SPCMGR_ARGS, p2i(this), METACHUNK_FULL_FORMAT_ARGS(c));
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   245
58085
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   246
    bool did_hit_limit = false;
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   247
    MetaWord* ptr = c->allocate(net_remaining_words, &did_hit_limit);
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   248
    assert(ptr != NULL && did_hit_limit == false, "Should have worked");
59155
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   249
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   250
    if (Settings::use_lom()) {
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   251
      add_allocation_to_lom(ptr, net_remaining_words);
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   252
    } else {
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   253
      add_allocation_to_block_freelist(ptr, net_remaining_words);
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   254
    }
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   255
58085
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   256
    _total_used_words_counter->increment_by(net_remaining_words);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   257
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   258
    // After this operation: the current chunk should have (almost) no free committed space left.
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   259
    assert(current_chunk()->free_below_committed_words() <= highest_possible_delta_between_raw_and_net_size,
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   260
           "Chunk retiring did not work (current chunk " METACHUNK_FULL_FORMAT ").",
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   261
           METACHUNK_FULL_FORMAT_ARGS(current_chunk()));
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   262
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   263
    DEBUG_ONLY(verify_locked();)
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   264
58883
08102295011d Micro loaders shall not retire chunks if the costs for retiring chunks outqweights the saved space
stuefe
parents: 58882
diff changeset
   265
    DEBUG_ONLY(InternalStats::inc_num_chunks_retired();)
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   266
  }
58227
0e7d9a23261e Fix various test issues.
stuefe
parents: 58085
diff changeset
   267
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   268
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   269
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   270
// Allocate memory from Metaspace.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   271
// 1) Attempt to allocate from the dictionary of deallocated blocks.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   272
// 2) Attempt to allocate from the current chunk.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   273
// 3) Attempt to enlarge the current chunk in place if it is too small.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   274
// 4) Attempt to get a new chunk and allocate from that chunk.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   275
// At any point, if we hit a commit limit, we return NULL.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   276
MetaWord* SpaceManager::allocate(size_t requested_word_size) {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   277
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   278
  MutexLocker cl(lock(), Mutex::_no_safepoint_check_flag);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   279
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   280
  const size_t raw_word_size = get_raw_allocation_word_size(requested_word_size);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   281
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   282
  log_debug(metaspace)(LOGFMT_SPCMGR ": requested " SIZE_FORMAT " words, "
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   283
                       "raw word size: " SIZE_FORMAT ".",
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   284
                       LOGFMT_SPCMGR_ARGS, requested_word_size, raw_word_size);
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   285
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   286
  MetaWord* p = NULL;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   287
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   288
  bool did_hit_limit = false;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   289
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   290
  // Allocate first chunk if needed.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   291
  if (current_chunk() == NULL) {
58085
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   292
    if (allocate_new_current_chunk(raw_word_size) == false) {
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   293
      did_hit_limit = true;
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   294
    } else {
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   295
      assert(current_chunk() != NULL && current_chunk()->free_words() >= raw_word_size, "Sanity");
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   296
    }
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   297
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   298
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   299
  // 1) Attempt to allocate from the dictionary of deallocated blocks.
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   300
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   301
  // Allocation from the dictionary is expensive in the sense that
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   302
  // the dictionary has to be searched for a size.  Don't allocate
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   303
  // from the dictionary until it starts to get fat.  Is this
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   304
  // a reasonable policy?  Maybe an skinny dictionary is fast enough
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   305
  // for allocations.  Do some profiling.  JJJ
59155
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   306
  if (Settings::use_lom()) {
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   307
    if (_lom != NULL) {
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   308
      p = _lom->get_block(raw_word_size);
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   309
      if (p != NULL) {
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   310
        DEBUG_ONLY(InternalStats::inc_num_allocs_from_deallocated_blocks();)
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   311
        log_trace(metaspace)(LOGFMT_SPCMGR ": .. taken from freelist.", LOGFMT_SPCMGR_ARGS);
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   312
        // Note: space in the freeblock dictionary counts as used (see retire_current_chunk()) -
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   313
        // that means that we must not increase the used counter again when allocating from the dictionary.
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   314
        // Therefore we return here.
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   315
        return p;
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   316
      }
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   317
    }
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   318
  } else {
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   319
  if (_block_freelist != NULL && _block_freelist->total_size() > Settings::allocation_from_dictionary_limit()) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   320
    p = _block_freelist->get_block(raw_word_size);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   321
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   322
    if (p != NULL) {
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   323
      DEBUG_ONLY(InternalStats::inc_num_allocs_from_deallocated_blocks();)
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   324
      log_trace(metaspace)(LOGFMT_SPCMGR ": .. taken from freelist.", LOGFMT_SPCMGR_ARGS);
58475
e3aa9f95b85e Fix issue with statistics which caused Metaspace::used_words() to be too high
stuefe
parents: 58382
diff changeset
   325
      // Note: space in the freeblock dictionary counts as used (see retire_current_chunk()) -
e3aa9f95b85e Fix issue with statistics which caused Metaspace::used_words() to be too high
stuefe
parents: 58382
diff changeset
   326
      // that means that we must not increase the used counter again when allocating from the dictionary.
e3aa9f95b85e Fix issue with statistics which caused Metaspace::used_words() to be too high
stuefe
parents: 58382
diff changeset
   327
      // Therefore we return here.
e3aa9f95b85e Fix issue with statistics which caused Metaspace::used_words() to be too high
stuefe
parents: 58382
diff changeset
   328
      return p;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   329
    }
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   330
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   331
  }
59155
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   332
  }
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   333
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   334
  // 2) Failing that, attempt to allocate from the current chunk. If we hit commit limit, return NULL.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   335
  if (p == NULL && !did_hit_limit) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   336
    p = current_chunk()->allocate(raw_word_size, &did_hit_limit);
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   337
    log_trace(metaspace)(LOGFMT_SPCMGR ": .. taken from current chunk.", LOGFMT_SPCMGR_ARGS);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   338
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   339
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   340
  // 3) Failing that because the remaining chunk space is too small for the requested size
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   341
  //     (and not because commit limit), attempt to enlarge the chunk in place.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   342
  if (p == NULL && !did_hit_limit) {
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 51444
diff changeset
   343
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   344
    // Since we did not hit the commit limit, the current chunk must have been too small.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   345
    assert(current_chunk()->free_words() < raw_word_size, "Sanity");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   346
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   347
    DEBUG_ONLY(InternalStats::inc_num_allocs_failed_chunk_too_small();)
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   348
58382
2e16658b7776 do not enlarge chunks faster than chunk alloc strategy would allow
stuefe
parents: 58228
diff changeset
   349
    // Under certain conditions we can just attempt to enlarge the chunk - fusing it with its follower
2e16658b7776 do not enlarge chunks faster than chunk alloc strategy would allow
stuefe
parents: 58228
diff changeset
   350
    // chunk to produce a chunk double the size (level decreased by 1).
2e16658b7776 do not enlarge chunks faster than chunk alloc strategy would allow
stuefe
parents: 58228
diff changeset
   351
    // 0) only if it is not switched off
2e16658b7776 do not enlarge chunks faster than chunk alloc strategy would allow
stuefe
parents: 58228
diff changeset
   352
    // 1) obviously, this only works for non-root chunks
2e16658b7776 do not enlarge chunks faster than chunk alloc strategy would allow
stuefe
parents: 58228
diff changeset
   353
    // 2) ... which are leader of their buddy pair.
2e16658b7776 do not enlarge chunks faster than chunk alloc strategy would allow
stuefe
parents: 58228
diff changeset
   354
    // 3) only if the requested allocation would fit into a thus enlarged chunk
2e16658b7776 do not enlarge chunks faster than chunk alloc strategy would allow
stuefe
parents: 58228
diff changeset
   355
    // 4) do not grow memory faster than what the chunk allocation strategy would allow
2e16658b7776 do not enlarge chunks faster than chunk alloc strategy would allow
stuefe
parents: 58228
diff changeset
   356
    // 5) as a safety feature, only below a certain limit
2e16658b7776 do not enlarge chunks faster than chunk alloc strategy would allow
stuefe
parents: 58228
diff changeset
   357
    if (Settings::enlarge_chunks_in_place() &&              // 0
2e16658b7776 do not enlarge chunks faster than chunk alloc strategy would allow
stuefe
parents: 58228
diff changeset
   358
        current_chunk()->is_root_chunk() == false &&        // 1
2e16658b7776 do not enlarge chunks faster than chunk alloc strategy would allow
stuefe
parents: 58228
diff changeset
   359
        current_chunk()->is_leader() &&                     // 2
2e16658b7776 do not enlarge chunks faster than chunk alloc strategy would allow
stuefe
parents: 58228
diff changeset
   360
        current_chunk()->word_size() + current_chunk()->free_words() >= requested_word_size &&      // 3
2e16658b7776 do not enlarge chunks faster than chunk alloc strategy would allow
stuefe
parents: 58228
diff changeset
   361
        _chunk_alloc_sequence->get_next_chunk_level(_chunks.size()) <= current_chunk()->level() &&  // 4
2e16658b7776 do not enlarge chunks faster than chunk alloc strategy would allow
stuefe
parents: 58228
diff changeset
   362
        current_chunk()->word_size() <= Settings::enlarge_chunks_in_place_max_word_size())          // 5
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   363
    {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   364
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   365
      if (_chunk_manager->attempt_enlarge_chunk(current_chunk())) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   366
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   367
        // Re-attempt allocation.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   368
        p = current_chunk()->allocate(raw_word_size, &did_hit_limit);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   369
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   370
        if (p != NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   371
          DEBUG_ONLY(InternalStats::inc_num_chunk_enlarged();)
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   372
          log_trace(metaspace)(LOGFMT_SPCMGR ": .. taken from current chunk (enlarged chunk).", LOGFMT_SPCMGR_ARGS);
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   373
        }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   374
      }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   375
    }
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   376
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   377
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   378
  // 4) Failing that, attempt to get a new chunk and allocate from that chunk. Again, we may hit a commit
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   379
  //    limit, in which case we return NULL.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   380
  if (p == NULL && !did_hit_limit) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   381
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   382
    // Since we did not hit the commit limit, the current chunk must have been too small.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   383
    assert(current_chunk()->free_words() < raw_word_size, "Sanity");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   384
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   385
    // Before we allocate a new chunk we need to retire the old chunk, which is too small to serve our request
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   386
    // but may still have free committed words.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   387
    retire_current_chunk();
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   388
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   389
    // Allocate a new chunk.
58085
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   390
    if (allocate_new_current_chunk(raw_word_size) == false) {
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   391
      did_hit_limit = true;
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   392
    } else {
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   393
      assert(current_chunk() != NULL && current_chunk()->free_words() >= raw_word_size, "Sanity");
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   394
      p = current_chunk()->allocate(raw_word_size, &did_hit_limit);
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   395
      log_trace(metaspace)(LOGFMT_SPCMGR ": .. allocated new chunk " CHKLVL_FORMAT " and taken from that.",
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   396
                           LOGFMT_SPCMGR_ARGS, current_chunk()->level());
58085
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   397
    }
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   398
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   399
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   400
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   401
  assert(p != NULL || (p == NULL && did_hit_limit), "Sanity");
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   402
58227
0e7d9a23261e Fix various test issues.
stuefe
parents: 58085
diff changeset
   403
  SOMETIMES(verify_locked();)
0e7d9a23261e Fix various test issues.
stuefe
parents: 58085
diff changeset
   404
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   405
  if (p == NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   406
    DEBUG_ONLY(InternalStats::inc_num_allocs_failed_limit();)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   407
  } else {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   408
    DEBUG_ONLY(InternalStats::inc_num_allocs();)
58085
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   409
    _total_used_words_counter->increment_by(raw_word_size);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   410
  }
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   411
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   412
  log_trace(metaspace)(LOGFMT_SPCMGR ": returned " PTR_FORMAT ".",
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   413
                       LOGFMT_SPCMGR_ARGS, p2i(p));
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   414
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   415
  return p;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   416
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   417
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   418
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   419
// Prematurely returns a metaspace allocation to the _block_freelists
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   420
// because it is not needed anymore (requires CLD lock to be active).
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   421
void SpaceManager::deallocate_locked(MetaWord* p, size_t word_size) {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   422
  assert_lock_strong(lock());
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   423
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   424
  // Allocations and deallocations are in raw_word_size
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   425
  size_t raw_word_size = get_raw_allocation_word_size(word_size);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   426
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   427
  log_debug(metaspace)(LOGFMT_SPCMGR ": deallocating " PTR_FORMAT
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   428
                       ", word size: " SIZE_FORMAT ", raw size: " SIZE_FORMAT ".",
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   429
                       LOGFMT_SPCMGR_ARGS, p2i(p), word_size, raw_word_size);
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   430
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   431
  assert(current_chunk() != NULL, "SpaceManager is empty.");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   432
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   433
  assert(is_valid_area(p, word_size),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   434
         "Pointer range not part of this SpaceManager and cannot be deallocated: (" PTR_FORMAT ".." PTR_FORMAT ").",
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   435
         p2i(p), p2i(p + word_size));
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   436
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   437
  // If this allocation has just been allocated from the current chunk, it may still be on the top of the
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   438
  // current chunk. In that case, just roll back the allocation.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   439
  if (current_chunk()->attempt_rollback_allocation(p, raw_word_size)) {
58882
58b20be7bc04 Improve spacemanager logging
stuefe
parents: 58840
diff changeset
   440
    log_trace(metaspace)(LOGFMT_SPCMGR ": ... rollback succeeded.", LOGFMT_SPCMGR_ARGS);
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   441
    return;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   442
  }
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   443
59155
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   444
  if (Settings::use_lom()) {
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   445
    add_allocation_to_lom(p, raw_word_size);
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   446
  } else {
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   447
    add_allocation_to_block_freelist(p, raw_word_size);
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   448
  }
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   449
58227
0e7d9a23261e Fix various test issues.
stuefe
parents: 58085
diff changeset
   450
  DEBUG_ONLY(verify_locked();)
0e7d9a23261e Fix various test issues.
stuefe
parents: 58085
diff changeset
   451
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   452
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   453
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   454
// Prematurely returns a metaspace allocation to the _block_freelists because it is not
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   455
// needed anymore.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   456
void SpaceManager::deallocate(MetaWord* p, size_t word_size) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   457
  MutexLocker cl(lock(), Mutex::_no_safepoint_check_flag);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   458
  deallocate_locked(p, word_size);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   459
}
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   460
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   461
// Update statistics. This walks all in-use chunks.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   462
void SpaceManager::add_to_statistics(sm_stats_t* out) const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   463
54623
1126f0607c70 8222811: Consolidate MutexLockerEx and MutexLocker
coleenp
parents: 53970
diff changeset
   464
  MutexLocker cl(lock(), Mutex::_no_safepoint_check_flag);
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   465
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   466
  for (const Metachunk* c = _chunks.first(); c != NULL; c = c->next()) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   467
    in_use_chunk_stats_t& ucs = out->stats[c->level()];
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   468
    ucs.num ++;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   469
    ucs.word_size += c->word_size();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   470
    ucs.committed_words += c->committed_words();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   471
    ucs.used_words += c->used_words();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   472
    // Note: for free and waste, we only count what's committed.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   473
    if (c == current_chunk()) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   474
      ucs.free_words += c->free_below_committed_words();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   475
    } else {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   476
      ucs.waste_words += c->free_below_committed_words();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   477
    }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   478
  }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   479
59155
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   480
  if (Settings::use_lom()) {
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   481
    if (lom() != NULL) {
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   482
      block_stats_t s;
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   483
      lom()->statistics(&s);
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   484
      out->free_blocks_num += s.num_blocks;
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   485
      out->free_blocks_word_size += s.word_size;
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   486
    }
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   487
  } else {
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   488
    if (block_freelist() != NULL) {
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   489
      out->free_blocks_num += block_freelist()->num_blocks();
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   490
      out->free_blocks_word_size += block_freelist()->total_size();
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   491
    }
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   492
  }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   493
58227
0e7d9a23261e Fix various test issues.
stuefe
parents: 58085
diff changeset
   494
  SOMETIMES(out->verify();)
58683
2d5dd194c65c Lessen verification costs
stuefe
parents: 58475
diff changeset
   495
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   496
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   497
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   498
#ifdef ASSERT
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   499
58227
0e7d9a23261e Fix various test issues.
stuefe
parents: 58085
diff changeset
   500
void SpaceManager::verify_locked() const {
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   501
58227
0e7d9a23261e Fix various test issues.
stuefe
parents: 58085
diff changeset
   502
  assert_lock_strong(lock());
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   503
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   504
  assert(_chunk_alloc_sequence != NULL && _chunk_manager != NULL, "Sanity");
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   505
58227
0e7d9a23261e Fix various test issues.
stuefe
parents: 58085
diff changeset
   506
  _chunks.verify();
0e7d9a23261e Fix various test issues.
stuefe
parents: 58085
diff changeset
   507
59155
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   508
  if (Settings::use_lom()) {
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   509
    if (lom() != NULL) {
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   510
      lom()->verify();
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   511
    }
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   512
  }
b537e6386306 LeftOverBins as an optional replacement of free block dictionary which is rather ineffective
stuefe
parents: 59107
diff changeset
   513
58227
0e7d9a23261e Fix various test issues.
stuefe
parents: 58085
diff changeset
   514
}
0e7d9a23261e Fix various test issues.
stuefe
parents: 58085
diff changeset
   515
0e7d9a23261e Fix various test issues.
stuefe
parents: 58085
diff changeset
   516
void SpaceManager::verify() const {
0e7d9a23261e Fix various test issues.
stuefe
parents: 58085
diff changeset
   517
0e7d9a23261e Fix various test issues.
stuefe
parents: 58085
diff changeset
   518
  MutexLocker cl(lock(), Mutex::_no_safepoint_check_flag);
0e7d9a23261e Fix various test issues.
stuefe
parents: 58085
diff changeset
   519
  verify_locked();
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   520
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   521
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   522
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   523
// Returns true if the area indicated by pointer and size have actually been allocated
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   524
// from this space manager.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   525
bool SpaceManager::is_valid_area(MetaWord* p, size_t word_size) const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   526
  assert(p != NULL && word_size > 0, "Sanity");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   527
  for (const Metachunk* c = _chunks.first(); c != NULL; c = c->next()) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   528
    if (c->is_valid_pointer(p)) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   529
      assert(c->is_valid_pointer(p + word_size - 1), "Range partly oob");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   530
      return true;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   531
    }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   532
  }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   533
  return false;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   534
}
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   535
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   536
#endif // ASSERT
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   537
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   538
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   539
} // namespace metaspace
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   540