src/hotspot/share/memory/metaspace/metachunk.hpp
author stuefe
Thu, 12 Sep 2019 07:57:00 +0200
branchstuefe-new-metaspace-branch
changeset 58099 5aeb07390c74
parent 58063 bdf136b8ae0e
child 58227 0e7d9a23261e
permissions -rw-r--r--
Fixes for Windows x64
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
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    66
  // Guaranteed-to-be-committed-words, counted from base
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    67
  //  (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
    68
  //  which granules are committed; but we want to avoid asking it unnecessarily
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    69
  //  in Metachunk::allocate(), so we keep a limit until which we are guaranteed
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    70
  //  to have committed memory under us.)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    71
  size_t _committed_words;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    72
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    73
  chklvl_t _level; // aka size.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    74
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    75
  // state_free:    free, owned by ChunkManager
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    76
  // state_in_use:  in-use, owned by SpaceManager
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    77
  // 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
    78
  //                 by chunk header pool.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    79
  enum state_t {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    80
    state_free = 0,
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    81
    state_in_use = 1,
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    82
    state_dead = 2
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    83
  };
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    84
  state_t _state;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    85
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    86
  // 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
    87
  // for splitting and merging nodes.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    88
  VirtualSpaceNode* _vsnode;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    89
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
    90
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    91
  // A chunk header is kept in a list:
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    92
  // - 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
    93
  // - 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
    94
  // - 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
    95
  //   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
    96
  //   memory area.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    97
  Metachunk* _prev;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
    98
  Metachunk* _next;
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
    99
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   100
  // 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
   101
  // This is needed to split and merge chunks.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   102
  Metachunk* _prev_in_vs;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   103
  Metachunk* _next_in_vs;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   104
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   105
  MetaWord* top() const           { return base() + _used_words; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   106
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   107
  // Commit uncommitted section of the chunk.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   108
  // Fails if we hit a commit limit.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   109
  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
   110
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   111
public:
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   112
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   113
  Metachunk()
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   114
    : _base(NULL),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   115
      _used_words(0),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   116
      _committed_words(0),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   117
      _level(chklvl::ROOT_CHUNK_LEVEL),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   118
      _state(state_free),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   119
      _vsnode(NULL),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   120
      _prev(NULL), _next(NULL),
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   121
      _prev_in_vs(NULL), _next_in_vs(NULL)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   122
  {}
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   123
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   124
  size_t word_size() const        { return chklvl::word_size_for_level(_level); }
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents: 50066
diff changeset
   125
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   126
  MetaWord* base() const          { return _base; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   127
//  void set_base(MetaWord* p)      { _base = p; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   128
  MetaWord* end() const           { return base() + word_size(); }
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents: 50066
diff changeset
   129
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   130
  // Chunk list wiring
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   131
  void set_prev(Metachunk* c)     { _prev = c; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   132
  Metachunk* prev() const         { return _prev; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   133
  void set_next(Metachunk* c)     { _next = c; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   134
  Metachunk* next() const         { return _next; }
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   135
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   136
  DEBUG_ONLY(bool in_list() const { return _prev != NULL || _next != NULL; })
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   137
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   138
  // Physical neighbors wiring
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   139
  void set_prev_in_vs(Metachunk* c) { _prev_in_vs = c; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   140
  Metachunk* prev_in_vs() const     { return _prev_in_vs; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   141
  void set_next_in_vs(Metachunk* c) { _next_in_vs = c; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   142
  Metachunk* next_in_vs() const     { return _next_in_vs; }
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   143
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   144
  bool is_free() const            { return _state == state_free; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   145
  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
   146
  bool is_dead() const            { return _state == state_dead; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   147
  void set_free()                 { _state = state_free; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   148
  void set_in_use()               { _state = state_in_use; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   149
  void set_dead()                 { _state = state_dead; }
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
  // 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
   152
  char get_state_char() const;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   153
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   154
  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
   155
  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
   156
//  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
   157
  chklvl_t level() const          { return _level; }
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   158
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   159
  // Convenience functions for extreme levels.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   160
  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
   161
  bool is_leaf_chunk() const      { return chklvl::HIGHEST_CHUNK_LEVEL == _level; }
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   162
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   163
  VirtualSpaceNode* vsnode() const        { return _vsnode; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   164
//  void set_vsnode(VirtualSpaceNode* n)    { _vsnode = n; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   165
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   166
  size_t used_words() const                   { return _used_words; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   167
  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
   168
  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
   169
  void reset_used_words()                     { _used_words = 0; }
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   170
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   171
  size_t committed_words() const      { return _committed_words; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   172
  void set_committed_words(size_t v);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   173
  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
   174
  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
   175
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   176
  // 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
   177
  // Fails if we hit a commit limit.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   178
  bool ensure_committed(size_t new_committed_words);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   179
  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
   180
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   181
  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
   182
  bool ensure_fully_committed_locked()    { return ensure_committed_locked(word_size()); }
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   183
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   184
  // 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
   185
  // 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
   186
  // a commit granule size).
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   187
  void uncommit();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   188
  void uncommit_locked();
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   189
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   190
  // Alignment of an allocation.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   191
  static const size_t allocation_alignment_bytes = 8;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   192
  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
   193
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   194
  // Allocation from a chunk
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   195
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   196
  // 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
   197
  //  allocation_alignment_words).
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   198
  //
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   199
  // 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
   200
  //  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
   201
  // 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
   202
  //  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
   203
  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
   204
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   205
  // 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
   206
  // 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
   207
  // 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
   208
  // 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
   209
  bool attempt_rollback_allocation(MetaWord* p, size_t word_size);
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   210
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   211
  // Initialize structure for reuse.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   212
  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
   213
    _vsnode = node; _base = base; _level = lvl;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   214
    _used_words = _committed_words = 0; _state = state_free;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   215
    _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
   216
  }
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
  // 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
   219
  // Must not be called for root chunks.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   220
  bool is_leader() const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   221
    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
   222
    // I am sure this can be done smarter...
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   223
    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
   224
  }
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   225
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   226
  //// Debug stuff ////
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   227
#ifdef ASSERT
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   228
  void verify(bool slow) const;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   229
  void zap_header(uint8_t c = 0x17);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   230
  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
   231
  void check_pattern(MetaWord pattern, size_t word_size);
14123
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
   232
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   233
  // 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
   234
  bool is_valid_pointer(const MetaWord* p) const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   235
    return base() <= p && p < top();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   236
  }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   237
#endif // ASSERT
22201
9c2ccfa3a5fe 8029178: Parallel class loading test anonymous-simple gets SIGSEGV in Metaspace::contains
coleenp
parents: 20732
diff changeset
   238
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   239
  void print_on(outputStream* st) const;
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   240
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   241
};
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   242
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   243
// 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
   244
#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
   245
#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
   246
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   247
#define METACHUNK_FULL_FORMAT                "@" PTR_FORMAT ", %c, base " PTR_FORMAT ", level " CHKLVL_FORMAT " (" SIZE_FORMAT "), used: " SIZE_FORMAT ", committed: " SIZE_FORMAT
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   248
#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()
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   249
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
// A list of Metachunks.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   252
class MetachunkList {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   253
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   254
  Metachunk* _first;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   255
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   256
  // Number of chunks
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   257
  IntCounter _num;
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
public:
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   260
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   261
  MetachunkList() : _first(NULL), _num() {}
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() const { return _first; }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   264
  int size() const { return _num.get(); }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   265
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   266
  void add(Metachunk* c) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   267
    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
   268
    if (_first) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   269
      _first->set_prev(c);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   270
    }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   271
    c->set_next(_first);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   272
    c->set_prev(NULL);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   273
    _first = c;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   274
    _num.increment();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   275
  }
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   276
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   277
  // 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
   278
  Metachunk* remove_first() {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   279
    Metachunk* c = _first;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   280
    if (c != NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   281
      assert(c->prev() == NULL, "Sanity");
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   282
      Metachunk* c2 = c->next();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   283
      if (c2 != NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   284
        c2->set_prev(NULL);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   285
      }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   286
      _first = c2;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   287
      c->set_next(NULL);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   288
      _num.decrement();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   289
    }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   290
    return c;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   291
  }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   292
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   293
  // 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
   294
  void remove(Metachunk* c) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   295
    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
   296
    if (_first == c) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   297
      _first = c->next();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   298
      if (_first != NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   299
        _first->set_prev(NULL);
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
    } else {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   302
      if (c->next() != NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   303
        c->next()->set_prev(c->prev());
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   304
      }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   305
      if (c->prev() != NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   306
        c->prev()->set_next(c->next());
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   307
      }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   308
    }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   309
    c->set_prev(NULL);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   310
    c->set_next(NULL);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   311
    _num.decrement();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   312
  }
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
#ifdef ASSERT
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   315
  bool contains(const Metachunk* c) const;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   316
  void verify(bool slow) const;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   317
#endif
20732
39d1710a9a1c 8026707: JDK-8026391 broke the optimized build target
stefank
parents: 20729
diff changeset
   318
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   319
  // 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
   320
  // Note: walks list.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   321
  size_t committed_word_size() const {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   322
    size_t l = 0;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   323
    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
   324
      l += c->committed_words();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   325
    }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   326
    return l;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   327
  }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   328
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   329
  void print_on(outputStream* st) const;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   330
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   331
};
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   332
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   333
//////////////////
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   334
// 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
   335
class MetachunkListCluster {
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
  MetachunkList _lists[chklvl::NUM_CHUNK_LEVELS];
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   338
  SizeCounter   _total_word_size;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   339
  IntCounter    _total_num_chunks;
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
  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
   342
  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
   343
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   344
  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
   345
  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
   346
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   347
public:
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   348
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   349
  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
   350
  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
   351
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   352
  // 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
   353
  void remove(Metachunk* c) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   354
    list_for_chunk(c)->remove(c);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   355
    _total_word_size.decrement_by(c->word_size());
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   356
    _total_num_chunks.decrement();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   357
  }
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   358
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   359
  // 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
   360
  Metachunk* remove_first(chklvl_t lvl) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   361
    Metachunk* c = list_for_level(lvl)->remove_first();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   362
    if (c != NULL) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   363
      _total_word_size.decrement_by(c->word_size());
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   364
      _total_num_chunks.decrement();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   365
    }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   366
    return c;
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   367
  }
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   368
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   369
  void add(Metachunk* c) {
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   370
    list_for_chunk(c)->add(c);
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   371
    _total_word_size.increment_by(c->word_size());
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   372
    _total_num_chunks.increment();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   373
  }
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
  // Returns number of chunks for a given level.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   376
  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
   377
    return list_for_level(lvl)->size();
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   378
  }
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   379
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   380
  // Returns number of chunks for a given level.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   381
  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
   382
    return list_for_level(lvl)->committed_word_size();
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
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   385
  // 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
   386
  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
   387
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   388
  // Returns number of chunks in total
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   389
  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
   390
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   391
  // 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
   392
  // Note: walks lists.
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   393
  size_t total_committed_word_size() const {
58099
5aeb07390c74 Fixes for Windows x64
stuefe
parents: 58063
diff changeset
   394
    size_t sum = 0;
58063
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   395
    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
   396
      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
   397
    }
58099
5aeb07390c74 Fixes for Windows x64
stuefe
parents: 58063
diff changeset
   398
    return sum;
58063
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
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   401
  DEBUG_ONLY(void verify(bool slow) const;)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   402
  DEBUG_ONLY(bool contains(const Metachunk* c) const;)
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   403
bdf136b8ae0e Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents: 53244
diff changeset
   404
  void print_on(outputStream* st) const;
49365
825f006619e5 8198423: Improve metaspace chunk allocation
stuefe
parents: 47808
diff changeset
   405
14123
944e56f74fba 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents:
diff changeset
   406
};
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   407
50193
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents: 50066
diff changeset
   408
49c3e91c424f 8176808: Split up metaspace.cpp
stuefe
parents: 50066
diff changeset
   409
} // namespace metaspace
20729
0a687ee7097d 8026391: The Metachunk header wastes memory
stefank
parents: 17101
diff changeset
   410
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 50193
diff changeset
   411
#endif // SHARE_MEMORY_METASPACE_METACHUNK_HPP