src/hotspot/share/memory/metaspace/metachunk.hpp
author stuefe
Tue, 26 Nov 2019 16:21:29 +0100
branchstuefe-new-metaspace-branch
changeset 59272 54750b448264
parent 58880 e18d2d9d1515
permissions -rw-r--r--
Metadatatype back to metaspace.hpp to reduce patch size
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14123
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
     1
/*
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
     2
 * Copyright (c) 2019, SAP SE. All rights reserved.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
     3
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
14123
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
     4
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
     5
 *
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
     6
 * This code is free software; you can redistribute it and/or modify it
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
     7
 * under the terms of the GNU General Public License version 2 only, as
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
     8
 * published by the Free Software Foundation.
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
     9
 *
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
    14
 * accompanied this code).
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
    15
 *
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
    19
 *
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
    22
 * questions.
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
    23
 *
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
    24
 */
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 50193
diff changeset
    25
#ifndef SHARE_MEMORY_METASPACE_METACHUNK_HPP
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 50193
diff changeset
    26
#define SHARE_MEMORY_METASPACE_METACHUNK_HPP
14123
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
    27
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    28
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    29
#include "memory/metaspace/counter.hpp"
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    30
#include "memory/metaspace/chunkLevel.hpp"
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
    31
#include "utilities/debug.hpp"
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
    32
#include "utilities/globalDefinitions.hpp"
14123
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
    33
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    34
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    35
class outputStream;
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
    36
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents: 50066
diff changeset
    37
namespace metaspace {
14123
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
    38
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents: 50066
diff changeset
    39
class VirtualSpaceNode;
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
    40
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
    41
//  Metachunk - Quantum of allocation from a Virtualspace
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
    42
//    Metachunks are reused (when freed are put on a global freelist) and
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
    43
//    have no permanent association to a SpaceManager.
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
    44
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    45
//            +--------------+ <- end    ----+         --+
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    46
//            |              |               |           |
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    47
//            |              |               | free      |
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    48
//            |              |               |
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    49
//            |              |               |           | size (aka capacity)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    50
//            |              |               |           |
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    51
//            | -----------  | <- top     -- +           |
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    52
//            |              |               |           |
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    53
//            |              |               | used      |
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    54
//            +--------------+ <- start   -- +        -- +
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    55
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    56
// Note: this is a chunk **descriptor**. The real Payload area lives in metaspace,
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    57
// this class lives somewhere else.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    58
class Metachunk {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    59
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    60
  // start of chunk memory; NULL if dead.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    61
  MetaWord* _base;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    62
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    63
  // Used words.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    64
  size_t _used_words;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    65
58227
0e7d9a23261e Fix various test issues.
stuefe
parents: 58099
diff changeset
    66
  // Size of the region, starting from base, which is guaranteed to be committed. In words.
0e7d9a23261e Fix various test issues.
stuefe
parents: 58099
diff changeset
    67
  //  The actual size of committed regions may be larger, but it may be fragmented.
0e7d9a23261e Fix various test issues.
stuefe
parents: 58099
diff changeset
    68
  //
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    69
  //  (This is a performance optimization. The underlying VirtualSpaceNode knows
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    70
  //  which granules are committed; but we want to avoid asking it unnecessarily
58227
0e7d9a23261e Fix various test issues.
stuefe
parents: 58099
diff changeset
    71
  //  in Metachunk::allocate().)
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    72
  size_t _committed_words;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    73
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    74
  chklvl_t _level; // aka size.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    75
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    76
  // state_free:    free, owned by ChunkManager
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    77
  // state_in_use:  in-use, owned by SpaceManager
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    78
  // dead:          just a hollow chunk header without associated memory, owned
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    79
  //                 by chunk header pool.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    80
  enum state_t {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    81
    state_free = 0,
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    82
    state_in_use = 1,
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    83
    state_dead = 2
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    84
  };
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    85
  state_t _state;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    86
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    87
  // We need unfortunately a back link to the virtual space node
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    88
  // for splitting and merging nodes.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    89
  VirtualSpaceNode* _vsnode;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    90
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
    91
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    92
  // A chunk header is kept in a list:
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    93
  // - in the list of used chunks inside a SpaceManager, if it is in use
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    94
  // - in the list of free chunks inside a ChunkManager, if it is free
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    95
  // - in the freelist of unused headers inside the ChunkHeaderPool,
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    96
  //   if it is unused (e.g. result of chunk merging) and has no associated
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    97
  //   memory area.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    98
  Metachunk* _prev;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    99
  Metachunk* _next;
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   100
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   101
  // Furthermore, we keep, per chunk, information about the neighboring chunks.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   102
  // This is needed to split and merge chunks.
58227
0e7d9a23261e Fix various test issues.
stuefe
parents: 58099
diff changeset
   103
  //
0e7d9a23261e Fix various test issues.
stuefe
parents: 58099
diff changeset
   104
  // Note: These members can be modified concurrently while a chunk is alive and in use.
0e7d9a23261e Fix various test issues.
stuefe
parents: 58099
diff changeset
   105
  // This can happen if a neighboring chunk is added or removed.
0e7d9a23261e Fix various test issues.
stuefe
parents: 58099
diff changeset
   106
  // This means only read or modify these members under expand lock protection.
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   107
  Metachunk* _prev_in_vs;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   108
  Metachunk* _next_in_vs;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   109
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   110
  MetaWord* top() const           { return base() + _used_words; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   111
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   112
  // Commit uncommitted section of the chunk.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   113
  // Fails if we hit a commit limit.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   114
  bool commit_up_to(size_t new_committed_words);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   115
58227
0e7d9a23261e Fix various test issues.
stuefe
parents: 58099
diff changeset
   116
  DEBUG_ONLY(static void assert_have_expand_lock();)
0e7d9a23261e Fix various test issues.
stuefe
parents: 58099
diff changeset
   117
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   118
public:
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   119
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   120
  Metachunk()
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   121
    : _base(NULL),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   122
      _used_words(0),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   123
      _committed_words(0),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   124
      _level(chklvl::ROOT_CHUNK_LEVEL),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   125
      _state(state_free),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   126
      _vsnode(NULL),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   127
      _prev(NULL), _next(NULL),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   128
      _prev_in_vs(NULL), _next_in_vs(NULL)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   129
  {}
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   130
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   131
  size_t word_size() const        { return chklvl::word_size_for_level(_level); }
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents: 50066
diff changeset
   132
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   133
  MetaWord* base() const          { return _base; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   134
//  void set_base(MetaWord* p)      { _base = p; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   135
  MetaWord* end() const           { return base() + word_size(); }
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents: 50066
diff changeset
   136
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   137
  // Chunk list wiring
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   138
  void set_prev(Metachunk* c)     { _prev = c; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   139
  Metachunk* prev() const         { return _prev; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   140
  void set_next(Metachunk* c)     { _next = c; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   141
  Metachunk* next() const         { return _next; }
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   142
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   143
  DEBUG_ONLY(bool in_list() const { return _prev != NULL || _next != NULL; })
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   144
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   145
  // Physical neighbors wiring
58227
0e7d9a23261e Fix various test issues.
stuefe
parents: 58099
diff changeset
   146
  void set_prev_in_vs(Metachunk* c) { DEBUG_ONLY(assert_have_expand_lock()); _prev_in_vs = c; }
0e7d9a23261e Fix various test issues.
stuefe
parents: 58099
diff changeset
   147
  Metachunk* prev_in_vs() const     { DEBUG_ONLY(assert_have_expand_lock()); return _prev_in_vs; }
0e7d9a23261e Fix various test issues.
stuefe
parents: 58099
diff changeset
   148
  void set_next_in_vs(Metachunk* c) { DEBUG_ONLY(assert_have_expand_lock()); _next_in_vs = c; }
0e7d9a23261e Fix various test issues.
stuefe
parents: 58099
diff changeset
   149
  Metachunk* next_in_vs() const     { DEBUG_ONLY(assert_have_expand_lock()); return _next_in_vs; }
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   150
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   151
  bool is_free() const            { return _state == state_free; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   152
  bool is_in_use() const          { return _state == state_in_use; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   153
  bool is_dead() const            { return _state == state_dead; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   154
  void set_free()                 { _state = state_free; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   155
  void set_in_use()               { _state = state_in_use; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   156
  void set_dead()                 { _state = state_dead; }
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   157
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   158
  // Return a single char presentation of the state ('f', 'u', 'd')
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   159
  char get_state_char() const;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   160
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   161
  void inc_level()                { _level ++; DEBUG_ONLY(chklvl::is_valid_level(_level);) }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   162
  void dec_level()                { _level --; DEBUG_ONLY(chklvl::is_valid_level(_level);) }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   163
//  void set_level(chklvl_t v)      { _level = v; DEBUG_ONLY(chklvl::is_valid_level(_level);) }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   164
  chklvl_t level() const          { return _level; }
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   165
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   166
  // Convenience functions for extreme levels.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   167
  bool is_root_chunk() const      { return chklvl::ROOT_CHUNK_LEVEL == _level; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   168
  bool is_leaf_chunk() const      { return chklvl::HIGHEST_CHUNK_LEVEL == _level; }
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   169
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   170
  VirtualSpaceNode* vsnode() const        { return _vsnode; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   171
//  void set_vsnode(VirtualSpaceNode* n)    { _vsnode = n; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   172
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   173
  size_t used_words() const                   { return _used_words; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   174
  size_t free_words() const                   { return word_size() - used_words(); }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   175
  size_t free_below_committed_words() const   { return committed_words() - used_words(); }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   176
  void reset_used_words()                     { _used_words = 0; }
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   177
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   178
  size_t committed_words() const      { return _committed_words; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   179
  void set_committed_words(size_t v);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   180
  bool is_fully_committed() const     { return committed_words() == word_size(); }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   181
  bool is_fully_uncommitted() const   { return committed_words() == 0; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   182
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   183
  // Ensure that chunk is committed up to at least new_committed_words words.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   184
  // Fails if we hit a commit limit.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   185
  bool ensure_committed(size_t new_committed_words);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   186
  bool ensure_committed_locked(size_t new_committed_words);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   187
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   188
  bool ensure_fully_committed()           { return ensure_committed(word_size()); }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   189
  bool ensure_fully_committed_locked()    { return ensure_committed_locked(word_size()); }
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   190
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   191
  // Uncommit chunk area. The area must be a common multiple of the
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   192
  // commit granule size (in other words, we cannot uncommit chunks smaller than
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   193
  // a commit granule size).
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   194
  void uncommit();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   195
  void uncommit_locked();
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   196
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   197
  // Alignment of an allocation.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   198
  static const size_t allocation_alignment_bytes = 8;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   199
  static const size_t allocation_alignment_words = allocation_alignment_bytes / BytesPerWord;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   200
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   201
  // Allocation from a chunk
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   202
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   203
  // Allocate word_size words from this chunk (word_size must be aligned to
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   204
  //  allocation_alignment_words).
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   205
  //
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   206
  // May cause memory to be committed. That may fail if we hit a commit limit. In that case,
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   207
  //  NULL is returned and p_did_hit_commit_limit will be set to true.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   208
  // If the remainder portion of the chunk was too small to hold the allocation,
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   209
  //  NULL is returned and p_did_hit_commit_limit will be set to false.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   210
  MetaWord* allocate(size_t net_word_size, bool* p_did_hit_commit_limit);
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   211
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   212
  // Given a memory range which may or may not have been allocated from this chunk, attempt
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   213
  // to roll its allocation back. This can work if this is the very last allocation we did
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   214
  // from this chunk, in which case we just lower the top pointer again.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   215
  // Returns true if this succeeded, false if it failed.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   216
  bool attempt_rollback_allocation(MetaWord* p, size_t word_size);
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   217
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   218
  // Initialize structure for reuse.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   219
  void initialize(VirtualSpaceNode* node, MetaWord* base, chklvl_t lvl) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   220
    _vsnode = node; _base = base; _level = lvl;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   221
    _used_words = _committed_words = 0; _state = state_free;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   222
    _next = _prev = _next_in_vs = _prev_in_vs = NULL;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   223
  }
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   224
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   225
  // Returns true if this chunk is the leader in its buddy pair, false if not.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   226
  // Must not be called for root chunks.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   227
  bool is_leader() const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   228
    assert(!is_root_chunk(), "Root chunks have no buddy.");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   229
    // I am sure this can be done smarter...
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   230
    return is_aligned(base(), chklvl::word_size_for_level(level() - 1) * BytesPerWord);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   231
  }
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   232
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   233
  //// Debug stuff ////
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   234
#ifdef ASSERT
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   235
  void verify(bool slow) const;
58227
0e7d9a23261e Fix various test issues.
stuefe
parents: 58099
diff changeset
   236
  // Verifies linking with neighbors in virtual space. Needs expand lock protection.
0e7d9a23261e Fix various test issues.
stuefe
parents: 58099
diff changeset
   237
  void verify_neighborhood() const;
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   238
  void zap_header(uint8_t c = 0x17);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   239
  void fill_with_pattern(MetaWord pattern, size_t word_size);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   240
  void check_pattern(MetaWord pattern, size_t word_size);
14123
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
   241
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   242
  // Returns true if pointer points into the used area of this chunk.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   243
  bool is_valid_pointer(const MetaWord* p) const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   244
    return base() <= p && p < top();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   245
  }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   246
#endif // ASSERT
22201
9c2ccfa3a5fe 8029178: Parallel class loading test anonymous-simple gets SIGSEGV in Metaspace::contains
coleenp
parents: 20732
diff changeset
   247
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   248
  void print_on(outputStream* st) const;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   249
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   250
};
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   251
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   252
// Little print helpers: since we often print out chunks, here some convenience macros
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   253
#define METACHUNK_FORMAT                "@" PTR_FORMAT ", %c, base " PTR_FORMAT ", level " CHKLVL_FORMAT
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   254
#define METACHUNK_FORMAT_ARGS(chunk)    p2i(chunk), chunk->get_state_char(), p2i(chunk->base()), chunk->level()
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   255
58880
e18d2d9d1515 Print committed-free when tracing chunk details
stuefe
parents: 58227
diff changeset
   256
#define METACHUNK_FULL_FORMAT                "@" PTR_FORMAT ", %c, base " PTR_FORMAT ", level " CHKLVL_FORMAT " (" SIZE_FORMAT "), used: " SIZE_FORMAT ", committed: " SIZE_FORMAT ", committed-free: " SIZE_FORMAT
e18d2d9d1515 Print committed-free when tracing chunk details
stuefe
parents: 58227
diff changeset
   257
#define METACHUNK_FULL_FORMAT_ARGS(chunk)    p2i(chunk), chunk->get_state_char(), p2i(chunk->base()), chunk->level(), chunk->word_size(), chunk->used_words(), chunk->committed_words(), chunk->free_below_committed_words()
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   258
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   259
/////////
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   260
// A list of Metachunks.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   261
class MetachunkList {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   262
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   263
  Metachunk* _first;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   264
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   265
  // Number of chunks
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   266
  IntCounter _num;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   267
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   268
public:
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   269
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   270
  MetachunkList() : _first(NULL), _num() {}
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   271
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   272
  Metachunk* first() const { return _first; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   273
  int size() const { return _num.get(); }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   274
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   275
  void add(Metachunk* c) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   276
    assert(!c->in_list(), "Chunk must not be in a list");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   277
    if (_first) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   278
      _first->set_prev(c);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   279
    }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   280
    c->set_next(_first);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   281
    c->set_prev(NULL);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   282
    _first = c;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   283
    _num.increment();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   284
  }
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   285
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   286
  // Remove first node unless empty. Returns node or NULL.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   287
  Metachunk* remove_first() {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   288
    Metachunk* c = _first;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   289
    if (c != NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   290
      assert(c->prev() == NULL, "Sanity");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   291
      Metachunk* c2 = c->next();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   292
      if (c2 != NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   293
        c2->set_prev(NULL);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   294
      }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   295
      _first = c2;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   296
      c->set_next(NULL);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   297
      _num.decrement();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   298
    }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   299
    return c;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   300
  }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   301
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   302
  // Remove given chunk from list. List must contain that chunk.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   303
  void remove(Metachunk* c) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   304
    assert(contains(c), "List does not contain this chunk");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   305
    if (_first == c) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   306
      _first = c->next();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   307
      if (_first != NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   308
        _first->set_prev(NULL);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   309
      }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   310
    } else {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   311
      if (c->next() != NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   312
        c->next()->set_prev(c->prev());
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   313
      }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   314
      if (c->prev() != NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   315
        c->prev()->set_next(c->next());
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   316
      }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   317
    }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   318
    c->set_prev(NULL);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   319
    c->set_next(NULL);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   320
    _num.decrement();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   321
  }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   322
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   323
#ifdef ASSERT
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   324
  bool contains(const Metachunk* c) const;
58227
0e7d9a23261e Fix various test issues.
stuefe
parents: 58099
diff changeset
   325
  void verify() const;
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   326
#endif
20732
39d1710a9a1c 8026707: JDK-8026391 broke the optimized build target
stefank
parents: 20729
diff changeset
   327
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   328
  // Returns size, in words, of committed space of all chunks in this list.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   329
  // Note: walks list.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   330
  size_t committed_word_size() const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   331
    size_t l = 0;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   332
    for (const Metachunk* c = _first; c != NULL; c = c->next()) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   333
      l += c->committed_words();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   334
    }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   335
    return l;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   336
  }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   337
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   338
  void print_on(outputStream* st) const;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   339
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   340
};
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   341
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   342
//////////////////
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   343
// A cluster of Metachunk Lists, one for each chunk level, together with associated counters.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   344
class MetachunkListCluster {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   345
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   346
  MetachunkList _lists[chklvl::NUM_CHUNK_LEVELS];
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   347
  SizeCounter   _total_word_size;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   348
  IntCounter    _total_num_chunks;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   349
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   350
  const MetachunkList* list_for_level(chklvl_t lvl) const         { DEBUG_ONLY(chklvl::check_valid_level(lvl)); return _lists + lvl; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   351
  MetachunkList* list_for_level(chklvl_t lvl)                     { DEBUG_ONLY(chklvl::check_valid_level(lvl)); return _lists + lvl; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   352
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   353
  const MetachunkList* list_for_chunk(const Metachunk* c) const   { return list_for_level(c->level()); }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   354
  MetachunkList* list_for_chunk(const Metachunk* c)               { return list_for_level(c->level()); }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   355
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   356
public:
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   357
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   358
  const Metachunk* first_at_level(chklvl_t lvl) const   { return list_for_level(lvl)->first(); }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   359
  Metachunk* first_at_level(chklvl_t lvl)               { return list_for_level(lvl)->first(); }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   360
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   361
  // Remove given chunk from its list. List must contain that chunk.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   362
  void remove(Metachunk* c) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   363
    list_for_chunk(c)->remove(c);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   364
    _total_word_size.decrement_by(c->word_size());
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   365
    _total_num_chunks.decrement();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   366
  }
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   367
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   368
  // Remove first node unless empty. Returns node or NULL.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   369
  Metachunk* remove_first(chklvl_t lvl) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   370
    Metachunk* c = list_for_level(lvl)->remove_first();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   371
    if (c != NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   372
      _total_word_size.decrement_by(c->word_size());
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   373
      _total_num_chunks.decrement();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   374
    }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   375
    return c;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   376
  }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   377
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   378
  void add(Metachunk* c) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   379
    list_for_chunk(c)->add(c);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   380
    _total_word_size.increment_by(c->word_size());
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   381
    _total_num_chunks.increment();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   382
  }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   383
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   384
  // Returns number of chunks for a given level.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   385
  int num_chunks_at_level(chklvl_t lvl) const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   386
    return list_for_level(lvl)->size();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   387
  }
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   388
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   389
  // Returns number of chunks for a given level.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   390
  size_t committed_word_size_at_level(chklvl_t lvl) const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   391
    return list_for_level(lvl)->committed_word_size();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   392
  }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   393
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   394
  // Returs word size, in total, of all chunks in all lists.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   395
  size_t total_word_size() const          { return _total_word_size.get(); }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   396
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   397
  // Returns number of chunks in total
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   398
  int total_num_chunks() const            { return _total_num_chunks.get(); }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   399
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   400
  // Returns size, in words, of committed space of all chunks in all list.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   401
  // Note: walks lists.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   402
  size_t total_committed_word_size() const {
58099
5aeb07390c74 Fixes for Windows x64
stuefe
parents: 58063
diff changeset
   403
    size_t sum = 0;
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   404
    for (chklvl_t l = chklvl::LOWEST_CHUNK_LEVEL; l <= chklvl::HIGHEST_CHUNK_LEVEL; l ++) {
58099
5aeb07390c74 Fixes for Windows x64
stuefe
parents: 58063
diff changeset
   405
      sum += list_for_level(l)->committed_word_size();
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   406
    }
58099
5aeb07390c74 Fixes for Windows x64
stuefe
parents: 58063
diff changeset
   407
    return sum;
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   408
  }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   409
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   410
  DEBUG_ONLY(void verify(bool slow) const;)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   411
  DEBUG_ONLY(bool contains(const Metachunk* c) const;)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   412
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   413
  void print_on(outputStream* st) const;
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   414
14123
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
   415
};
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   416
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents: 50066
diff changeset
   417
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents: 50066
diff changeset
   418
} // namespace metaspace
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   419
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 50193
diff changeset
   420
#endif // SHARE_MEMORY_METASPACE_METACHUNK_HPP