Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/share/gc/g1/g1Allocator.hpp
40961 views
1
/*
2
* Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*
23
*/
24
25
#ifndef SHARE_GC_G1_G1ALLOCATOR_HPP
26
#define SHARE_GC_G1_G1ALLOCATOR_HPP
27
28
#include "gc/g1/g1AllocRegion.hpp"
29
#include "gc/g1/g1HeapRegionAttr.hpp"
30
#include "gc/shared/collectedHeap.hpp"
31
#include "gc/shared/plab.hpp"
32
33
class G1EvacuationInfo;
34
class G1NUMA;
35
36
// Interface to keep track of which regions G1 is currently allocating into. Provides
37
// some accessors (e.g. allocating into them, or getting their occupancy).
38
// Also keeps track of retained regions across GCs.
39
class G1Allocator : public CHeapObj<mtGC> {
40
friend class VMStructs;
41
42
private:
43
G1CollectedHeap* _g1h;
44
G1NUMA* _numa;
45
46
bool _survivor_is_full;
47
bool _old_is_full;
48
49
// The number of MutatorAllocRegions used, one per memory node.
50
size_t _num_alloc_regions;
51
52
// Alloc region used to satisfy mutator allocation requests.
53
MutatorAllocRegion* _mutator_alloc_regions;
54
55
// Alloc region used to satisfy allocation requests by the GC for
56
// survivor objects.
57
SurvivorGCAllocRegion* _survivor_gc_alloc_regions;
58
59
// Alloc region used to satisfy allocation requests by the GC for
60
// old objects.
61
OldGCAllocRegion _old_gc_alloc_region;
62
63
HeapRegion* _retained_old_gc_alloc_region;
64
65
bool survivor_is_full() const;
66
bool old_is_full() const;
67
68
void set_survivor_full();
69
void set_old_full();
70
71
void reuse_retained_old_region(G1EvacuationInfo& evacuation_info,
72
OldGCAllocRegion* old,
73
HeapRegion** retained);
74
75
// Accessors to the allocation regions.
76
inline MutatorAllocRegion* mutator_alloc_region(uint node_index);
77
inline SurvivorGCAllocRegion* survivor_gc_alloc_region(uint node_index);
78
inline OldGCAllocRegion* old_gc_alloc_region();
79
80
// Allocation attempt during GC for a survivor object / PLAB.
81
HeapWord* survivor_attempt_allocation(size_t min_word_size,
82
size_t desired_word_size,
83
size_t* actual_word_size,
84
uint node_index);
85
86
// Allocation attempt during GC for an old object / PLAB.
87
HeapWord* old_attempt_allocation(size_t min_word_size,
88
size_t desired_word_size,
89
size_t* actual_word_size);
90
91
// Node index of current thread.
92
inline uint current_node_index() const;
93
94
public:
95
G1Allocator(G1CollectedHeap* heap);
96
~G1Allocator();
97
98
uint num_nodes() { return (uint)_num_alloc_regions; }
99
100
#ifdef ASSERT
101
// Do we currently have an active mutator region to allocate into?
102
bool has_mutator_alloc_region();
103
#endif
104
105
void init_mutator_alloc_regions();
106
void release_mutator_alloc_regions();
107
108
void init_gc_alloc_regions(G1EvacuationInfo& evacuation_info);
109
void release_gc_alloc_regions(G1EvacuationInfo& evacuation_info);
110
void abandon_gc_alloc_regions();
111
bool is_retained_old_region(HeapRegion* hr);
112
113
// Allocate blocks of memory during mutator time.
114
115
inline HeapWord* attempt_allocation(size_t min_word_size,
116
size_t desired_word_size,
117
size_t* actual_word_size);
118
inline HeapWord* attempt_allocation_locked(size_t word_size);
119
inline HeapWord* attempt_allocation_force(size_t word_size);
120
121
size_t unsafe_max_tlab_alloc();
122
size_t used_in_alloc_regions();
123
124
// Allocate blocks of memory during garbage collection. Will ensure an
125
// allocation region, either by picking one or expanding the
126
// heap, and then allocate a block of the given size. The block
127
// may not be a humongous - it must fit into a single heap region.
128
HeapWord* par_allocate_during_gc(G1HeapRegionAttr dest,
129
size_t word_size,
130
uint node_index);
131
132
HeapWord* par_allocate_during_gc(G1HeapRegionAttr dest,
133
size_t min_word_size,
134
size_t desired_word_size,
135
size_t* actual_word_size,
136
uint node_index);
137
};
138
139
// Manages the PLABs used during garbage collection. Interface for allocation from PLABs.
140
// Needs to handle multiple contexts, extra alignment in any "survivor" area and some
141
// statistics.
142
class G1PLABAllocator : public CHeapObj<mtGC> {
143
friend class G1ParScanThreadState;
144
private:
145
typedef G1HeapRegionAttr::region_type_t region_type_t;
146
147
G1CollectedHeap* _g1h;
148
G1Allocator* _allocator;
149
150
PLAB** _alloc_buffers[G1HeapRegionAttr::Num];
151
152
// Number of words allocated directly (not counting PLAB allocation).
153
size_t _direct_allocated[G1HeapRegionAttr::Num];
154
155
void flush_and_retire_stats();
156
inline PLAB* alloc_buffer(G1HeapRegionAttr dest, uint node_index) const;
157
inline PLAB* alloc_buffer(region_type_t dest, uint node_index) const;
158
159
// Returns the number of allocation buffers for the given dest.
160
// There is only 1 buffer for Old while Young may have multiple buffers depending on
161
// active NUMA nodes.
162
inline uint alloc_buffers_length(region_type_t dest) const;
163
164
bool may_throw_away_buffer(size_t const allocation_word_sz, size_t const buffer_size) const;
165
public:
166
G1PLABAllocator(G1Allocator* allocator);
167
~G1PLABAllocator();
168
169
size_t waste() const;
170
size_t undo_waste() const;
171
172
// Allocate word_sz words in dest, either directly into the regions or by
173
// allocating a new PLAB. Returns the address of the allocated memory, NULL if
174
// not successful. Plab_refill_failed indicates whether an attempt to refill the
175
// PLAB failed or not.
176
HeapWord* allocate_direct_or_new_plab(G1HeapRegionAttr dest,
177
size_t word_sz,
178
bool* plab_refill_failed,
179
uint node_index);
180
181
// Allocate word_sz words in the PLAB of dest. Returns the address of the
182
// allocated memory, NULL if not successful.
183
inline HeapWord* plab_allocate(G1HeapRegionAttr dest,
184
size_t word_sz,
185
uint node_index);
186
187
inline HeapWord* allocate(G1HeapRegionAttr dest,
188
size_t word_sz,
189
bool* refill_failed,
190
uint node_index);
191
192
void undo_allocation(G1HeapRegionAttr dest, HeapWord* obj, size_t word_sz, uint node_index);
193
};
194
195
// G1ArchiveAllocator is used to allocate memory in archive
196
// regions. Such regions are not scavenged nor compacted by GC.
197
// There are two types of archive regions, which are
198
// differ in the kind of references allowed for the contained objects:
199
//
200
// - 'Closed' archive region contain no references outside of other
201
// closed archive regions. The region is immutable by GC. GC does
202
// not mark object header in 'closed' archive region.
203
// - An 'open' archive region allow references to any other regions,
204
// including closed archive, open archive and other java heap regions.
205
// GC can adjust pointers and mark object header in 'open' archive region.
206
class G1ArchiveAllocator : public CHeapObj<mtGC> {
207
protected:
208
bool _open; // Indicate if the region is 'open' archive.
209
G1CollectedHeap* _g1h;
210
211
// The current allocation region
212
HeapRegion* _allocation_region;
213
214
// Regions allocated for the current archive range.
215
GrowableArray<HeapRegion*> _allocated_regions;
216
217
// The number of bytes used in the current range.
218
size_t _summary_bytes_used;
219
220
// Current allocation window within the current region.
221
HeapWord* _bottom;
222
HeapWord* _top;
223
HeapWord* _max;
224
225
// Allocate a new region for this archive allocator.
226
// Allocation is from the top of the reserved heap downward.
227
bool alloc_new_region();
228
229
public:
230
G1ArchiveAllocator(G1CollectedHeap* g1h, bool open) :
231
_open(open),
232
_g1h(g1h),
233
_allocation_region(NULL),
234
_allocated_regions((ResourceObj::set_allocation_type((address) &_allocated_regions,
235
ResourceObj::C_HEAP),
236
2), mtGC),
237
_summary_bytes_used(0),
238
_bottom(NULL),
239
_top(NULL),
240
_max(NULL) { }
241
242
virtual ~G1ArchiveAllocator() {
243
assert(_allocation_region == NULL, "_allocation_region not NULL");
244
}
245
246
static G1ArchiveAllocator* create_allocator(G1CollectedHeap* g1h, bool open);
247
248
// Allocate memory for an individual object.
249
HeapWord* archive_mem_allocate(size_t word_size);
250
251
// Return the memory ranges used in the current archive, after
252
// aligning to the requested alignment.
253
void complete_archive(GrowableArray<MemRegion>* ranges,
254
size_t end_alignment_in_bytes);
255
256
// The number of bytes allocated by this allocator.
257
size_t used() {
258
return _summary_bytes_used;
259
}
260
261
// Clear the count of bytes allocated in prior G1 regions. This
262
// must be done when recalculate_use is used to reset the counter
263
// for the generic allocator, since it counts bytes in all G1
264
// regions, including those still associated with this allocator.
265
void clear_used() {
266
_summary_bytes_used = 0;
267
}
268
};
269
270
#endif // SHARE_GC_G1_G1ALLOCATOR_HPP
271
272