src/hotspot/share/memory/metaspace/chunkManager.cpp
author stuefe
Wed, 16 Oct 2019 16:10:24 +0200
branchstuefe-new-metaspace-branch
changeset 58646 bcdba1c9f1fe
parent 58333 78b2e8f46dd4
child 58683 2d5dd194c65c
permissions -rw-r--r--
Remove experimental MetaspaceSeparateMicroCLDs feature, since its effect was underwhelming
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"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    36
#include "memory/metaspace/metaspaceCommon.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    37
#include "memory/metaspace/metaspaceStatistics.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    38
#include "memory/metaspace/virtualSpaceNode.hpp"
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    39
#include "memory/metaspace/virtualSpaceList.hpp"
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    40
#include "runtime/mutexLocker.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    41
#include "utilities/debug.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    42
#include "utilities/globalDefinitions.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    43
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    44
namespace metaspace {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    45
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    46
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    47
// 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
    48
void ChunkManager::return_chunk_simple(Metachunk* c) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    49
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    50
  assert_lock_strong(MetaspaceExpand_lock);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    51
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    52
  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
    53
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    54
  const chklvl_t lvl = c->level();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    55
  _chunks.add(c);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    56
  c->reset_used_words();
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    57
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    58
  // Tracing
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    59
  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
    60
                       _name, METACHUNK_FORMAT_ARGS(c));
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    61
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    62
}
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
// 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
    65
// 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
    66
Metachunk* ChunkManager::remove_first_chunk_at_level(chklvl_t l) {
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
  assert_lock_strong(MetaspaceExpand_lock);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    69
  DEBUG_ONLY(chklvl::check_valid_level(l);)
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
  Metachunk* c = _chunks.remove_first(l);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    72
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    73
  // Tracing
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    74
  if (c != NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    75
    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
    76
                         _name, METACHUNK_FORMAT_ARGS(c));
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    77
  } else {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    78
    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
    79
                         _name, l);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    80
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    81
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    82
  return c;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    83
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    84
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    85
// 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
    86
// 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
    87
// (see get_chunk())
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    88
ChunkManager::ChunkManager(const char* name, VirtualSpaceList* space_list)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    89
  : _vslist(space_list),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    90
    _name(name),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    91
    _chunks()
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    92
{
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    93
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    94
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    95
// 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
    96
// according to constants::committed_words_on_fresh_chunks
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    97
bool ChunkManager::commit_chunk_before_handout(Metachunk* c) {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    98
  assert_lock_strong(MetaspaceExpand_lock);
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
    99
  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
   100
  return c->ensure_committed_locked(must_be_committed);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   101
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   102
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   103
// 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
   104
// 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
   105
Metachunk* ChunkManager::split_chunk_and_add_splinters(Metachunk* c, chklvl_t target_level) {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   106
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 50811
diff changeset
   107
  assert_lock_strong(MetaspaceExpand_lock);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   108
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   109
  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
   110
  DEBUG_ONLY(chklvl::check_valid_level(target_level);)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   111
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   112
  DEBUG_ONLY(c->verify(true);)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   113
  DEBUG_ONLY(c->vsnode()->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
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   132
  DEBUG_ONLY(c->vsnode()->verify(true);)
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
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   169
  // Todo:
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   170
  //
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   171
  // We need to meditate about steps (2) and (3) a bit more.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   172
  // By simply preferring to reuse small chunks vs splitting larger chunks we may emphasize
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   173
  // fragmentation, strangely enough, if callers wanting medium sized chunks take small chunks
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   174
  // instead, and taking them away from the many users which prefer small chunks.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   175
  // Alternatives:
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   176
  // - alternating between (2) (3) and (3) (2)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   177
  // - mixing (2) and (3) into one loop with a growing delta, and maybe a "hesitance" barrier function
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   178
  // - keeping track of chunk demand and adding this into the equation: if e.g. 4K chunks were heavily
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   179
  //   preferred in the past, maybe for callers wanting larger chunks leave those alone.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   180
  // - Take into account which chunks are committed? This would require some extra bookkeeping...
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   181
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   182
  // 2) Failing that, attempt to find a chunk smaller or equal the minimal level.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   183
  if (c == NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   184
    for (chklvl_t lvl = pref_level + 1; lvl <= max_level; lvl ++) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   185
      c = remove_first_chunk_at_level(lvl);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   186
      if (c != NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   187
        break;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   188
      }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   189
    }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   190
  }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   191
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   192
  // 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
   193
  if (c == NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   194
    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
   195
      c = remove_first_chunk_at_level(lvl);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   196
      if (c != NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   197
        // Split chunk; add splinters to freelist
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   198
        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
   199
        break;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   200
      }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   201
    }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   202
  }
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 50811
diff changeset
   203
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   204
  // 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
   205
  if (c == NULL) {
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 50811
diff changeset
   206
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   207
    // Tracing
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   208
    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
   209
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   210
    c = _vslist->allocate_root_chunk();
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   211
58085
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   212
    // 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
   213
    // by a new node (class space).
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   214
    if (c == NULL) {
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   215
      return NULL;
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   216
    }
a5f523f2ff91 Fix jtreg/vmTestbase/metaspace/shrink_grow/CompressedClassSpaceSize
stuefe
parents: 58063
diff changeset
   217
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   218
    assert(c->level() == chklvl::LOWEST_CHUNK_LEVEL, "Not a root chunk?");
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   219
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   220
    // 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
   221
    if (pref_level > c->level()) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   222
      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
   223
    }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   224
  }
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   225
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   226
  // 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
   227
  // 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
   228
  // itself should exist now.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   229
  assert(c != NULL, "Unexpected");
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   230
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   231
  // 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
   232
  // 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
   233
  if (commit_chunk_before_handout(c) == false) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   234
    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
   235
  }
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   236
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   237
  // 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
   238
  c->set_in_use();
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   239
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   240
  DEBUG_ONLY(verify_locked(false);)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   241
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   242
  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
   243
                       _name, METACHUNK_FORMAT_ARGS(c));
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   244
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   245
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   246
  DEBUG_ONLY(InternalStats::inc_num_chunks_taken_from_freelist();)
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   247
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   248
  return c;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   249
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   250
} // ChunkManager::get_chunk
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   251
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   252
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   253
// 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
   254
//  with neighbors.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   255
// 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
   256
// 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
   257
// !! 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
   258
//    this function returns !!
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   259
void ChunkManager::return_chunk(Metachunk* c) {
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   260
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   261
  MutexLocker fcl(MetaspaceExpand_lock, Mutex::_no_safepoint_check_flag);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   262
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   263
  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
   264
                       _name, METACHUNK_FORMAT_ARGS(c));
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   265
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   266
  DEBUG_ONLY(verify_locked(false);)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   267
  DEBUG_ONLY(c->verify(false);)
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
  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
   270
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   271
  assert(c->is_in_use(), "Unexpected chunk state");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   272
  assert(!c->in_list(), "Remove from list first");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   273
  c->set_free();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   274
  c->reset_used_words();
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   275
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   276
  const chklvl_t orig_lvl = c->level();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   277
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   278
  Metachunk* merged = NULL;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   279
  if (!c->is_root_chunk()) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   280
    // 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
   281
    merged = c->vsnode()->merge(c, &_chunks);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   282
  }
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   283
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   284
  if (merged != NULL) {
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
    DEBUG_ONLY(merged->verify(false));
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   287
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   288
    // We did merge our chunk into a different chunk.
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   289
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   290
    // 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
   291
    assert(merged->level() < orig_lvl, "Sanity");
50193
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
    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
   294
                         _name, METACHUNK_FORMAT_ARGS(merged));
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   295
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   296
    c = merged;
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   297
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   298
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   299
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   300
  if (Settings::uncommit_on_return() &&
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   301
      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
   302
  {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   303
    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
   304
                         _name, METACHUNK_FORMAT_ARGS(c));
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   305
    c->uncommit_locked();
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   306
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   307
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   308
  return_chunk_simple(c);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   309
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   310
  DEBUG_ONLY(verify_locked(false);)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   311
  DEBUG_ONLY(c->vsnode()->verify(true);)
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   312
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   313
  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
   314
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   315
}
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 50811
diff changeset
   316
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   317
// 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
   318
// 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
   319
//
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   320
// 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
   321
//
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   322
// 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
   323
// double in size (level decreased by one).
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   324
//
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   325
// On success, true is returned, false otherwise.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   326
bool ChunkManager::attempt_enlarge_chunk(Metachunk* c) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   327
  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
   328
  return c->vsnode()->attempt_enlarge_chunk(c, &_chunks);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   329
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   330
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   331
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
   332
  if (word_size_1 == word_size_2) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   333
    print_scaled_words(st, word_size_1);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   334
    st->print (" (no change)");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   335
  } else {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   336
    print_scaled_words(st, word_size_1);
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);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   339
    st->print(" (");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   340
    if (word_size_2 <= word_size_1) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   341
      st->print("-");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   342
      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
   343
    } else {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   344
      st->print("+");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   345
      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
   346
    }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   347
    st->print(")");
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   348
  }
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   349
}
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   350
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   351
// Attempt to reclaim free areas in metaspace wholesale:
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   352
// - 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
   353
//   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
   354
// - 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
   355
//   settings (see settings.hpp).
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   356
void ChunkManager::wholesale_reclaim() {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   357
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   358
  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
   359
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   360
  log_info(metaspace)("ChunkManager \"%s\": reclaiming memory...", _name);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   361
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   362
  const size_t reserved_before = _vslist->reserved_words();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   363
  const size_t committed_before = _vslist->committed_words();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   364
  int num_nodes_purged = 0;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   365
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   366
  if (Settings::delete_nodes_on_purge()) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   367
    num_nodes_purged = _vslist->purge(&_chunks);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   368
    DEBUG_ONLY(InternalStats::inc_num_purges();)
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   369
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   370
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   371
  if (Settings::uncommit_on_purge()) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   372
    const chklvl_t max_level =
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   373
        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
   374
    for (chklvl_t l = chklvl::LOWEST_CHUNK_LEVEL;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   375
         l <= max_level;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   376
         l ++)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   377
    {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   378
      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
   379
        c->uncommit_locked();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   380
      }
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
    DEBUG_ONLY(InternalStats::inc_num_wholesale_uncommits();)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   383
  }
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 50811
diff changeset
   384
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   385
  const size_t reserved_after = _vslist->reserved_words();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   386
  const size_t committed_after = _vslist->committed_words();
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 50811
diff changeset
   387
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   388
  // Print a nice report.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   389
  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
   390
    log_info(metaspace)("ChunkManager %s: ... nothing reclaimed.", _name);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   391
  } else {
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   392
    LogTarget(Info, metaspace) lt;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   393
    if (lt.is_enabled()) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   394
      LogStream ls(lt);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   395
      ls.print_cr("ChunkManager %s: finished reclaiming memory: ", _name);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   396
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   397
      ls.print("reserved: ");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   398
      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
   399
      ls.cr();
50193
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
      ls.print("committed: ");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   402
      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
   403
      ls.cr();
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
      ls.print_cr("full nodes purged: %d", num_nodes_purged);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   406
    }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   407
  }
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   408
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   409
  DEBUG_ONLY(_vslist->verify_locked(true));
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   410
  DEBUG_ONLY(verify_locked(true));
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   411
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   412
}
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   413
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   414
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   415
ChunkManager* ChunkManager::_chunkmanager_class = NULL;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   416
ChunkManager* ChunkManager::_chunkmanager_nonclass = NULL;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   417
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   418
void ChunkManager::set_chunkmanager_class(ChunkManager* cm) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   419
  assert(_chunkmanager_class == NULL, "Sanity");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   420
  _chunkmanager_class = cm;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   421
}
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 50811
diff changeset
   422
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   423
void ChunkManager::set_chunkmanager_nonclass(ChunkManager* cm) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   424
  assert(_chunkmanager_nonclass == NULL, "Sanity");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   425
  _chunkmanager_nonclass = cm;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   426
}
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   427
58333
78b2e8f46dd4 add experimental option to cluster micro clds.
stuefe
parents: 58085
diff changeset
   428
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   429
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   430
// Update statistics.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   431
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
   432
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   433
  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
   434
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   435
  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
   436
    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
   437
    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
   438
  }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   439
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   440
  DEBUG_ONLY(out->verify();)
53970
1ad7c590a6e7 8218988: Improve metaspace verifications
stuefe
parents: 50811
diff changeset
   441
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
#ifdef ASSERT
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
void ChunkManager::verify(bool slow) const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   447
  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
   448
  verify_locked(slow);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   449
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   450
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   451
void ChunkManager::verify_locked(bool slow) const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   452
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   453
  assert_lock_strong(MetaspaceExpand_lock);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   454
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   455
  assert(_vslist != NULL, "No vslist");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   456
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   457
  // 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
   458
  // 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
   459
  _chunks.verify(true);
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
  // 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
   462
  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
   463
    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
   464
      assert(c->is_free(), "Chunk is not free.");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   465
      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
   466
    }
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   467
  }
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   468
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
#endif // ASSERT
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   472
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   473
void ChunkManager::print_on(outputStream* st) const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   474
  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
   475
  print_on_locked(st);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   476
}
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
void ChunkManager::print_on_locked(outputStream* st) const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   479
  assert_lock_strong(MetaspaceExpand_lock);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 54623
diff changeset
   480
  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
   481
               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
   482
  _chunks.print_on(st);
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   483
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   484
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   485
} // namespace metaspace
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   486
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   487
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   488