src/hotspot/share/memory/metaspace/chunkManager.cpp
author stuefe
Mon, 21 Oct 2019 16:43:06 +0200
branchstuefe-new-metaspace-branch
changeset 58716 960e372a6065
parent 58683 2d5dd194c65c
child 58717 5e9e519e5dc9
permissions -rw-r--r--
Fix error in chunk allocation strategy which caused small chunks to dominate
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     1
/*
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
     2
 * Copyright (c) 2019, SAP SE. All rights reserved.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
     3
 * Copyright (c) 2019, Oracle and/or its affiliates. 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
 */
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    25
#include <memory/metaspace/settings.hpp>
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    26
#include "precompiled.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    27
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    28
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    29
#include "logging/log.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    30
#include "logging/logStream.hpp"
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    31
#include "memory/metaspace/chunkAllocSequence.hpp"
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    32
#include "memory/metaspace/chunkLevel.hpp"
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    33
#include "memory/metaspace/chunkManager.hpp"
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    34
#include "memory/metaspace/internStat.hpp"
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    35
#include "memory/metaspace/metachunk.hpp"
58683
2d5dd194c65c Lessen verification costs
stuefe
parents: 58646
diff changeset
    36
#include "memory/metaspace/metaDebug.hpp"
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    37
#include "memory/metaspace/metaspaceCommon.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    38
#include "memory/metaspace/metaspaceStatistics.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    39
#include "memory/metaspace/virtualSpaceNode.hpp"
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    40
#include "memory/metaspace/virtualSpaceList.hpp"
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    41
#include "runtime/mutexLocker.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    42
#include "utilities/debug.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    43
#include "utilities/globalDefinitions.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    44
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    45
namespace metaspace {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    46
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    47
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    48
// Return a single chunk to the freelist and adjust accounting. No merge is attempted.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    49
void ChunkManager::return_chunk_simple(Metachunk* c) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    50
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    51
  assert_lock_strong(MetaspaceExpand_lock);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    52
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    53
  DEBUG_ONLY(c->verify(false));
50380
bec342339138 8204195: Clean up macroAssembler.inline.hpp and other inline.hpp files included in .hpp files
coleenp
parents: 50193
diff changeset
    54
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    55
  const chklvl_t lvl = c->level();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    56
  _chunks.add(c);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    57
  c->reset_used_words();
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    58
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    59
  // Tracing
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    60
  log_debug(metaspace)("ChunkManager %s: returned chunk " METACHUNK_FORMAT ".",
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    61
                       _name, METACHUNK_FORMAT_ARGS(c));
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    62
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    63
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    64
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    65
// Take a single chunk from the given freelist and adjust counters. Returns NULL
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    66
// if there is no fitting chunk for this level.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    67
Metachunk* ChunkManager::remove_first_chunk_at_level(chklvl_t l) {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    68
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    69
  assert_lock_strong(MetaspaceExpand_lock);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    70
  DEBUG_ONLY(chklvl::check_valid_level(l);)
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    71
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    72
  Metachunk* c = _chunks.remove_first(l);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    73
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    74
  // Tracing
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    75
  if (c != NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    76
    log_debug(metaspace)("ChunkManager %s: removed chunk " METACHUNK_FORMAT ".",
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    77
                         _name, METACHUNK_FORMAT_ARGS(c));
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    78
  } else {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    79
    log_trace(metaspace)("ChunkManager %s: no chunk found for level " CHKLVL_FORMAT,
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    80
                         _name, l);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    81
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    82
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    83
  return c;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    84
}
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
// Creates a chunk manager with a given name (which is for debug purposes only)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    87
// and an associated space list which will be used to request new chunks from
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    88
// (see get_chunk())
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    89
ChunkManager::ChunkManager(const char* name, VirtualSpaceList* space_list)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    90
  : _vslist(space_list),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    91
    _name(name),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    92
    _chunks()
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    93
{
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    94
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    95
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    96
// Given a chunk we are about to handout to the caller, make sure it is committed
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    97
// according to constants::committed_words_on_fresh_chunks
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    98
bool ChunkManager::commit_chunk_before_handout(Metachunk* c) {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    99
  assert_lock_strong(MetaspaceExpand_lock);
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   100
  const size_t must_be_committed = MIN2(c->word_size(), Settings::committed_words_on_fresh_chunks());
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   101
  return c->ensure_committed_locked(must_be_committed);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   102
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   103
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   104
// Given a chunk which must be outside of a freelist and must be free, split it to
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   105
// meet a target level and return it. Splinters are added to the freelist.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   106
Metachunk* ChunkManager::split_chunk_and_add_splinters(Metachunk* c, chklvl_t target_level) {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   107
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 50811
diff changeset
   108
  assert_lock_strong(MetaspaceExpand_lock);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   109
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   110
  assert(c->is_free() && c->level() < target_level, "Invalid chunk for splitting");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   111
  DEBUG_ONLY(chklvl::check_valid_level(target_level);)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   112
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   113
  DEBUG_ONLY(c->verify(true);)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   114
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   115
  // Chunk must be outside of our freelists
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   116
  assert(_chunks.contains(c) == false, "Chunk is in freelist.");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   117
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   118
  log_debug(metaspace)("ChunkManager %s: will split chunk " METACHUNK_FORMAT " to " CHKLVL_FORMAT ".",
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   119
                       _name, METACHUNK_FORMAT_ARGS(c), target_level);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   120
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   121
  const chklvl_t orig_level = c->level();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   122
  c = c->vsnode()->split(target_level, c, &_chunks);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   123
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   124
  // Splitting should never fail.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   125
  assert(c != NULL, "Split failed");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   126
  assert(c->level() == target_level, "Sanity");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   127
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   128
  DEBUG_ONLY(c->verify(false));
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   129
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   130
  DEBUG_ONLY(verify_locked(true);)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   131
58683
2d5dd194c65c Lessen verification costs
stuefe
parents: 58646
diff changeset
   132
  SOMETIMES(c->vsnode()->verify(true);)
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   133
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   134
  return c;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   135
}
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   136
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   137
// Get a chunk and be smart about it.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   138
// - 1) Attempt to find a free chunk of exactly the pref_level level
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   139
// - 2) Failing that, attempt to find a chunk smaller or equal the max level.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   140
// - 3) Failing that, attempt to find a free chunk of larger size and split it.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   141
// - 4) Failing that, attempt to allocate a new chunk from the connected virtual space.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   142
// - Failing that, give up and return NULL.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   143
// Note: this is not guaranteed to return a *committed* chunk. The chunk manager will
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   144
//   attempt to commit the returned chunk according to constants::committed_words_on_fresh_chunks;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   145
//   but this may fail if we hit a commit limit. In that case, a partly uncommit chunk
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   146
//   will be returned, and the commit is attempted again when we allocate from the chunk's
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   147
//   uncommitted area. See also Metachunk::allocate.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   148
Metachunk* ChunkManager::get_chunk(chklvl_t max_level, chklvl_t pref_level) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   149
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   150
  MutexLocker fcl(MetaspaceExpand_lock, Mutex::_no_safepoint_check_flag);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   151
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   152
  DEBUG_ONLY(verify_locked(false);)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   153
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   154
  DEBUG_ONLY(chklvl::check_valid_level(max_level);)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   155
  DEBUG_ONLY(chklvl::check_valid_level(pref_level);)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   156
  assert(max_level >= pref_level, "invalid level.");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   157
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   158
  Metachunk* c = NULL;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   159
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   160
  // Tracing
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   161
  log_debug(metaspace)("ChunkManager %s: get chunk: max " CHKLVL_FORMAT " (" SIZE_FORMAT "),"
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   162
                       "preferred " CHKLVL_FORMAT " (" SIZE_FORMAT ").",
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   163
                       _name, max_level, chklvl::word_size_for_level(max_level),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   164
                       pref_level, chklvl::word_size_for_level(pref_level));
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   165
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   166
  // 1) Attempt to find a free chunk of exactly the pref_level level
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   167
  c = remove_first_chunk_at_level(pref_level);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   168
58716
960e372a6065 Fix error in chunk allocation strategy which caused small chunks to dominate
stuefe
parents: 58683
diff changeset
   169
  // 2) Failing that, we are also willing to accept a chunk half that size, but nothing less for now...
960e372a6065 Fix error in chunk allocation strategy which caused small chunks to dominate
stuefe
parents: 58683
diff changeset
   170
  if (c == NULL && pref_level < max_level) {
960e372a6065 Fix error in chunk allocation strategy which caused small chunks to dominate
stuefe
parents: 58683
diff changeset
   171
    c = remove_first_chunk_at_level(pref_level + 1);
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   172
  }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   173
58716
960e372a6065 Fix error in chunk allocation strategy which caused small chunks to dominate
stuefe
parents: 58683
diff changeset
   174
  // 3) Failing that, attempt to find a free chunk of larger size and split it to get the ideal size...
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   175
  if (c == NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   176
    for (chklvl_t lvl = pref_level - 1; lvl >= chklvl::ROOT_CHUNK_LEVEL; lvl --) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   177
      c = remove_first_chunk_at_level(lvl);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   178
      if (c != NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   179
        // Split chunk; add splinters to freelist
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   180
        c = split_chunk_and_add_splinters(c, pref_level);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   181
        break;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   182
      }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   183
    }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   184
  }
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 50811
diff changeset
   185
58716
960e372a6065 Fix error in chunk allocation strategy which caused small chunks to dominate
stuefe
parents: 58683
diff changeset
   186
  // 4) Failing that, before we start allocating a new root chunk, lets really scrape the barrel. Any
960e372a6065 Fix error in chunk allocation strategy which caused small chunks to dominate
stuefe
parents: 58683
diff changeset
   187
  //    smaller chunk is acceptable provided it fits the minimal size....
960e372a6065 Fix error in chunk allocation strategy which caused small chunks to dominate
stuefe
parents: 58683
diff changeset
   188
  if (c == NULL) {
960e372a6065 Fix error in chunk allocation strategy which caused small chunks to dominate
stuefe
parents: 58683
diff changeset
   189
    for (chklvl_t lvl = pref_level + 1; lvl <= max_level; lvl ++) {
960e372a6065 Fix error in chunk allocation strategy which caused small chunks to dominate
stuefe
parents: 58683
diff changeset
   190
      c = remove_first_chunk_at_level(lvl);
960e372a6065 Fix error in chunk allocation strategy which caused small chunks to dominate
stuefe
parents: 58683
diff changeset
   191
      if (c != NULL) {
960e372a6065 Fix error in chunk allocation strategy which caused small chunks to dominate
stuefe
parents: 58683
diff changeset
   192
        break;
960e372a6065 Fix error in chunk allocation strategy which caused small chunks to dominate
stuefe
parents: 58683
diff changeset
   193
      }
960e372a6065 Fix error in chunk allocation strategy which caused small chunks to dominate
stuefe
parents: 58683
diff changeset
   194
    }
960e372a6065 Fix error in chunk allocation strategy which caused small chunks to dominate
stuefe
parents: 58683
diff changeset
   195
  }
960e372a6065 Fix error in chunk allocation strategy which caused small chunks to dominate
stuefe
parents: 58683
diff changeset
   196
960e372a6065 Fix error in chunk allocation strategy which caused small chunks to dominate
stuefe
parents: 58683
diff changeset
   197
  // 4) Failing that, attempt to allocate a new root chunk from the connected virtual space.
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   198
  if (c == NULL) {
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 50811
diff changeset
   199
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   200
    // Tracing
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   201
    log_debug(metaspace)("ChunkManager %s: need new root chunk.", _name);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   202
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   203
    c = _vslist->allocate_root_chunk();
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   204
58085
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   205
    // This may have failed if the virtual space list is exhausted but it cannot be expanded
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   206
    // by a new node (class space).
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   207
    if (c == NULL) {
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   208
      return NULL;
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   209
    }
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   210
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   211
    assert(c->level() == chklvl::LOWEST_CHUNK_LEVEL, "Not a root chunk?");
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   212
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   213
    // Split this root chunk to the desired chunk size.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   214
    if (pref_level > c->level()) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   215
      c = split_chunk_and_add_splinters(c, pref_level);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   216
    }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   217
  }
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   218
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   219
  // Note that we should at this point have a chunk; should always work. If we hit
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   220
  // a commit limit in the meantime, the chunk may still be uncommitted, but the chunk
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   221
  // itself should exist now.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   222
  assert(c != NULL, "Unexpected");
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   223
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   224
  // Before returning the chunk, attempt to commit it according to the handout rules.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   225
  // If that fails, we ignore the error and return the uncommitted chunk.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   226
  if (commit_chunk_before_handout(c) == false) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   227
    log_info(gc, metaspace)("Failed to commit chunk prior to handout.");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   228
  }
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   229
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   230
  // Any chunk returned from ChunkManager shall be marked as in use.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   231
  c->set_in_use();
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   232
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   233
  DEBUG_ONLY(verify_locked(false);)
58683
2d5dd194c65c Lessen verification costs
stuefe
parents: 58646
diff changeset
   234
  SOMETIMES(c->vsnode()->verify(true);)
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   235
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   236
  log_debug(metaspace)("ChunkManager %s: handing out chunk " METACHUNK_FORMAT ".",
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   237
                       _name, METACHUNK_FORMAT_ARGS(c));
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   238
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   239
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   240
  DEBUG_ONLY(InternalStats::inc_num_chunks_taken_from_freelist();)
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   241
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   242
  return c;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   243
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   244
} // ChunkManager::get_chunk
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   245
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   246
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   247
// Return a single chunk to the ChunkManager and adjust accounting. May merge chunk
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   248
//  with neighbors.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   249
// As a side effect this removes the chunk from whatever list it has been in previously.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   250
// Happens after a Classloader was unloaded and releases its metaspace chunks.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   251
// !! Note: this may invalidate the chunk. Do not access the chunk after
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   252
//    this function returns !!
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   253
void ChunkManager::return_chunk(Metachunk* c) {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   254
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   255
  MutexLocker fcl(MetaspaceExpand_lock, Mutex::_no_safepoint_check_flag);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   256
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   257
  log_debug(metaspace)("ChunkManager %s: returning chunk " METACHUNK_FORMAT ".",
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   258
                       _name, METACHUNK_FORMAT_ARGS(c));
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   259
58683
2d5dd194c65c Lessen verification costs
stuefe
parents: 58646
diff changeset
   260
  DEBUG_ONLY(c->verify(true);)
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   261
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   262
  assert(!_chunks.contains(c), "A chunk to be added to the freelist must not be in the freelist already.");
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   263
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   264
  assert(c->is_in_use(), "Unexpected chunk state");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   265
  assert(!c->in_list(), "Remove from list first");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   266
  c->set_free();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   267
  c->reset_used_words();
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   268
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   269
  const chklvl_t orig_lvl = c->level();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   270
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   271
  Metachunk* merged = NULL;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   272
  if (!c->is_root_chunk()) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   273
    // Only attempt merging if we are not of the lowest level already.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   274
    merged = c->vsnode()->merge(c, &_chunks);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   275
  }
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   276
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   277
  if (merged != NULL) {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   278
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   279
    DEBUG_ONLY(merged->verify(false));
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   280
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   281
    // We did merge our chunk into a different chunk.
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   282
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   283
    // We did merge chunks and now have a bigger chunk.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   284
    assert(merged->level() < orig_lvl, "Sanity");
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   285
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   286
    log_trace(metaspace)("ChunkManager %s: merged into chunk " METACHUNK_FORMAT ".",
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   287
                         _name, METACHUNK_FORMAT_ARGS(merged));
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   288
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   289
    c = merged;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   290
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   291
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   292
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   293
  if (Settings::uncommit_on_return() &&
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   294
      Settings::uncommit_on_return_min_word_size() <= c->word_size())
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   295
  {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   296
    log_trace(metaspace)("ChunkManager %s: uncommitting free chunk " METACHUNK_FORMAT ".",
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   297
                         _name, METACHUNK_FORMAT_ARGS(c));
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   298
    c->uncommit_locked();
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   299
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   300
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   301
  return_chunk_simple(c);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   302
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   303
  DEBUG_ONLY(verify_locked(false);)
58683
2d5dd194c65c Lessen verification costs
stuefe
parents: 58646
diff changeset
   304
  SOMETIMES(c->vsnode()->verify(true);)
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   305
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   306
  DEBUG_ONLY(InternalStats::inc_num_chunks_returned_to_freelist();)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   307
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   308
}
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 50811
diff changeset
   309
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   310
// Given a chunk c, which must be "in use" and must not be a root chunk, attempt to
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   311
// enlarge it in place by claiming its trailing buddy.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   312
//
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   313
// This will only work if c is the leader of the buddy pair and the trailing buddy is free.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   314
//
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   315
// If successful, the follower chunk will be removed from the freelists, the leader chunk c will
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   316
// double in size (level decreased by one).
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   317
//
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   318
// On success, true is returned, false otherwise.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   319
bool ChunkManager::attempt_enlarge_chunk(Metachunk* c) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   320
  MutexLocker fcl(MetaspaceExpand_lock, Mutex::_no_safepoint_check_flag);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   321
  return c->vsnode()->attempt_enlarge_chunk(c, &_chunks);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   322
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   323
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   324
static void print_word_size_delta(outputStream* st, size_t word_size_1, size_t word_size_2) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   325
  if (word_size_1 == word_size_2) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   326
    print_scaled_words(st, word_size_1);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   327
    st->print (" (no change)");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   328
  } else {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   329
    print_scaled_words(st, word_size_1);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   330
    st->print("->");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   331
    print_scaled_words(st, word_size_2);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   332
    st->print(" (");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   333
    if (word_size_2 <= word_size_1) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   334
      st->print("-");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   335
      print_scaled_words(st, word_size_1 - word_size_2);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   336
    } else {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   337
      st->print("+");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   338
      print_scaled_words(st, word_size_2 - word_size_1);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   339
    }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   340
    st->print(")");
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   341
  }
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   342
}
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   343
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   344
// Attempt to reclaim free areas in metaspace wholesale:
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   345
// - first, attempt to purge nodes of the backing virtual space. This can only be successful
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   346
//   if whole nodes are only containing free chunks, so it highly depends on fragmentation.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   347
// - then, it will uncommit areas of free chunks according to the rules laid down in
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   348
//   settings (see settings.hpp).
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   349
void ChunkManager::wholesale_reclaim() {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   350
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   351
  MutexLocker fcl(MetaspaceExpand_lock, Mutex::_no_safepoint_check_flag);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   352
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   353
  log_info(metaspace)("ChunkManager \"%s\": reclaiming memory...", _name);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   354
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   355
  const size_t reserved_before = _vslist->reserved_words();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   356
  const size_t committed_before = _vslist->committed_words();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   357
  int num_nodes_purged = 0;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   358
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   359
  if (Settings::delete_nodes_on_purge()) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   360
    num_nodes_purged = _vslist->purge(&_chunks);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   361
    DEBUG_ONLY(InternalStats::inc_num_purges();)
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   362
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   363
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   364
  if (Settings::uncommit_on_purge()) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   365
    const chklvl_t max_level =
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   366
        chklvl::level_fitting_word_size(Settings::uncommit_on_purge_min_word_size());
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   367
    for (chklvl_t l = chklvl::LOWEST_CHUNK_LEVEL;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   368
         l <= max_level;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   369
         l ++)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   370
    {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   371
      for (Metachunk* c = _chunks.first_at_level(l); c != NULL; c = c->next()) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   372
        c->uncommit_locked();
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
    DEBUG_ONLY(InternalStats::inc_num_wholesale_uncommits();)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   376
  }
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 50811
diff changeset
   377
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   378
  const size_t reserved_after = _vslist->reserved_words();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   379
  const size_t committed_after = _vslist->committed_words();
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 50811
diff changeset
   380
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   381
  // Print a nice report.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   382
  if (reserved_after == reserved_before && committed_after == committed_before) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   383
    log_info(metaspace)("ChunkManager %s: ... nothing reclaimed.", _name);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   384
  } else {
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   385
    LogTarget(Info, metaspace) lt;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   386
    if (lt.is_enabled()) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   387
      LogStream ls(lt);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   388
      ls.print_cr("ChunkManager %s: finished reclaiming memory: ", _name);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   389
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   390
      ls.print("reserved: ");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   391
      print_word_size_delta(&ls, reserved_before, reserved_after);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   392
      ls.cr();
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   393
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   394
      ls.print("committed: ");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   395
      print_word_size_delta(&ls, committed_before, committed_after);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   396
      ls.cr();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   397
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   398
      ls.print_cr("full nodes purged: %d", num_nodes_purged);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   399
    }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   400
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   401
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   402
  DEBUG_ONLY(_vslist->verify_locked(true));
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   403
  DEBUG_ONLY(verify_locked(true));
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   404
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   405
}
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   406
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   407
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   408
ChunkManager* ChunkManager::_chunkmanager_class = NULL;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   409
ChunkManager* ChunkManager::_chunkmanager_nonclass = NULL;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   410
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   411
void ChunkManager::set_chunkmanager_class(ChunkManager* cm) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   412
  assert(_chunkmanager_class == NULL, "Sanity");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   413
  _chunkmanager_class = cm;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   414
}
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 50811
diff changeset
   415
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   416
void ChunkManager::set_chunkmanager_nonclass(ChunkManager* cm) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   417
  assert(_chunkmanager_nonclass == NULL, "Sanity");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   418
  _chunkmanager_nonclass = cm;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   419
}
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   420
58333
78b2e8f46dd4 add experimental option to cluster micro clds.
stuefe
parents: 58085
diff changeset
   421
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   422
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   423
// Update statistics.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   424
void ChunkManager::add_to_statistics(cm_stats_t* out) const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   425
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   426
  MutexLocker fcl(MetaspaceExpand_lock, Mutex::_no_safepoint_check_flag);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   427
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   428
  for (chklvl_t l = chklvl::ROOT_CHUNK_LEVEL; l <= chklvl::HIGHEST_CHUNK_LEVEL; l ++) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   429
    out->num_chunks[l] += _chunks.num_chunks_at_level(l);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   430
    out->committed_word_size[l] += _chunks.committed_word_size_at_level(l);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   431
  }
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
  DEBUG_ONLY(out->verify();)
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 50811
diff changeset
   434
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   435
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   436
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   437
#ifdef ASSERT
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   438
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   439
void ChunkManager::verify(bool slow) const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   440
  MutexLocker fcl(MetaspaceExpand_lock, Mutex::_no_safepoint_check_flag);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   441
  verify_locked(slow);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   442
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   443
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   444
void ChunkManager::verify_locked(bool slow) const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   445
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   446
  assert_lock_strong(MetaspaceExpand_lock);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   447
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   448
  assert(_vslist != NULL, "No vslist");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   449
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   450
  // This checks that the lists are wired up correctly, that the counters are valid and
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   451
  // that each chunk is (only) in its correct list.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   452
  _chunks.verify(true);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   453
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   454
  // Need to check that each chunk is free..._size = 0;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   455
  for (chklvl_t l = chklvl::LOWEST_CHUNK_LEVEL; l <= chklvl::HIGHEST_CHUNK_LEVEL; l ++) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   456
    for (const Metachunk* c = _chunks.first_at_level(l); c != NULL; c = c->next()) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   457
      assert(c->is_free(), "Chunk is not free.");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   458
      assert(c->used_words() == 0, "Chunk should have not used words.");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   459
    }
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   460
  }
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   461
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   462
}
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   463
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   464
#endif // ASSERT
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
void ChunkManager::print_on(outputStream* st) const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   467
  MutexLocker fcl(MetaspaceExpand_lock, Mutex::_no_safepoint_check_flag);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   468
  print_on_locked(st);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   469
}
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   470
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   471
void ChunkManager::print_on_locked(outputStream* st) const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   472
  assert_lock_strong(MetaspaceExpand_lock);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   473
  st->print_cr("cm %s: %d chunks, total word size: " SIZE_FORMAT ", committed word size: " SIZE_FORMAT, _name,
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   474
               total_num_chunks(), total_word_size(), _chunks.total_committed_word_size());
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   475
  _chunks.print_on(st);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   476
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   477
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   478
} // namespace metaspace
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   479
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   480
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   481