author | stuefe |
Tue, 26 Nov 2019 16:21:29 +0100 | |
branch | stuefe-new-metaspace-branch |
changeset 59272 | 54750b448264 |
parent 58880 | e18d2d9d1515 |
permissions | -rw-r--r-- |
14123 | 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 | 4 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
5 |
* |
|
6 |
* This code is free software; you can redistribute it and/or modify it |
|
7 |
* under the terms of the GNU General Public License version 2 only, as |
|
8 |
* published by the Free Software Foundation. |
|
9 |
* |
|
10 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
11 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
12 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
13 |
* version 2 for more details (a copy is included in the LICENSE file that |
|
14 |
* accompanied this code). |
|
15 |
* |
|
16 |
* You should have received a copy of the GNU General Public License version |
|
17 |
* 2 along with this work; if not, write to the Free Software Foundation, |
|
18 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
19 |
* |
|
20 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
21 |
* or visit www.oracle.com if you need additional information or have any |
|
22 |
* questions. |
|
23 |
* |
|
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 | 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 | 31 |
#include "utilities/debug.hpp" |
32 |
#include "utilities/globalDefinitions.hpp" |
|
14123 | 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 | 36 |
|
50193 | 37 |
namespace metaspace { |
14123 | 38 |
|
50193 | 39 |
class VirtualSpaceNode; |
20729 | 40 |
|
41 |
// Metachunk - Quantum of allocation from a Virtualspace |
|
42 |
// Metachunks are reused (when freed are put on a global freelist) and |
|
43 |
// have no permanent association to a SpaceManager. |
|
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 | 66 |
// Size of the region, starting from base, which is guaranteed to be committed. In words. |
67 |
// The actual size of committed regions may be larger, but it may be fragmented. |
|
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 | 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 | 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 | 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 | 103 |
// |
104 |
// Note: These members can be modified concurrently while a chunk is alive and in use. |
|
105 |
// This can happen if a neighboring chunk is added or removed. |
|
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 | 116 |
DEBUG_ONLY(static void assert_have_expand_lock();) |
117 |
||
58063
bdf136b8ae0e
Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents:
53244
diff
changeset
|
118 |
public: |
49365 | 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 | 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 | 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 | 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 | 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 | 144 |
|
58063
bdf136b8ae0e
Initial changes for new metaspace. Only tested for Linux x64.
stuefe
parents:
53244
diff
changeset
|
145 |
// Physical neighbors wiring |
58227 | 146 |
void set_prev_in_vs(Metachunk* c) { DEBUG_ONLY(assert_have_expand_lock()); _prev_in_vs = c; } |
147 |
Metachunk* prev_in_vs() const { DEBUG_ONLY(assert_have_expand_lock()); return _prev_in_vs; } |
|
148 |
void set_next_in_vs(Metachunk* c) { DEBUG_ONLY(assert_have_expand_lock()); _next_in_vs = c; } |
|
149 |
Metachunk* next_in_vs() const { DEBUG_ONLY(assert_have_expand_lock()); return _next_in_vs; } |
|
49365 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 236 |
// Verifies linking with neighbors in virtual space. Needs expand lock protection. |
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 | 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 | 248 |
void print_on(outputStream* st) const; |
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 | 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 |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 414 |
|
14123 | 415 |
}; |
20729 | 416 |
|
50193 | 417 |
|
418 |
} // namespace metaspace |
|
20729 | 419 |
|
53244
9807daeb47c4
8216167: Update include guards to reflect correct directories
coleenp
parents:
50193
diff
changeset
|
420 |
#endif // SHARE_MEMORY_METASPACE_METACHUNK_HPP |