annotate src/share/vm/memory/space.hpp @ 20304:a22acf6d7598

8048112: G1 Full GC needs to support the case when the very first region is not available Summary: Refactor preparation for compaction during Full GC so that it lazily initializes the first compaction point. This also avoids problems later when the first region may not be committed. Also reviewed by K. Barrett. Reviewed-by: brutisso
author tschatzl
date Mon, 21 Jul 2014 10:00:31 +0200
parents ff1e37e7eb83
children ee019285a52c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
17467
55fb97c4c58d 8029233: Update copyright year to match last edit in jdk8 hotspot repository for 2013
mikael
parents: 10287
diff changeset
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 845
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 845
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 845
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #ifndef SHARE_VM_MEMORY_SPACE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define SHARE_VM_MEMORY_SPACE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "memory/allocation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "memory/blockOffsetTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "memory/cardTableModRefBS.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "memory/iterator.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32 #include "memory/memRegion.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
33 #include "memory/watermark.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
34 #include "oops/markOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
35 #include "runtime/mutexLocker.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7448
diff changeset
36 #include "utilities/macros.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
37 #include "utilities/workgroup.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
38
0
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // A space is an abstraction for the "storage units" backing
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // up the generation abstraction. It includes specific
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // implementations for keeping track of free and used space,
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // for iterating over objects and free blocks, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
43
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // Here's the Space hierarchy:
a61af66fc99e Initial load
duke
parents:
diff changeset
45 //
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // - Space -- an asbtract base class describing a heap area
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // - CompactibleSpace -- a space supporting compaction
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // - CompactibleFreeListSpace -- (used for CMS generation)
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // - ContiguousSpace -- a compactible space in which all free space
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // is contiguous
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // - EdenSpace -- contiguous space used as nursery
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // - ConcEdenSpace -- contiguous space with a 'soft end safe' allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // - OffsetTableContigSpace -- contiguous space with a block offset array
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // that allows "fast" block_start calls
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // - TenuredSpace -- (used for TenuredGeneration)
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // Forward decls.
a61af66fc99e Initial load
duke
parents:
diff changeset
58 class Space;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 class BlockOffsetArray;
a61af66fc99e Initial load
duke
parents:
diff changeset
60 class BlockOffsetArrayContigSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 class Generation;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 class CompactibleSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 class BlockOffsetTable;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 class GenRemSet;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 class CardTableRS;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 class DirtyCardToOopClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // A Space describes a heap area. Class Space is an abstract
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // base class.
a61af66fc99e Initial load
duke
parents:
diff changeset
70 //
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // Space supports allocation, size computation and GC support is provided.
a61af66fc99e Initial load
duke
parents:
diff changeset
72 //
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // Invariant: bottom() and end() are on page_size boundaries and
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // bottom() <= top() <= end()
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // top() is inclusive and end() is exclusive.
a61af66fc99e Initial load
duke
parents:
diff changeset
76
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6048
diff changeset
77 class Space: public CHeapObj<mtGC> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
78 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
79 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
80 HeapWord* _bottom;
a61af66fc99e Initial load
duke
parents:
diff changeset
81 HeapWord* _end;
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // Used in support of save_marks()
a61af66fc99e Initial load
duke
parents:
diff changeset
84 HeapWord* _saved_mark_word;
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 MemRegionClosure* _preconsumptionDirtyCardClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // A sequential tasks done structure. This supports
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // parallel GC, where we have threads dynamically
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // claiming sub-tasks from a larger parallel task.
a61af66fc99e Initial load
duke
parents:
diff changeset
91 SequentialSubTasksDone _par_seq_tasks;
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 Space():
a61af66fc99e Initial load
duke
parents:
diff changeset
94 _bottom(NULL), _end(NULL), _preconsumptionDirtyCardClosure(NULL) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
98 HeapWord* bottom() const { return _bottom; }
a61af66fc99e Initial load
duke
parents:
diff changeset
99 HeapWord* end() const { return _end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
100 virtual void set_bottom(HeapWord* value) { _bottom = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
101 virtual void set_end(HeapWord* value) { _end = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
102
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
103 virtual HeapWord* saved_mark_word() const { return _saved_mark_word; }
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 579
diff changeset
104
0
a61af66fc99e Initial load
duke
parents:
diff changeset
105 void set_saved_mark_word(HeapWord* p) { _saved_mark_word = p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
106
20267
ff1e37e7eb83 8038405: Clean up some virtual fucntions in Space class hierarchy
mgerdin
parents: 20266
diff changeset
107 // Returns true if this object has been allocated since a
ff1e37e7eb83 8038405: Clean up some virtual fucntions in Space class hierarchy
mgerdin
parents: 20266
diff changeset
108 // generation's "save_marks" call.
ff1e37e7eb83 8038405: Clean up some virtual fucntions in Space class hierarchy
mgerdin
parents: 20266
diff changeset
109 virtual bool obj_allocated_since_save_marks(const oop obj) const {
ff1e37e7eb83 8038405: Clean up some virtual fucntions in Space class hierarchy
mgerdin
parents: 20266
diff changeset
110 return (HeapWord*)obj >= saved_mark_word();
ff1e37e7eb83 8038405: Clean up some virtual fucntions in Space class hierarchy
mgerdin
parents: 20266
diff changeset
111 }
ff1e37e7eb83 8038405: Clean up some virtual fucntions in Space class hierarchy
mgerdin
parents: 20266
diff changeset
112
0
a61af66fc99e Initial load
duke
parents:
diff changeset
113 MemRegionClosure* preconsumptionDirtyCardClosure() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
114 return _preconsumptionDirtyCardClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
115 }
a61af66fc99e Initial load
duke
parents:
diff changeset
116 void setPreconsumptionDirtyCardClosure(MemRegionClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
117 _preconsumptionDirtyCardClosure = cl;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119
20267
ff1e37e7eb83 8038405: Clean up some virtual fucntions in Space class hierarchy
mgerdin
parents: 20266
diff changeset
120 // Returns a subregion of the space containing only the allocated objects in
0
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // the space.
20267
ff1e37e7eb83 8038405: Clean up some virtual fucntions in Space class hierarchy
mgerdin
parents: 20266
diff changeset
122 virtual MemRegion used_region() const = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // Returns a region that is guaranteed to contain (at least) all objects
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // allocated at the time of the last call to "save_marks". If the space
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // initializes its DirtyCardToOopClosure's specifying the "contig" option
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // (that is, if the space is contiguous), then this region must contain only
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // such objects: the memregion will be from the bottom of the region to the
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // saved mark. Otherwise, the "obj_allocated_since_save_marks" method of
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // the space must distiguish between objects in the region allocated before
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // and after the call to save marks.
20267
ff1e37e7eb83 8038405: Clean up some virtual fucntions in Space class hierarchy
mgerdin
parents: 20266
diff changeset
132 MemRegion used_region_at_save_marks() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
133 return MemRegion(bottom(), saved_mark_word());
a61af66fc99e Initial load
duke
parents:
diff changeset
134 }
a61af66fc99e Initial load
duke
parents:
diff changeset
135
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
136 // Initialization.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
137 // "initialize" should be called once on a space, before it is used for
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
138 // any purpose. The "mr" arguments gives the bounds of the space, and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
139 // the "clear_space" argument should be true unless the memory in "mr" is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
140 // known to be zeroed.
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
141 virtual void initialize(MemRegion mr, bool clear_space, bool mangle_space);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
142
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
143 // The "clear" method must be called on a region that may have
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
144 // had allocation performed in it, but is now to be considered empty.
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
145 virtual void clear(bool mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // For detecting GC bugs. Should only be called at GC boundaries, since
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // some unused space may be used as scratch space during GC's.
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // Default implementation does nothing. We also call this when expanding
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // a space to satisfy an allocation request. See bug #4668531
a61af66fc99e Initial load
duke
parents:
diff changeset
151 virtual void mangle_unused_area() {}
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
152 virtual void mangle_unused_area_complete() {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
153 virtual void mangle_region(MemRegion mr) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // Testers
a61af66fc99e Initial load
duke
parents:
diff changeset
156 bool is_empty() const { return used() == 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
157 bool not_empty() const { return used() > 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
158
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // Returns true iff the given the space contains the
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // given address as part of an allocated object. For
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // ceratin kinds of spaces, this might be a potentially
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // expensive operation. To prevent performance problems
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // on account of its inadvertent use in product jvm's,
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // we restrict its use to assertion checks only.
20267
ff1e37e7eb83 8038405: Clean up some virtual fucntions in Space class hierarchy
mgerdin
parents: 20266
diff changeset
165 bool is_in(const void* p) const {
ff1e37e7eb83 8038405: Clean up some virtual fucntions in Space class hierarchy
mgerdin
parents: 20266
diff changeset
166 return used_region().contains(p);
ff1e37e7eb83 8038405: Clean up some virtual fucntions in Space class hierarchy
mgerdin
parents: 20266
diff changeset
167 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // Returns true iff the given reserved memory of the space contains the
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // given address.
a61af66fc99e Initial load
duke
parents:
diff changeset
171 bool is_in_reserved(const void* p) const { return _bottom <= p && p < _end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // Returns true iff the given block is not allocated.
a61af66fc99e Initial load
duke
parents:
diff changeset
174 virtual bool is_free_block(const HeapWord* p) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // Test whether p is double-aligned
a61af66fc99e Initial load
duke
parents:
diff changeset
177 static bool is_aligned(void* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
178 return ((intptr_t)p & (sizeof(double)-1)) == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // Size computations. Sizes are in bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
182 size_t capacity() const { return byte_size(bottom(), end()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
183 virtual size_t used() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
184 virtual size_t free() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // Iterate over all the ref-containing fields of all objects in the
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // space, calling "cl.do_oop" on each. Fields in objects allocated by
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // applications of the closure are not included in the iteration.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
189 virtual void oop_iterate(ExtendedOopClosure* cl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // Iterate over all objects in the space, calling "cl.do_object" on
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // each. Objects allocated by applications of the closure are not
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // included in the iteration.
a61af66fc99e Initial load
duke
parents:
diff changeset
194 virtual void object_iterate(ObjectClosure* blk) = 0;
517
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 438
diff changeset
195 // Similar to object_iterate() except only iterates over
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 438
diff changeset
196 // objects whose internal references point to objects in the space.
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 438
diff changeset
197 virtual void safe_object_iterate(ObjectClosure* blk) = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // Create and return a new dirty card to oop closure. Can be
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // overriden to return the appropriate type of closure
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // depending on the type of space in which the closure will
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // operate. ResourceArea allocated.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
203 virtual DirtyCardToOopClosure* new_dcto_cl(ExtendedOopClosure* cl,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
204 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
205 HeapWord* boundary = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // If "p" is in the space, returns the address of the start of the
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // "block" that contains "p". We say "block" instead of "object" since
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // some heaps may not pack objects densely; a chunk may either be an
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // object or a non-object. If "p" is not in the space, return NULL.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
211 virtual HeapWord* block_start_const(const void* p) const = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
212
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
213 // The non-const version may have benevolent side effects on the data
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
214 // structure supporting these calls, possibly speeding up future calls.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
215 // The default implementation, however, is simply to call the const
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
216 // version.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
217 inline virtual HeapWord* block_start(const void* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // Requires "addr" to be the start of a chunk, and returns its size.
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // "addr + size" is required to be the start of a new chunk, or the end
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // of the active area of the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
222 virtual size_t block_size(const HeapWord* addr) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // Requires "addr" to be the start of a block, and returns "TRUE" iff
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // the block is an object.
a61af66fc99e Initial load
duke
parents:
diff changeset
226 virtual bool block_is_obj(const HeapWord* addr) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // Requires "addr" to be the start of a block, and returns "TRUE" iff
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // the block is an object and the object is alive.
a61af66fc99e Initial load
duke
parents:
diff changeset
230 virtual bool obj_is_alive(const HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // Allocation (return NULL if full). Assumes the caller has established
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // mutually exclusive access to the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
234 virtual HeapWord* allocate(size_t word_size) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // Allocation (return NULL if full). Enforces mutual exclusion internally.
a61af66fc99e Initial load
duke
parents:
diff changeset
237 virtual HeapWord* par_allocate(size_t word_size) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // Mark-sweep-compact support: all spaces can update pointers to objects
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // moving as a part of compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
241 virtual void adjust_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // PrintHeapAtGC support
a61af66fc99e Initial load
duke
parents:
diff changeset
244 virtual void print() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
245 virtual void print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
246 virtual void print_short() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
247 virtual void print_short_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
248
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // Accessor for parallel sequential tasks.
a61af66fc99e Initial load
duke
parents:
diff changeset
251 SequentialSubTasksDone* par_seq_tasks() { return &_par_seq_tasks; }
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // IF "this" is a ContiguousSpace, return it, else return NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
254 virtual ContiguousSpace* toContiguousSpace() {
a61af66fc99e Initial load
duke
parents:
diff changeset
255 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // Debugging
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 4708
diff changeset
259 virtual void verify() const = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
260 };
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // A MemRegionClosure (ResourceObj) whose "do_MemRegion" function applies an
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // OopClosure to (the addresses of) all the ref-containing fields that could
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // be modified by virtue of the given MemRegion being dirty. (Note that
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // because of the imprecise nature of the write barrier, this may iterate
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // over oops beyond the region.)
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // This base type for dirty card to oop closures handles memory regions
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // in non-contiguous spaces with no boundaries, and should be sub-classed
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // to support other space types. See ContiguousDCTOC for a sub-class
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // that works with ContiguousSpaces.
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 class DirtyCardToOopClosure: public MemRegionClosureRO {
a61af66fc99e Initial load
duke
parents:
diff changeset
273 protected:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
274 ExtendedOopClosure* _cl;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
275 Space* _sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
276 CardTableModRefBS::PrecisionStyle _precision;
a61af66fc99e Initial load
duke
parents:
diff changeset
277 HeapWord* _boundary; // If non-NULL, process only non-NULL oops
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // pointing below boundary.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
279 HeapWord* _min_done; // ObjHeadPreciseArray precision requires
0
a61af66fc99e Initial load
duke
parents:
diff changeset
280 // a downwards traversal; this is the
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // lowest location already done (or,
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // alternatively, the lowest address that
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // shouldn't be done again. NULL means infinity.)
a61af66fc99e Initial load
duke
parents:
diff changeset
284 NOT_PRODUCT(HeapWord* _last_bottom;)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
285 NOT_PRODUCT(HeapWord* _last_explicit_min_done;)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // Get the actual top of the area on which the closure will
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // operate, given where the top is assumed to be (the end of the
a61af66fc99e Initial load
duke
parents:
diff changeset
289 // memory region passed to do_MemRegion) and where the object
a61af66fc99e Initial load
duke
parents:
diff changeset
290 // at the top is assumed to start. For example, an object may
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // start at the top but actually extend past the assumed top,
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // in which case the top becomes the end of the object.
a61af66fc99e Initial load
duke
parents:
diff changeset
293 virtual HeapWord* get_actual_top(HeapWord* top, HeapWord* top_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // Walk the given memory region from bottom to (actual) top
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // looking for objects and applying the oop closure (_cl) to
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // them. The base implementation of this treats the area as
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // blocks, where a block may or may not be an object. Sub-
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // classes should override this to provide more accurate
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // or possibly more efficient walking.
a61af66fc99e Initial load
duke
parents:
diff changeset
301 virtual void walk_mem_region(MemRegion mr, HeapWord* bottom, HeapWord* top);
a61af66fc99e Initial load
duke
parents:
diff changeset
302
a61af66fc99e Initial load
duke
parents:
diff changeset
303 public:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
304 DirtyCardToOopClosure(Space* sp, ExtendedOopClosure* cl,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
305 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
306 HeapWord* boundary) :
a61af66fc99e Initial load
duke
parents:
diff changeset
307 _sp(sp), _cl(cl), _precision(precision), _boundary(boundary),
a61af66fc99e Initial load
duke
parents:
diff changeset
308 _min_done(NULL) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
309 NOT_PRODUCT(_last_bottom = NULL);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
310 NOT_PRODUCT(_last_explicit_min_done = NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 void do_MemRegion(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
314
a61af66fc99e Initial load
duke
parents:
diff changeset
315 void set_min_done(HeapWord* min_done) {
a61af66fc99e Initial load
duke
parents:
diff changeset
316 _min_done = min_done;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
317 NOT_PRODUCT(_last_explicit_min_done = _min_done);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
318 }
a61af66fc99e Initial load
duke
parents:
diff changeset
319 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
320 void set_last_bottom(HeapWord* last_bottom) {
a61af66fc99e Initial load
duke
parents:
diff changeset
321 _last_bottom = last_bottom;
a61af66fc99e Initial load
duke
parents:
diff changeset
322 }
a61af66fc99e Initial load
duke
parents:
diff changeset
323 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
324 };
a61af66fc99e Initial load
duke
parents:
diff changeset
325
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // A structure to represent a point at which objects are being copied
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // during compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
328 class CompactPoint : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
329 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
330 Generation* gen;
a61af66fc99e Initial load
duke
parents:
diff changeset
331 CompactibleSpace* space;
a61af66fc99e Initial load
duke
parents:
diff changeset
332 HeapWord* threshold;
20304
a22acf6d7598 8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents: 20267
diff changeset
333
a22acf6d7598 8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents: 20267
diff changeset
334 CompactPoint(Generation* _gen) :
a22acf6d7598 8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents: 20267
diff changeset
335 gen(_gen), space(NULL), threshold(0) {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
336 };
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // A space that supports compaction operations. This is usually, but not
a61af66fc99e Initial load
duke
parents:
diff changeset
340 // necessarily, a space that is normally contiguous. But, for example, a
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // free-list-based space whose normal collection is a mark-sweep without
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // compaction could still support compaction in full GC's.
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 class CompactibleSpace: public Space {
a61af66fc99e Initial load
duke
parents:
diff changeset
345 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
346 friend class CompactibleFreeListSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
347 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
348 HeapWord* _compaction_top;
a61af66fc99e Initial load
duke
parents:
diff changeset
349 CompactibleSpace* _next_compaction_space;
a61af66fc99e Initial load
duke
parents:
diff changeset
350
a61af66fc99e Initial load
duke
parents:
diff changeset
351 public:
347
60fb9c4db4e6 6718086: CMS assert: _concurrent_iteration_safe_limit update missed
ysr
parents: 342
diff changeset
352 CompactibleSpace() :
60fb9c4db4e6 6718086: CMS assert: _concurrent_iteration_safe_limit update missed
ysr
parents: 342
diff changeset
353 _compaction_top(NULL), _next_compaction_space(NULL) {}
60fb9c4db4e6 6718086: CMS assert: _concurrent_iteration_safe_limit update missed
ysr
parents: 342
diff changeset
354
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
355 virtual void initialize(MemRegion mr, bool clear_space, bool mangle_space);
356
tonyp
parents: 347 269
diff changeset
356 virtual void clear(bool mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // Used temporarily during a compaction phase to hold the value
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // top should have when compaction is complete.
a61af66fc99e Initial load
duke
parents:
diff changeset
360 HeapWord* compaction_top() const { return _compaction_top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
361
a61af66fc99e Initial load
duke
parents:
diff changeset
362 void set_compaction_top(HeapWord* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
363 assert(value == NULL || (value >= bottom() && value <= end()),
a61af66fc99e Initial load
duke
parents:
diff changeset
364 "should point inside space");
a61af66fc99e Initial load
duke
parents:
diff changeset
365 _compaction_top = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
367
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // Perform operations on the space needed after a compaction
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // has been performed.
20267
ff1e37e7eb83 8038405: Clean up some virtual fucntions in Space class hierarchy
mgerdin
parents: 20266
diff changeset
370 virtual void reset_after_compaction() = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
371
a61af66fc99e Initial load
duke
parents:
diff changeset
372 // Returns the next space (in the current generation) to be compacted in
a61af66fc99e Initial load
duke
parents:
diff changeset
373 // the global compaction order. Also is used to select the next
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // space into which to compact.
a61af66fc99e Initial load
duke
parents:
diff changeset
375
a61af66fc99e Initial load
duke
parents:
diff changeset
376 virtual CompactibleSpace* next_compaction_space() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 return _next_compaction_space;
a61af66fc99e Initial load
duke
parents:
diff changeset
378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
379
a61af66fc99e Initial load
duke
parents:
diff changeset
380 void set_next_compaction_space(CompactibleSpace* csp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
381 _next_compaction_space = csp;
a61af66fc99e Initial load
duke
parents:
diff changeset
382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 // MarkSweep support phase2
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // Start the process of compaction of the current space: compute
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // post-compaction addresses, and insert forwarding pointers. The fields
a61af66fc99e Initial load
duke
parents:
diff changeset
388 // "cp->gen" and "cp->compaction_space" are the generation and space into
a61af66fc99e Initial load
duke
parents:
diff changeset
389 // which we are currently compacting. This call updates "cp" as necessary,
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // and leaves the "compaction_top" of the final value of
a61af66fc99e Initial load
duke
parents:
diff changeset
391 // "cp->compaction_space" up-to-date. Offset tables may be updated in
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // this phase as if the final copy had occurred; if so, "cp->threshold"
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // indicates when the next such action should be taken.
a61af66fc99e Initial load
duke
parents:
diff changeset
394 virtual void prepare_for_compaction(CompactPoint* cp);
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // MarkSweep support phase3
a61af66fc99e Initial load
duke
parents:
diff changeset
396 virtual void adjust_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // MarkSweep support phase4
a61af66fc99e Initial load
duke
parents:
diff changeset
398 virtual void compact();
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // The maximum percentage of objects that can be dead in the compacted
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // live part of a compacted space ("deadwood" support.)
438
122d10c82f3f 6765804: GC "dead ratios" should be unsigned
jcoomes
parents: 356
diff changeset
402 virtual size_t allowed_dead_ratio() const { return 0; };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // Some contiguous spaces may maintain some data structures that should
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // be updated whenever an allocation crosses a boundary. This function
a61af66fc99e Initial load
duke
parents:
diff changeset
406 // returns the first such boundary.
a61af66fc99e Initial load
duke
parents:
diff changeset
407 // (The default implementation returns the end of the space, so the
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // boundary is never crossed.)
a61af66fc99e Initial load
duke
parents:
diff changeset
409 virtual HeapWord* initialize_threshold() { return end(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // "q" is an object of the given "size" that should be forwarded;
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // "cp" names the generation ("gen") and containing "this" (which must
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // also equal "cp->space"). "compact_top" is where in "this" the
a61af66fc99e Initial load
duke
parents:
diff changeset
414 // next object should be forwarded to. If there is room in "this" for
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // the object, insert an appropriate forwarding pointer in "q".
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // If not, go to the next compaction space (there must
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // be one, since compaction must succeed -- we go to the first space of
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // the previous generation if necessary, updating "cp"), reset compact_top
a61af66fc99e Initial load
duke
parents:
diff changeset
419 // and then forward. In either case, returns the new value of "compact_top".
a61af66fc99e Initial load
duke
parents:
diff changeset
420 // If the forwarding crosses "cp->threshold", invokes the "cross_threhold"
a61af66fc99e Initial load
duke
parents:
diff changeset
421 // function of the then-current compaction space, and updates "cp->threshold
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // accordingly".
a61af66fc99e Initial load
duke
parents:
diff changeset
423 virtual HeapWord* forward(oop q, size_t size, CompactPoint* cp,
a61af66fc99e Initial load
duke
parents:
diff changeset
424 HeapWord* compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
425
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // Return a size with adjusments as required of the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
427 virtual size_t adjust_object_size_v(size_t size) const { return size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
428
a61af66fc99e Initial load
duke
parents:
diff changeset
429 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // Used during compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
431 HeapWord* _first_dead;
a61af66fc99e Initial load
duke
parents:
diff changeset
432 HeapWord* _end_of_live;
a61af66fc99e Initial load
duke
parents:
diff changeset
433
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // Minimum size of a free block.
20267
ff1e37e7eb83 8038405: Clean up some virtual fucntions in Space class hierarchy
mgerdin
parents: 20266
diff changeset
435 virtual size_t minimum_free_block_size() const { return 0; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // This the function is invoked when an allocation of an object covering
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // "start" to "end occurs crosses the threshold; returns the next
a61af66fc99e Initial load
duke
parents:
diff changeset
439 // threshold. (The default implementation does nothing.)
a61af66fc99e Initial load
duke
parents:
diff changeset
440 virtual HeapWord* cross_threshold(HeapWord* start, HeapWord* the_end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
441 return end();
a61af66fc99e Initial load
duke
parents:
diff changeset
442 }
a61af66fc99e Initial load
duke
parents:
diff changeset
443
a61af66fc99e Initial load
duke
parents:
diff changeset
444 // Requires "allowed_deadspace_words > 0", that "q" is the start of a
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // free block of the given "word_len", and that "q", were it an object,
a61af66fc99e Initial load
duke
parents:
diff changeset
446 // would not move if forwared. If the size allows, fill the free
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // block with an object, to prevent excessive compaction. Returns "true"
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // iff the free region was made deadspace, and modifies
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // "allowed_deadspace_words" to reflect the number of available deadspace
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // words remaining after this operation.
a61af66fc99e Initial load
duke
parents:
diff changeset
451 bool insert_deadspace(size_t& allowed_deadspace_words, HeapWord* q,
a61af66fc99e Initial load
duke
parents:
diff changeset
452 size_t word_len);
a61af66fc99e Initial load
duke
parents:
diff changeset
453 };
a61af66fc99e Initial load
duke
parents:
diff changeset
454
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
455 class GenSpaceMangler;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
456
0
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // A space in which the free area is contiguous. It therefore supports
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // faster allocation, and compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
459 class ContiguousSpace: public CompactibleSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
460 friend class OneContigSpaceCardGeneration;
a61af66fc99e Initial load
duke
parents:
diff changeset
461 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
462 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
463 HeapWord* _top;
a61af66fc99e Initial load
duke
parents:
diff changeset
464 HeapWord* _concurrent_iteration_safe_limit;
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
465 // A helper for mangling the unused area of the space in debug builds.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
466 GenSpaceMangler* _mangler;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
467
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
468 GenSpaceMangler* mangler() { return _mangler; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
469
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // Allocation helpers (return NULL if full).
a61af66fc99e Initial load
duke
parents:
diff changeset
471 inline HeapWord* allocate_impl(size_t word_size, HeapWord* end_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
472 inline HeapWord* par_allocate_impl(size_t word_size, HeapWord* end_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474 public:
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
475 ContiguousSpace();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
476 ~ContiguousSpace();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
477
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
478 virtual void initialize(MemRegion mr, bool clear_space, bool mangle_space);
356
tonyp
parents: 347 269
diff changeset
479 virtual void clear(bool mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
480
a61af66fc99e Initial load
duke
parents:
diff changeset
481 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
482 HeapWord* top() const { return _top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
483 void set_top(HeapWord* value) { _top = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
484
20267
ff1e37e7eb83 8038405: Clean up some virtual fucntions in Space class hierarchy
mgerdin
parents: 20266
diff changeset
485 void set_saved_mark() { _saved_mark_word = top(); }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
486 void reset_saved_mark() { _saved_mark_word = bottom(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
487
a61af66fc99e Initial load
duke
parents:
diff changeset
488 WaterMark bottom_mark() { return WaterMark(this, bottom()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
489 WaterMark top_mark() { return WaterMark(this, top()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
490 WaterMark saved_mark() { return WaterMark(this, saved_mark_word()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
491 bool saved_mark_at_top() const { return saved_mark_word() == top(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
492
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
493 // In debug mode mangle (write it with a particular bit
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
494 // pattern) the unused part of a space.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
495
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
496 // Used to save the an address in a space for later use during mangling.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
497 void set_top_for_allocations(HeapWord* v) PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
498 // Used to save the space's current top for later use during mangling.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
499 void set_top_for_allocations() PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
500
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
501 // Mangle regions in the space from the current top up to the
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
502 // previously mangled part of the space.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
503 void mangle_unused_area() PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
504 // Mangle [top, end)
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
505 void mangle_unused_area_complete() PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
506 // Mangle the given MemRegion.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
507 void mangle_region(MemRegion mr) PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
508
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
509 // Do some sparse checking on the area that should have been mangled.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
510 void check_mangled_unused_area(HeapWord* limit) PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
511 // Check the complete area that should have been mangled.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
512 // This code may be NULL depending on the macro DEBUG_MANGLING.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
513 void check_mangled_unused_area_complete() PRODUCT_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
514
a61af66fc99e Initial load
duke
parents:
diff changeset
515 // Size computations: sizes in bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
516 size_t capacity() const { return byte_size(bottom(), end()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
517 size_t used() const { return byte_size(bottom(), top()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
518 size_t free() const { return byte_size(top(), end()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
519
a61af66fc99e Initial load
duke
parents:
diff changeset
520 virtual bool is_free_block(const HeapWord* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
521
a61af66fc99e Initial load
duke
parents:
diff changeset
522 // In a contiguous space we have a more obvious bound on what parts
a61af66fc99e Initial load
duke
parents:
diff changeset
523 // contain objects.
a61af66fc99e Initial load
duke
parents:
diff changeset
524 MemRegion used_region() const { return MemRegion(bottom(), top()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
525
a61af66fc99e Initial load
duke
parents:
diff changeset
526 // Allocation (return NULL if full)
a61af66fc99e Initial load
duke
parents:
diff changeset
527 virtual HeapWord* allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
528 virtual HeapWord* par_allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 // Iteration
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
531 void oop_iterate(ExtendedOopClosure* cl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
532 void object_iterate(ObjectClosure* blk);
517
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 438
diff changeset
533 // For contiguous spaces this method will iterate safely over objects
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 438
diff changeset
534 // in the space (i.e., between bottom and top) when at a safepoint.
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 438
diff changeset
535 void safe_object_iterate(ObjectClosure* blk);
20266
6c523f5d5440 8038412: Move object_iterate_careful down from Space to ContigousSpace and CFLSpace
mgerdin
parents: 20265
diff changeset
536
6c523f5d5440 8038412: Move object_iterate_careful down from Space to ContigousSpace and CFLSpace
mgerdin
parents: 20265
diff changeset
537 // Iterate over as many initialized objects in the space as possible,
6c523f5d5440 8038412: Move object_iterate_careful down from Space to ContigousSpace and CFLSpace
mgerdin
parents: 20265
diff changeset
538 // calling "cl.do_object_careful" on each. Return NULL if all objects
6c523f5d5440 8038412: Move object_iterate_careful down from Space to ContigousSpace and CFLSpace
mgerdin
parents: 20265
diff changeset
539 // in the space (at the start of the iteration) were iterated over.
6c523f5d5440 8038412: Move object_iterate_careful down from Space to ContigousSpace and CFLSpace
mgerdin
parents: 20265
diff changeset
540 // Return an address indicating the extent of the iteration in the
6c523f5d5440 8038412: Move object_iterate_careful down from Space to ContigousSpace and CFLSpace
mgerdin
parents: 20265
diff changeset
541 // event that the iteration had to return because of finding an
6c523f5d5440 8038412: Move object_iterate_careful down from Space to ContigousSpace and CFLSpace
mgerdin
parents: 20265
diff changeset
542 // uninitialized object in the space, or if the closure "cl"
6c523f5d5440 8038412: Move object_iterate_careful down from Space to ContigousSpace and CFLSpace
mgerdin
parents: 20265
diff changeset
543 // signaled early termination.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
544 HeapWord* object_iterate_careful(ObjectClosureCareful* cl);
6048
a05a695ea044 7167437: Can't build on linux without precompiled headers
stefank
parents: 6008
diff changeset
545 HeapWord* concurrent_iteration_safe_limit() {
a05a695ea044 7167437: Can't build on linux without precompiled headers
stefank
parents: 6008
diff changeset
546 assert(_concurrent_iteration_safe_limit <= top(),
a05a695ea044 7167437: Can't build on linux without precompiled headers
stefank
parents: 6008
diff changeset
547 "_concurrent_iteration_safe_limit update missed");
a05a695ea044 7167437: Can't build on linux without precompiled headers
stefank
parents: 6008
diff changeset
548 return _concurrent_iteration_safe_limit;
a05a695ea044 7167437: Can't build on linux without precompiled headers
stefank
parents: 6008
diff changeset
549 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
550 // changes the safe limit, all objects from bottom() to the new
a61af66fc99e Initial load
duke
parents:
diff changeset
551 // limit should be properly initialized
6048
a05a695ea044 7167437: Can't build on linux without precompiled headers
stefank
parents: 6008
diff changeset
552 void set_concurrent_iteration_safe_limit(HeapWord* new_limit) {
a05a695ea044 7167437: Can't build on linux without precompiled headers
stefank
parents: 6008
diff changeset
553 assert(new_limit <= top(), "uninitialized objects in the safe range");
a05a695ea044 7167437: Can't build on linux without precompiled headers
stefank
parents: 6008
diff changeset
554 _concurrent_iteration_safe_limit = new_limit;
a05a695ea044 7167437: Can't build on linux without precompiled headers
stefank
parents: 6008
diff changeset
555 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
556
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
557
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7448
diff changeset
558 #if INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
559 // In support of parallel oop_iterate.
a61af66fc99e Initial load
duke
parents:
diff changeset
560 #define ContigSpace_PAR_OOP_ITERATE_DECL(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
561 void par_oop_iterate(MemRegion mr, OopClosureType* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563 ALL_PAR_OOP_ITERATE_CLOSURES(ContigSpace_PAR_OOP_ITERATE_DECL)
a61af66fc99e Initial load
duke
parents:
diff changeset
564 #undef ContigSpace_PAR_OOP_ITERATE_DECL
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7448
diff changeset
565 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // Compaction support
a61af66fc99e Initial load
duke
parents:
diff changeset
568 virtual void reset_after_compaction() {
a61af66fc99e Initial load
duke
parents:
diff changeset
569 assert(compaction_top() >= bottom() && compaction_top() <= end(), "should point inside space");
a61af66fc99e Initial load
duke
parents:
diff changeset
570 set_top(compaction_top());
a61af66fc99e Initial load
duke
parents:
diff changeset
571 // set new iteration safe limit
a61af66fc99e Initial load
duke
parents:
diff changeset
572 set_concurrent_iteration_safe_limit(compaction_top());
a61af66fc99e Initial load
duke
parents:
diff changeset
573 }
a61af66fc99e Initial load
duke
parents:
diff changeset
574
a61af66fc99e Initial load
duke
parents:
diff changeset
575 // Override.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
576 DirtyCardToOopClosure* new_dcto_cl(ExtendedOopClosure* cl,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
577 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
578 HeapWord* boundary = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
579
a61af66fc99e Initial load
duke
parents:
diff changeset
580 // Apply "blk->do_oop" to the addresses of all reference fields in objects
a61af66fc99e Initial load
duke
parents:
diff changeset
581 // starting with the _saved_mark_word, which was noted during a generation's
a61af66fc99e Initial load
duke
parents:
diff changeset
582 // save_marks and is required to denote the head of an object.
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // Fields in objects allocated by applications of the closure
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // *are* included in the iteration.
a61af66fc99e Initial load
duke
parents:
diff changeset
585 // Updates _saved_mark_word to point to just after the last object
a61af66fc99e Initial load
duke
parents:
diff changeset
586 // iterated over.
a61af66fc99e Initial load
duke
parents:
diff changeset
587 #define ContigSpace_OOP_SINCE_SAVE_MARKS_DECL(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
588 void oop_since_save_marks_iterate##nv_suffix(OopClosureType* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
589
a61af66fc99e Initial load
duke
parents:
diff changeset
590 ALL_SINCE_SAVE_MARKS_CLOSURES(ContigSpace_OOP_SINCE_SAVE_MARKS_DECL)
a61af66fc99e Initial load
duke
parents:
diff changeset
591 #undef ContigSpace_OOP_SINCE_SAVE_MARKS_DECL
a61af66fc99e Initial load
duke
parents:
diff changeset
592
a61af66fc99e Initial load
duke
parents:
diff changeset
593 // Same as object_iterate, but starting from "mark", which is required
a61af66fc99e Initial load
duke
parents:
diff changeset
594 // to denote the start of an object. Objects allocated by
a61af66fc99e Initial load
duke
parents:
diff changeset
595 // applications of the closure *are* included in the iteration.
a61af66fc99e Initial load
duke
parents:
diff changeset
596 virtual void object_iterate_from(WaterMark mark, ObjectClosure* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
597
a61af66fc99e Initial load
duke
parents:
diff changeset
598 // Very inefficient implementation.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
599 virtual HeapWord* block_start_const(const void* p) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
600 size_t block_size(const HeapWord* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // If a block is in the allocated area, it is an object.
a61af66fc99e Initial load
duke
parents:
diff changeset
602 bool block_is_obj(const HeapWord* p) const { return p < top(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604 // Addresses for inlined allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
605 HeapWord** top_addr() { return &_top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
606 HeapWord** end_addr() { return &_end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
607
a61af66fc99e Initial load
duke
parents:
diff changeset
608 // Overrides for more efficient compaction support.
a61af66fc99e Initial load
duke
parents:
diff changeset
609 void prepare_for_compaction(CompactPoint* cp);
a61af66fc99e Initial load
duke
parents:
diff changeset
610
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // PrintHeapAtGC support.
a61af66fc99e Initial load
duke
parents:
diff changeset
612 virtual void print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
613
a61af66fc99e Initial load
duke
parents:
diff changeset
614 // Checked dynamic downcasts.
a61af66fc99e Initial load
duke
parents:
diff changeset
615 virtual ContiguousSpace* toContiguousSpace() {
a61af66fc99e Initial load
duke
parents:
diff changeset
616 return this;
a61af66fc99e Initial load
duke
parents:
diff changeset
617 }
a61af66fc99e Initial load
duke
parents:
diff changeset
618
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // Debugging
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 4708
diff changeset
620 virtual void verify() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
621
a61af66fc99e Initial load
duke
parents:
diff changeset
622 // Used to increase collection frequency. "factor" of 0 means entire
a61af66fc99e Initial load
duke
parents:
diff changeset
623 // space.
a61af66fc99e Initial load
duke
parents:
diff changeset
624 void allocate_temporary_filler(int factor);
a61af66fc99e Initial load
duke
parents:
diff changeset
625
a61af66fc99e Initial load
duke
parents:
diff changeset
626 };
a61af66fc99e Initial load
duke
parents:
diff changeset
627
a61af66fc99e Initial load
duke
parents:
diff changeset
628
a61af66fc99e Initial load
duke
parents:
diff changeset
629 // A dirty card to oop closure that does filtering.
a61af66fc99e Initial load
duke
parents:
diff changeset
630 // It knows how to filter out objects that are outside of the _boundary.
a61af66fc99e Initial load
duke
parents:
diff changeset
631 class Filtering_DCTOC : public DirtyCardToOopClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
632 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
633 // Override.
a61af66fc99e Initial load
duke
parents:
diff changeset
634 void walk_mem_region(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
635 HeapWord* bottom, HeapWord* top);
a61af66fc99e Initial load
duke
parents:
diff changeset
636
a61af66fc99e Initial load
duke
parents:
diff changeset
637 // Walk the given memory region, from bottom to top, applying
a61af66fc99e Initial load
duke
parents:
diff changeset
638 // the given oop closure to (possibly) all objects found. The
a61af66fc99e Initial load
duke
parents:
diff changeset
639 // given oop closure may or may not be the same as the oop
a61af66fc99e Initial load
duke
parents:
diff changeset
640 // closure with which this closure was created, as it may
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // be a filtering closure which makes use of the _boundary.
a61af66fc99e Initial load
duke
parents:
diff changeset
642 // We offer two signatures, so the FilteringClosure static type is
a61af66fc99e Initial load
duke
parents:
diff changeset
643 // apparent.
a61af66fc99e Initial load
duke
parents:
diff changeset
644 virtual void walk_mem_region_with_cl(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
645 HeapWord* bottom, HeapWord* top,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
646 ExtendedOopClosure* cl) = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
647 virtual void walk_mem_region_with_cl(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
648 HeapWord* bottom, HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
649 FilteringClosure* cl) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
650
a61af66fc99e Initial load
duke
parents:
diff changeset
651 public:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
652 Filtering_DCTOC(Space* sp, ExtendedOopClosure* cl,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
653 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
654 HeapWord* boundary) :
a61af66fc99e Initial load
duke
parents:
diff changeset
655 DirtyCardToOopClosure(sp, cl, precision, boundary) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
656 };
a61af66fc99e Initial load
duke
parents:
diff changeset
657
a61af66fc99e Initial load
duke
parents:
diff changeset
658 // A dirty card to oop closure for contiguous spaces
a61af66fc99e Initial load
duke
parents:
diff changeset
659 // (ContiguousSpace and sub-classes).
a61af66fc99e Initial load
duke
parents:
diff changeset
660 // It is a FilteringClosure, as defined above, and it knows:
a61af66fc99e Initial load
duke
parents:
diff changeset
661 //
a61af66fc99e Initial load
duke
parents:
diff changeset
662 // 1. That the actual top of any area in a memory region
a61af66fc99e Initial load
duke
parents:
diff changeset
663 // contained by the space is bounded by the end of the contiguous
a61af66fc99e Initial load
duke
parents:
diff changeset
664 // region of the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
665 // 2. That the space is really made up of objects and not just
a61af66fc99e Initial load
duke
parents:
diff changeset
666 // blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
667
a61af66fc99e Initial load
duke
parents:
diff changeset
668 class ContiguousSpaceDCTOC : public Filtering_DCTOC {
a61af66fc99e Initial load
duke
parents:
diff changeset
669 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
670 // Overrides.
a61af66fc99e Initial load
duke
parents:
diff changeset
671 HeapWord* get_actual_top(HeapWord* top, HeapWord* top_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
672
a61af66fc99e Initial load
duke
parents:
diff changeset
673 virtual void walk_mem_region_with_cl(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
674 HeapWord* bottom, HeapWord* top,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
675 ExtendedOopClosure* cl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
676 virtual void walk_mem_region_with_cl(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
677 HeapWord* bottom, HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
678 FilteringClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
679
a61af66fc99e Initial load
duke
parents:
diff changeset
680 public:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
681 ContiguousSpaceDCTOC(ContiguousSpace* sp, ExtendedOopClosure* cl,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
682 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
683 HeapWord* boundary) :
a61af66fc99e Initial load
duke
parents:
diff changeset
684 Filtering_DCTOC(sp, cl, precision, boundary)
a61af66fc99e Initial load
duke
parents:
diff changeset
685 {}
a61af66fc99e Initial load
duke
parents:
diff changeset
686 };
a61af66fc99e Initial load
duke
parents:
diff changeset
687
a61af66fc99e Initial load
duke
parents:
diff changeset
688
a61af66fc99e Initial load
duke
parents:
diff changeset
689 // Class EdenSpace describes eden-space in new generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
690
a61af66fc99e Initial load
duke
parents:
diff changeset
691 class DefNewGeneration;
a61af66fc99e Initial load
duke
parents:
diff changeset
692
a61af66fc99e Initial load
duke
parents:
diff changeset
693 class EdenSpace : public ContiguousSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
694 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
695 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
696 DefNewGeneration* _gen;
a61af66fc99e Initial load
duke
parents:
diff changeset
697
a61af66fc99e Initial load
duke
parents:
diff changeset
698 // _soft_end is used as a soft limit on allocation. As soft limits are
a61af66fc99e Initial load
duke
parents:
diff changeset
699 // reached, the slow-path allocation code can invoke other actions and then
a61af66fc99e Initial load
duke
parents:
diff changeset
700 // adjust _soft_end up to a new soft limit or to end().
a61af66fc99e Initial load
duke
parents:
diff changeset
701 HeapWord* _soft_end;
a61af66fc99e Initial load
duke
parents:
diff changeset
702
a61af66fc99e Initial load
duke
parents:
diff changeset
703 public:
347
60fb9c4db4e6 6718086: CMS assert: _concurrent_iteration_safe_limit update missed
ysr
parents: 342
diff changeset
704 EdenSpace(DefNewGeneration* gen) :
60fb9c4db4e6 6718086: CMS assert: _concurrent_iteration_safe_limit update missed
ysr
parents: 342
diff changeset
705 _gen(gen), _soft_end(NULL) {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
706
a61af66fc99e Initial load
duke
parents:
diff changeset
707 // Get/set just the 'soft' limit.
a61af66fc99e Initial load
duke
parents:
diff changeset
708 HeapWord* soft_end() { return _soft_end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
709 HeapWord** soft_end_addr() { return &_soft_end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
710 void set_soft_end(HeapWord* value) { _soft_end = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
711
a61af66fc99e Initial load
duke
parents:
diff changeset
712 // Override.
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
713 void clear(bool mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
714
a61af66fc99e Initial load
duke
parents:
diff changeset
715 // Set both the 'hard' and 'soft' limits (_end and _soft_end).
a61af66fc99e Initial load
duke
parents:
diff changeset
716 void set_end(HeapWord* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
717 set_soft_end(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
718 ContiguousSpace::set_end(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
719 }
a61af66fc99e Initial load
duke
parents:
diff changeset
720
a61af66fc99e Initial load
duke
parents:
diff changeset
721 // Allocation (return NULL if full)
a61af66fc99e Initial load
duke
parents:
diff changeset
722 HeapWord* allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
723 HeapWord* par_allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
724 };
a61af66fc99e Initial load
duke
parents:
diff changeset
725
a61af66fc99e Initial load
duke
parents:
diff changeset
726 // Class ConcEdenSpace extends EdenSpace for the sake of safe
a61af66fc99e Initial load
duke
parents:
diff changeset
727 // allocation while soft-end is being modified concurrently
a61af66fc99e Initial load
duke
parents:
diff changeset
728
a61af66fc99e Initial load
duke
parents:
diff changeset
729 class ConcEdenSpace : public EdenSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
730 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
731 ConcEdenSpace(DefNewGeneration* gen) : EdenSpace(gen) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
732
a61af66fc99e Initial load
duke
parents:
diff changeset
733 // Allocation (return NULL if full)
a61af66fc99e Initial load
duke
parents:
diff changeset
734 HeapWord* par_allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
735 };
a61af66fc99e Initial load
duke
parents:
diff changeset
736
a61af66fc99e Initial load
duke
parents:
diff changeset
737
a61af66fc99e Initial load
duke
parents:
diff changeset
738 // A ContigSpace that Supports an efficient "block_start" operation via
a61af66fc99e Initial load
duke
parents:
diff changeset
739 // a BlockOffsetArray (whose BlockOffsetSharedArray may be shared with
a61af66fc99e Initial load
duke
parents:
diff changeset
740 // other spaces.) This is the abstract base class for old generation
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
741 // (tenured) spaces.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
742
a61af66fc99e Initial load
duke
parents:
diff changeset
743 class OffsetTableContigSpace: public ContiguousSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
744 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
745 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
746 BlockOffsetArrayContigSpace _offsets;
a61af66fc99e Initial load
duke
parents:
diff changeset
747 Mutex _par_alloc_lock;
a61af66fc99e Initial load
duke
parents:
diff changeset
748
a61af66fc99e Initial load
duke
parents:
diff changeset
749 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
750 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
751 OffsetTableContigSpace(BlockOffsetSharedArray* sharedOffsetArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
752 MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
753
a61af66fc99e Initial load
duke
parents:
diff changeset
754 void set_bottom(HeapWord* value);
a61af66fc99e Initial load
duke
parents:
diff changeset
755 void set_end(HeapWord* value);
a61af66fc99e Initial load
duke
parents:
diff changeset
756
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
757 void clear(bool mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
758
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
759 inline HeapWord* block_start_const(const void* p) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
760
a61af66fc99e Initial load
duke
parents:
diff changeset
761 // Add offset table update.
a61af66fc99e Initial load
duke
parents:
diff changeset
762 virtual inline HeapWord* allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
763 inline HeapWord* par_allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
764
a61af66fc99e Initial load
duke
parents:
diff changeset
765 // MarkSweep support phase3
a61af66fc99e Initial load
duke
parents:
diff changeset
766 virtual HeapWord* initialize_threshold();
a61af66fc99e Initial load
duke
parents:
diff changeset
767 virtual HeapWord* cross_threshold(HeapWord* start, HeapWord* end);
a61af66fc99e Initial load
duke
parents:
diff changeset
768
a61af66fc99e Initial load
duke
parents:
diff changeset
769 virtual void print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
770
a61af66fc99e Initial load
duke
parents:
diff changeset
771 // Debugging
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 4708
diff changeset
772 void verify() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
773 };
a61af66fc99e Initial load
duke
parents:
diff changeset
774
a61af66fc99e Initial load
duke
parents:
diff changeset
775
a61af66fc99e Initial load
duke
parents:
diff changeset
776 // Class TenuredSpace is used by TenuredGeneration
a61af66fc99e Initial load
duke
parents:
diff changeset
777
a61af66fc99e Initial load
duke
parents:
diff changeset
778 class TenuredSpace: public OffsetTableContigSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
779 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
780 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
781 // Mark sweep support
438
122d10c82f3f 6765804: GC "dead ratios" should be unsigned
jcoomes
parents: 356
diff changeset
782 size_t allowed_dead_ratio() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
783 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
784 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
785 TenuredSpace(BlockOffsetSharedArray* sharedOffsetArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
786 MemRegion mr) :
a61af66fc99e Initial load
duke
parents:
diff changeset
787 OffsetTableContigSpace(sharedOffsetArray, mr) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
788 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
789 #endif // SHARE_VM_MEMORY_SPACE_HPP