src/hotspot/share/memory/metaspace/chunkManager.cpp
author stuefe
Mon, 08 Jul 2019 22:30:19 +0200
branchstuefe-improved-metaspace
changeset 57464 32e61f51ee09
parent 54623 1126f0607c70
permissions -rw-r--r--
initial commit
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     1
/*
54623
1126f0607c70 8222811: Consolidate MutexLockerEx and MutexLocker
coleenp
parents: 53970
diff changeset
     2
 * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     4
 *
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     7
 * published by the Free Software Foundation.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     8
 *
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    13
 * accompanied this code).
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    14
 *
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    18
 *
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    21
 * questions.
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    22
 *
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    23
 */
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    24
#include "precompiled.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    25
57464
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    26
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    27
#include "memory/metaspace/chunkAllocSequence.hpp"
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    28
#include "memory/metaspace/chunkLevel.hpp"
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    29
#include "memory/metaspace/chunkManager.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    30
#include "memory/metaspace/metachunk.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    31
#include "runtime/mutexLocker.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    32
#include "utilities/debug.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    33
#include "utilities/globalDefinitions.hpp"
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    34
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    35
namespace metaspace {
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
    36
57464
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    37
// Creates a chunk manager with a given name (which is for debug purposes only)
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    38
// and an associated space list which will be used to request new chunks from
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    39
// (see get_chunk())
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    40
ChunkManager::ChunkManager(const char* name, VirtualSpaceList* space_list)
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    41
  : _vs_list(space_list)
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    42
  , _name(name)
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    43
  , _chunks {}
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    44
  , _num_chunks {}
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    45
  , _total_word_size(0)
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    46
  , _total_num_chunks(0)
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    47
{
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    48
}
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    49
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    50
void ChunkManager::account_for_added_chunk(const Metachunk* c) {
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    51
  assert_lock_strong(MetaspaceExpand_lock);
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    52
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    53
  const chklvl_t lvl = c->level();
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    54
  check_valid_level(lvl);
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    55
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    56
  _total_num_chunks ++;
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    57
  _total_word_size += word_size_for_level(lvl);
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    58
  _num_chunks[lvl] ++;
50380
bec342339138 8204195: Clean up macroAssembler.inline.hpp and other inline.hpp files included in .hpp files
coleenp
parents: 50193
diff changeset
    59
}
bec342339138 8204195: Clean up macroAssembler.inline.hpp and other inline.hpp files included in .hpp files
coleenp
parents: 50193
diff changeset
    60
57464
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    61
void ChunkManager::account_for_removed_chunk(const Metachunk* c) {
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    62
  assert_lock_strong(MetaspaceExpand_lock);
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    63
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    64
  const chklvl_t lvl = c->level();
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    65
  check_valid_level(lvl);
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    66
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    67
  assert(_total_num_chunks > 0, "Sanity.");
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    68
  _total_num_chunks --;
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    69
  const size_t word_size = word_size_for_level(lvl);
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    70
  assert(_total_word_size >= word_size, "Sanity.");
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    71
  _total_word_size -= word_size_for_level(lvl);
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    72
  assert(_num_chunks[lvl] > 0, "Sanity.");
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    73
  _num_chunks[lvl] --;
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    74
}
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    75
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    76
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    77
// Remove a chunk of the given level from its freelist, and adjust accounting.
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    78
// If no chunk of this given level is free, return NULL.
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    79
Metachunk* ChunkManager::get_chunk_simple(chklvl_t level) {
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    80
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    81
  assert_lock_strong(MetaspaceExpand_lock);
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    82
  check_valid_level(level);
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    83
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    84
  Metachunk* c = _chunks[level];
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    85
  if (c != NULL) {
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    86
    account_for_removed_chunk(c);
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    87
  }
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    88
  return c;
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    89
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    90
}
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    91
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    92
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    93
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    94
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    95
// Return a chunk to the ChunkManager and adjust accounting. May merge chunk
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    96
//  with neighbors.
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    97
// Happens after a Classloader was unloaded and releases its metaspace chunks.
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    98
// !! Note: this may invalidate the chunk. Do not access the chunk after
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
    99
//    this function returns !!
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
   100
void ChunkManager::return_chunk(Metachunk* chunk) {
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
   101
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
   102
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
   103
}
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
   104
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
   105
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
   106
// Remove the given chunk from its free list and adjust accounting.
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
   107
// (Called during VirtualSpaceNode purging which happens during a Metaspace GC.)
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   108
void ChunkManager::remove_chunk(Metachunk* chunk) {
57464
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
   109
  assert_lock_strong(MetaspaceExpand_lock);
32e61f51ee09 initial commit
stuefe
parents: 54623
diff changeset
   110
  chunk->remove_from_list();
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   111
  account_for_removed_chunk(chunk);
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   112
}
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   113
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   114
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   115
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   116
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   117
} // namespace metaspace
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   118
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   119
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents:
diff changeset
   120