annotate src/share/vm/memory/space.hpp @ 1941:79d04223b8a5

Added caching for resolved types and resolved fields. This is crucial, because the local load elimination will lead to wrong results, if field equality (of two RiField objects with the same object and the same RiType) is not given. The caching makes sure that the default equals implementation is sufficient.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Tue, 28 Dec 2010 18:33:26 +0100
parents c18cbe5936b8
children f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 845
diff changeset
2 * Copyright (c) 1997, 2009, 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
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // A space is an abstraction for the "storage units" backing
a61af66fc99e Initial load
duke
parents:
diff changeset
26 // up the generation abstraction. It includes specific
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // implementations for keeping track of free and used space,
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // for iterating over objects and free blocks, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // Here's the Space hierarchy:
a61af66fc99e Initial load
duke
parents:
diff changeset
31 //
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // - Space -- an asbtract base class describing a heap area
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // - CompactibleSpace -- a space supporting compaction
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // - CompactibleFreeListSpace -- (used for CMS generation)
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // - ContiguousSpace -- a compactible space in which all free space
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // is contiguous
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // - EdenSpace -- contiguous space used as nursery
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // - ConcEdenSpace -- contiguous space with a 'soft end safe' allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // - OffsetTableContigSpace -- contiguous space with a block offset array
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // that allows "fast" block_start calls
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // - TenuredSpace -- (used for TenuredGeneration)
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // - ContigPermSpace -- an offset table contiguous space for perm gen
a61af66fc99e Initial load
duke
parents:
diff changeset
43
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // Forward decls.
a61af66fc99e Initial load
duke
parents:
diff changeset
45 class Space;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 class BlockOffsetArray;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 class BlockOffsetArrayContigSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 class Generation;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 class CompactibleSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
50 class BlockOffsetTable;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 class GenRemSet;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 class CardTableRS;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 class DirtyCardToOopClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // An oop closure that is circumscribed by a filtering memory region.
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
56 class SpaceMemRegionOopsIterClosure: public OopClosure {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
57 private:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
58 OopClosure* _cl;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
59 MemRegion _mr;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
60 protected:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
61 template <class T> void do_oop_work(T* p) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
62 if (_mr.contains(p)) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
63 _cl->do_oop(p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
64 }
a61af66fc99e Initial load
duke
parents:
diff changeset
65 }
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
66 public:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
67 SpaceMemRegionOopsIterClosure(OopClosure* cl, MemRegion mr):
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
68 _cl(cl), _mr(mr) {}
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
69 virtual void do_oop(oop* p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
70 virtual void do_oop(narrowOop* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
71 };
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // A Space describes a heap area. Class Space is an abstract
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // base class.
a61af66fc99e Initial load
duke
parents:
diff changeset
75 //
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // Space supports allocation, size computation and GC support is provided.
a61af66fc99e Initial load
duke
parents:
diff changeset
77 //
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // Invariant: bottom() and end() are on page_size boundaries and
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // bottom() <= top() <= end()
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // top() is inclusive and end() is exclusive.
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 class Space: public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
83 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
84 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
85 HeapWord* _bottom;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 HeapWord* _end;
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // Used in support of save_marks()
a61af66fc99e Initial load
duke
parents:
diff changeset
89 HeapWord* _saved_mark_word;
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 MemRegionClosure* _preconsumptionDirtyCardClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // A sequential tasks done structure. This supports
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // parallel GC, where we have threads dynamically
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // claiming sub-tasks from a larger parallel task.
a61af66fc99e Initial load
duke
parents:
diff changeset
96 SequentialSubTasksDone _par_seq_tasks;
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 Space():
a61af66fc99e Initial load
duke
parents:
diff changeset
99 _bottom(NULL), _end(NULL), _preconsumptionDirtyCardClosure(NULL) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
103 HeapWord* bottom() const { return _bottom; }
a61af66fc99e Initial load
duke
parents:
diff changeset
104 HeapWord* end() const { return _end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
105 virtual void set_bottom(HeapWord* value) { _bottom = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
106 virtual void set_end(HeapWord* value) { _end = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
107
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
108 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
109
0
a61af66fc99e Initial load
duke
parents:
diff changeset
110 void set_saved_mark_word(HeapWord* p) { _saved_mark_word = p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 MemRegionClosure* preconsumptionDirtyCardClosure() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
113 return _preconsumptionDirtyCardClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
115 void setPreconsumptionDirtyCardClosure(MemRegionClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 _preconsumptionDirtyCardClosure = cl;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // Returns a subregion of the space containing all the objects in
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
121 virtual MemRegion used_region() const { return MemRegion(bottom(), end()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // Returns a region that is guaranteed to contain (at least) all objects
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // allocated at the time of the last call to "save_marks". If the space
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // initializes its DirtyCardToOopClosure's specifying the "contig" option
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // (that is, if the space is contiguous), then this region must contain only
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // such objects: the memregion will be from the bottom of the region to the
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // saved mark. Otherwise, the "obj_allocated_since_save_marks" method of
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // the space must distiguish between objects in the region allocated before
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // and after the call to save marks.
a61af66fc99e Initial load
duke
parents:
diff changeset
131 virtual MemRegion used_region_at_save_marks() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
132 return MemRegion(bottom(), saved_mark_word());
a61af66fc99e Initial load
duke
parents:
diff changeset
133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
134
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
135 // Initialization.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
136 // "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
137 // 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
138 // 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
139 // known to be zeroed.
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
140 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
141
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
142 // 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
143 // 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
144 virtual void clear(bool mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // For detecting GC bugs. Should only be called at GC boundaries, since
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // some unused space may be used as scratch space during GC's.
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // Default implementation does nothing. We also call this when expanding
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // a space to satisfy an allocation request. See bug #4668531
a61af66fc99e Initial load
duke
parents:
diff changeset
150 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
151 virtual void mangle_unused_area_complete() {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
152 virtual void mangle_region(MemRegion mr) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // Testers
a61af66fc99e Initial load
duke
parents:
diff changeset
155 bool is_empty() const { return used() == 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
156 bool not_empty() const { return used() > 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // Returns true iff the given the space contains the
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // given address as part of an allocated object. For
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // ceratin kinds of spaces, this might be a potentially
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // expensive operation. To prevent performance problems
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // on account of its inadvertent use in product jvm's,
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // we restrict its use to assertion checks only.
a61af66fc99e Initial load
duke
parents:
diff changeset
164 virtual bool is_in(const void* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // Returns true iff the given reserved memory of the space contains the
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // given address.
a61af66fc99e Initial load
duke
parents:
diff changeset
168 bool is_in_reserved(const void* p) const { return _bottom <= p && p < _end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // Returns true iff the given block is not allocated.
a61af66fc99e Initial load
duke
parents:
diff changeset
171 virtual bool is_free_block(const HeapWord* p) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // Test whether p is double-aligned
a61af66fc99e Initial load
duke
parents:
diff changeset
174 static bool is_aligned(void* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
175 return ((intptr_t)p & (sizeof(double)-1)) == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // Size computations. Sizes are in bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
179 size_t capacity() const { return byte_size(bottom(), end()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
180 virtual size_t used() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
181 virtual size_t free() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // Iterate over all the ref-containing fields of all objects in the
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // space, calling "cl.do_oop" on each. Fields in objects allocated by
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // applications of the closure are not included in the iteration.
a61af66fc99e Initial load
duke
parents:
diff changeset
186 virtual void oop_iterate(OopClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // Same as above, restricted to the intersection of a memory region and
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // the space. Fields in objects allocated by applications of the closure
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // are not included in the iteration.
a61af66fc99e Initial load
duke
parents:
diff changeset
191 virtual void oop_iterate(MemRegion mr, OopClosure* cl) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // Iterate over all objects in the space, calling "cl.do_object" on
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // each. Objects allocated by applications of the closure are not
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // included in the iteration.
a61af66fc99e Initial load
duke
parents:
diff changeset
196 virtual void object_iterate(ObjectClosure* blk) = 0;
517
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 438
diff changeset
197 // Similar to object_iterate() except only iterates over
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 438
diff changeset
198 // 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
199 virtual void safe_object_iterate(ObjectClosure* blk) = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // Iterate over all objects that intersect with mr, calling "cl->do_object"
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // on each. There is an exception to this: if this closure has already
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // been invoked on an object, it may skip such objects in some cases. This is
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // Most likely to happen in an "upwards" (ascending address) iteration of
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // MemRegions.
a61af66fc99e Initial load
duke
parents:
diff changeset
206 virtual void object_iterate_mem(MemRegion mr, UpwardsObjectClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // Iterate over as many initialized objects in the space as possible,
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // calling "cl.do_object_careful" on each. Return NULL if all objects
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // in the space (at the start of the iteration) were iterated over.
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // Return an address indicating the extent of the iteration in the
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // event that the iteration had to return because of finding an
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // uninitialized object in the space, or if the closure "cl"
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // signalled early termination.
a61af66fc99e Initial load
duke
parents:
diff changeset
215 virtual HeapWord* object_iterate_careful(ObjectClosureCareful* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
216 virtual HeapWord* object_iterate_careful_m(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
217 ObjectClosureCareful* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // Create and return a new dirty card to oop closure. Can be
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // overriden to return the appropriate type of closure
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // depending on the type of space in which the closure will
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // operate. ResourceArea allocated.
a61af66fc99e Initial load
duke
parents:
diff changeset
223 virtual DirtyCardToOopClosure* new_dcto_cl(OopClosure* cl,
a61af66fc99e Initial load
duke
parents:
diff changeset
224 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
225 HeapWord* boundary = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // If "p" is in the space, returns the address of the start of the
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // "block" that contains "p". We say "block" instead of "object" since
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // some heaps may not pack objects densely; a chunk may either be an
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // 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
231 virtual HeapWord* block_start_const(const void* p) const = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
232
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
233 // 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
234 // structure supporting these calls, possibly speeding up future calls.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
235 // The default implementation, however, is simply to call the const
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
236 // version.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
237 inline virtual HeapWord* block_start(const void* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // Requires "addr" to be the start of a chunk, and returns its size.
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // "addr + size" is required to be the start of a new chunk, or the end
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // of the active area of the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
242 virtual size_t block_size(const HeapWord* addr) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // Requires "addr" to be the start of a block, and returns "TRUE" iff
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // the block is an object.
a61af66fc99e Initial load
duke
parents:
diff changeset
246 virtual bool block_is_obj(const HeapWord* addr) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
247
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // Requires "addr" to be the start of a block, and returns "TRUE" iff
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // the block is an object and the object is alive.
a61af66fc99e Initial load
duke
parents:
diff changeset
250 virtual bool obj_is_alive(const HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // Allocation (return NULL if full). Assumes the caller has established
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // mutually exclusive access to the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
254 virtual HeapWord* allocate(size_t word_size) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // Allocation (return NULL if full). Enforces mutual exclusion internally.
a61af66fc99e Initial load
duke
parents:
diff changeset
257 virtual HeapWord* par_allocate(size_t word_size) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // Returns true if this object has been allocated since a
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // generation's "save_marks" call.
a61af66fc99e Initial load
duke
parents:
diff changeset
261 virtual bool obj_allocated_since_save_marks(const oop obj) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // Mark-sweep-compact support: all spaces can update pointers to objects
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // moving as a part of compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
265 virtual void adjust_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // PrintHeapAtGC support
a61af66fc99e Initial load
duke
parents:
diff changeset
268 virtual void print() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
269 virtual void print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
270 virtual void print_short() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
271 virtual void print_short_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // Accessor for parallel sequential tasks.
a61af66fc99e Initial load
duke
parents:
diff changeset
275 SequentialSubTasksDone* par_seq_tasks() { return &_par_seq_tasks; }
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // IF "this" is a ContiguousSpace, return it, else return NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
278 virtual ContiguousSpace* toContiguousSpace() {
a61af66fc99e Initial load
duke
parents:
diff changeset
279 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
281
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
283 virtual void verify(bool allow_dirty) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
284 };
a61af66fc99e Initial load
duke
parents:
diff changeset
285
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // A MemRegionClosure (ResourceObj) whose "do_MemRegion" function applies an
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // OopClosure to (the addresses of) all the ref-containing fields that could
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // be modified by virtue of the given MemRegion being dirty. (Note that
a61af66fc99e Initial load
duke
parents:
diff changeset
289 // because of the imprecise nature of the write barrier, this may iterate
a61af66fc99e Initial load
duke
parents:
diff changeset
290 // over oops beyond the region.)
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // This base type for dirty card to oop closures handles memory regions
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // in non-contiguous spaces with no boundaries, and should be sub-classed
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // to support other space types. See ContiguousDCTOC for a sub-class
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // that works with ContiguousSpaces.
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296 class DirtyCardToOopClosure: public MemRegionClosureRO {
a61af66fc99e Initial load
duke
parents:
diff changeset
297 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
298 OopClosure* _cl;
a61af66fc99e Initial load
duke
parents:
diff changeset
299 Space* _sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
300 CardTableModRefBS::PrecisionStyle _precision;
a61af66fc99e Initial load
duke
parents:
diff changeset
301 HeapWord* _boundary; // If non-NULL, process only non-NULL oops
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // pointing below boundary.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
303 HeapWord* _min_done; // ObjHeadPreciseArray precision requires
0
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // a downwards traversal; this is the
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // lowest location already done (or,
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // alternatively, the lowest address that
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // shouldn't be done again. NULL means infinity.)
a61af66fc99e Initial load
duke
parents:
diff changeset
308 NOT_PRODUCT(HeapWord* _last_bottom;)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
309 NOT_PRODUCT(HeapWord* _last_explicit_min_done;)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // Get the actual top of the area on which the closure will
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // operate, given where the top is assumed to be (the end of the
a61af66fc99e Initial load
duke
parents:
diff changeset
313 // memory region passed to do_MemRegion) and where the object
a61af66fc99e Initial load
duke
parents:
diff changeset
314 // at the top is assumed to start. For example, an object may
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // start at the top but actually extend past the assumed top,
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // in which case the top becomes the end of the object.
a61af66fc99e Initial load
duke
parents:
diff changeset
317 virtual HeapWord* get_actual_top(HeapWord* top, HeapWord* top_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // Walk the given memory region from bottom to (actual) top
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // looking for objects and applying the oop closure (_cl) to
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // them. The base implementation of this treats the area as
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // blocks, where a block may or may not be an object. Sub-
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // classes should override this to provide more accurate
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // or possibly more efficient walking.
a61af66fc99e Initial load
duke
parents:
diff changeset
325 virtual void walk_mem_region(MemRegion mr, HeapWord* bottom, HeapWord* top);
a61af66fc99e Initial load
duke
parents:
diff changeset
326
a61af66fc99e Initial load
duke
parents:
diff changeset
327 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
328 DirtyCardToOopClosure(Space* sp, OopClosure* cl,
a61af66fc99e Initial load
duke
parents:
diff changeset
329 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
330 HeapWord* boundary) :
a61af66fc99e Initial load
duke
parents:
diff changeset
331 _sp(sp), _cl(cl), _precision(precision), _boundary(boundary),
a61af66fc99e Initial load
duke
parents:
diff changeset
332 _min_done(NULL) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
333 NOT_PRODUCT(_last_bottom = NULL);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
334 NOT_PRODUCT(_last_explicit_min_done = NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
335 }
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 void do_MemRegion(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 void set_min_done(HeapWord* min_done) {
a61af66fc99e Initial load
duke
parents:
diff changeset
340 _min_done = min_done;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
341 NOT_PRODUCT(_last_explicit_min_done = _min_done);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
344 void set_last_bottom(HeapWord* last_bottom) {
a61af66fc99e Initial load
duke
parents:
diff changeset
345 _last_bottom = last_bottom;
a61af66fc99e Initial load
duke
parents:
diff changeset
346 }
a61af66fc99e Initial load
duke
parents:
diff changeset
347 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
348 };
a61af66fc99e Initial load
duke
parents:
diff changeset
349
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // A structure to represent a point at which objects are being copied
a61af66fc99e Initial load
duke
parents:
diff changeset
351 // during compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
352 class CompactPoint : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
353 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
354 Generation* gen;
a61af66fc99e Initial load
duke
parents:
diff changeset
355 CompactibleSpace* space;
a61af66fc99e Initial load
duke
parents:
diff changeset
356 HeapWord* threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
357 CompactPoint(Generation* _gen, CompactibleSpace* _space,
a61af66fc99e Initial load
duke
parents:
diff changeset
358 HeapWord* _threshold) :
a61af66fc99e Initial load
duke
parents:
diff changeset
359 gen(_gen), space(_space), threshold(_threshold) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
360 };
a61af66fc99e Initial load
duke
parents:
diff changeset
361
a61af66fc99e Initial load
duke
parents:
diff changeset
362
a61af66fc99e Initial load
duke
parents:
diff changeset
363 // A space that supports compaction operations. This is usually, but not
a61af66fc99e Initial load
duke
parents:
diff changeset
364 // necessarily, a space that is normally contiguous. But, for example, a
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // free-list-based space whose normal collection is a mark-sweep without
a61af66fc99e Initial load
duke
parents:
diff changeset
366 // compaction could still support compaction in full GC's.
a61af66fc99e Initial load
duke
parents:
diff changeset
367
a61af66fc99e Initial load
duke
parents:
diff changeset
368 class CompactibleSpace: public Space {
a61af66fc99e Initial load
duke
parents:
diff changeset
369 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
370 friend class CompactibleFreeListSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
371 friend class CompactingPermGenGen;
a61af66fc99e Initial load
duke
parents:
diff changeset
372 friend class CMSPermGenGen;
a61af66fc99e Initial load
duke
parents:
diff changeset
373 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
374 HeapWord* _compaction_top;
a61af66fc99e Initial load
duke
parents:
diff changeset
375 CompactibleSpace* _next_compaction_space;
a61af66fc99e Initial load
duke
parents:
diff changeset
376
a61af66fc99e Initial load
duke
parents:
diff changeset
377 public:
347
60fb9c4db4e6 6718086: CMS assert: _concurrent_iteration_safe_limit update missed
ysr
parents: 342
diff changeset
378 CompactibleSpace() :
60fb9c4db4e6 6718086: CMS assert: _concurrent_iteration_safe_limit update missed
ysr
parents: 342
diff changeset
379 _compaction_top(NULL), _next_compaction_space(NULL) {}
60fb9c4db4e6 6718086: CMS assert: _concurrent_iteration_safe_limit update missed
ysr
parents: 342
diff changeset
380
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
381 virtual void initialize(MemRegion mr, bool clear_space, bool mangle_space);
356
tonyp
parents: 347 269
diff changeset
382 virtual void clear(bool mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 // Used temporarily during a compaction phase to hold the value
a61af66fc99e Initial load
duke
parents:
diff changeset
385 // top should have when compaction is complete.
a61af66fc99e Initial load
duke
parents:
diff changeset
386 HeapWord* compaction_top() const { return _compaction_top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
387
a61af66fc99e Initial load
duke
parents:
diff changeset
388 void set_compaction_top(HeapWord* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
389 assert(value == NULL || (value >= bottom() && value <= end()),
a61af66fc99e Initial load
duke
parents:
diff changeset
390 "should point inside space");
a61af66fc99e Initial load
duke
parents:
diff changeset
391 _compaction_top = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
392 }
a61af66fc99e Initial load
duke
parents:
diff changeset
393
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // Perform operations on the space needed after a compaction
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // has been performed.
a61af66fc99e Initial load
duke
parents:
diff changeset
396 virtual void reset_after_compaction() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
397
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // Returns the next space (in the current generation) to be compacted in
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // the global compaction order. Also is used to select the next
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // space into which to compact.
a61af66fc99e Initial load
duke
parents:
diff changeset
401
a61af66fc99e Initial load
duke
parents:
diff changeset
402 virtual CompactibleSpace* next_compaction_space() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
403 return _next_compaction_space;
a61af66fc99e Initial load
duke
parents:
diff changeset
404 }
a61af66fc99e Initial load
duke
parents:
diff changeset
405
a61af66fc99e Initial load
duke
parents:
diff changeset
406 void set_next_compaction_space(CompactibleSpace* csp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
407 _next_compaction_space = csp;
a61af66fc99e Initial load
duke
parents:
diff changeset
408 }
a61af66fc99e Initial load
duke
parents:
diff changeset
409
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // MarkSweep support phase2
a61af66fc99e Initial load
duke
parents:
diff changeset
411
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // Start the process of compaction of the current space: compute
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // post-compaction addresses, and insert forwarding pointers. The fields
a61af66fc99e Initial load
duke
parents:
diff changeset
414 // "cp->gen" and "cp->compaction_space" are the generation and space into
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // which we are currently compacting. This call updates "cp" as necessary,
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // and leaves the "compaction_top" of the final value of
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // "cp->compaction_space" up-to-date. Offset tables may be updated in
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // this phase as if the final copy had occurred; if so, "cp->threshold"
a61af66fc99e Initial load
duke
parents:
diff changeset
419 // indicates when the next such action should be taken.
a61af66fc99e Initial load
duke
parents:
diff changeset
420 virtual void prepare_for_compaction(CompactPoint* cp);
a61af66fc99e Initial load
duke
parents:
diff changeset
421 // MarkSweep support phase3
a61af66fc99e Initial load
duke
parents:
diff changeset
422 virtual void adjust_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // MarkSweep support phase4
a61af66fc99e Initial load
duke
parents:
diff changeset
424 virtual void compact();
a61af66fc99e Initial load
duke
parents:
diff changeset
425
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // The maximum percentage of objects that can be dead in the compacted
a61af66fc99e Initial load
duke
parents:
diff changeset
427 // live part of a compacted space ("deadwood" support.)
438
122d10c82f3f 6765804: GC "dead ratios" should be unsigned
jcoomes
parents: 356
diff changeset
428 virtual size_t allowed_dead_ratio() const { return 0; };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
429
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // Some contiguous spaces may maintain some data structures that should
a61af66fc99e Initial load
duke
parents:
diff changeset
431 // be updated whenever an allocation crosses a boundary. This function
a61af66fc99e Initial load
duke
parents:
diff changeset
432 // returns the first such boundary.
a61af66fc99e Initial load
duke
parents:
diff changeset
433 // (The default implementation returns the end of the space, so the
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // boundary is never crossed.)
a61af66fc99e Initial load
duke
parents:
diff changeset
435 virtual HeapWord* initialize_threshold() { return end(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // "q" is an object of the given "size" that should be forwarded;
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // "cp" names the generation ("gen") and containing "this" (which must
a61af66fc99e Initial load
duke
parents:
diff changeset
439 // also equal "cp->space"). "compact_top" is where in "this" the
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // next object should be forwarded to. If there is room in "this" for
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // the object, insert an appropriate forwarding pointer in "q".
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // If not, go to the next compaction space (there must
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // be one, since compaction must succeed -- we go to the first space of
a61af66fc99e Initial load
duke
parents:
diff changeset
444 // the previous generation if necessary, updating "cp"), reset compact_top
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // and then forward. In either case, returns the new value of "compact_top".
a61af66fc99e Initial load
duke
parents:
diff changeset
446 // If the forwarding crosses "cp->threshold", invokes the "cross_threhold"
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // function of the then-current compaction space, and updates "cp->threshold
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // accordingly".
a61af66fc99e Initial load
duke
parents:
diff changeset
449 virtual HeapWord* forward(oop q, size_t size, CompactPoint* cp,
a61af66fc99e Initial load
duke
parents:
diff changeset
450 HeapWord* compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
451
a61af66fc99e Initial load
duke
parents:
diff changeset
452 // Return a size with adjusments as required of the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
453 virtual size_t adjust_object_size_v(size_t size) const { return size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
454
a61af66fc99e Initial load
duke
parents:
diff changeset
455 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // Used during compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
457 HeapWord* _first_dead;
a61af66fc99e Initial load
duke
parents:
diff changeset
458 HeapWord* _end_of_live;
a61af66fc99e Initial load
duke
parents:
diff changeset
459
a61af66fc99e Initial load
duke
parents:
diff changeset
460 // Minimum size of a free block.
a61af66fc99e Initial load
duke
parents:
diff changeset
461 virtual size_t minimum_free_block_size() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
462
a61af66fc99e Initial load
duke
parents:
diff changeset
463 // This the function is invoked when an allocation of an object covering
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // "start" to "end occurs crosses the threshold; returns the next
a61af66fc99e Initial load
duke
parents:
diff changeset
465 // threshold. (The default implementation does nothing.)
a61af66fc99e Initial load
duke
parents:
diff changeset
466 virtual HeapWord* cross_threshold(HeapWord* start, HeapWord* the_end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
467 return end();
a61af66fc99e Initial load
duke
parents:
diff changeset
468 }
a61af66fc99e Initial load
duke
parents:
diff changeset
469
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // Requires "allowed_deadspace_words > 0", that "q" is the start of a
a61af66fc99e Initial load
duke
parents:
diff changeset
471 // free block of the given "word_len", and that "q", were it an object,
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // would not move if forwared. If the size allows, fill the free
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // block with an object, to prevent excessive compaction. Returns "true"
a61af66fc99e Initial load
duke
parents:
diff changeset
474 // iff the free region was made deadspace, and modifies
a61af66fc99e Initial load
duke
parents:
diff changeset
475 // "allowed_deadspace_words" to reflect the number of available deadspace
a61af66fc99e Initial load
duke
parents:
diff changeset
476 // words remaining after this operation.
a61af66fc99e Initial load
duke
parents:
diff changeset
477 bool insert_deadspace(size_t& allowed_deadspace_words, HeapWord* q,
a61af66fc99e Initial load
duke
parents:
diff changeset
478 size_t word_len);
a61af66fc99e Initial load
duke
parents:
diff changeset
479 };
a61af66fc99e Initial load
duke
parents:
diff changeset
480
a61af66fc99e Initial load
duke
parents:
diff changeset
481 #define SCAN_AND_FORWARD(cp,scan_limit,block_is_obj,block_size) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
482 /* Compute the new addresses for the live objects and store it in the mark \
a61af66fc99e Initial load
duke
parents:
diff changeset
483 * Used by universe::mark_sweep_phase2() \
a61af66fc99e Initial load
duke
parents:
diff changeset
484 */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
485 HeapWord* compact_top; /* This is where we are currently compacting to. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
486 \
a61af66fc99e Initial load
duke
parents:
diff changeset
487 /* We're sure to be here before any objects are compacted into this \
a61af66fc99e Initial load
duke
parents:
diff changeset
488 * space, so this is a good time to initialize this: \
a61af66fc99e Initial load
duke
parents:
diff changeset
489 */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
490 set_compaction_top(bottom()); \
a61af66fc99e Initial load
duke
parents:
diff changeset
491 \
a61af66fc99e Initial load
duke
parents:
diff changeset
492 if (cp->space == NULL) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
493 assert(cp->gen != NULL, "need a generation"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
494 assert(cp->threshold == NULL, "just checking"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
495 assert(cp->gen->first_compaction_space() == this, "just checking"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
496 cp->space = cp->gen->first_compaction_space(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
497 compact_top = cp->space->bottom(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
498 cp->space->set_compaction_top(compact_top); \
a61af66fc99e Initial load
duke
parents:
diff changeset
499 cp->threshold = cp->space->initialize_threshold(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
500 } else { \
a61af66fc99e Initial load
duke
parents:
diff changeset
501 compact_top = cp->space->compaction_top(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
502 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
503 \
a61af66fc99e Initial load
duke
parents:
diff changeset
504 /* We allow some amount of garbage towards the bottom of the space, so \
a61af66fc99e Initial load
duke
parents:
diff changeset
505 * we don't start compacting before there is a significant gain to be made.\
a61af66fc99e Initial load
duke
parents:
diff changeset
506 * Occasionally, we want to ensure a full compaction, which is determined \
a61af66fc99e Initial load
duke
parents:
diff changeset
507 * by the MarkSweepAlwaysCompactCount parameter. \
a61af66fc99e Initial load
duke
parents:
diff changeset
508 */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
509 int invocations = SharedHeap::heap()->perm_gen()->stat_record()->invocations;\
a61af66fc99e Initial load
duke
parents:
diff changeset
510 bool skip_dead = ((invocations % MarkSweepAlwaysCompactCount) != 0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
511 \
a61af66fc99e Initial load
duke
parents:
diff changeset
512 size_t allowed_deadspace = 0; \
a61af66fc99e Initial load
duke
parents:
diff changeset
513 if (skip_dead) { \
438
122d10c82f3f 6765804: GC "dead ratios" should be unsigned
jcoomes
parents: 356
diff changeset
514 const size_t ratio = allowed_dead_ratio(); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
515 allowed_deadspace = (capacity() * ratio / 100) / HeapWordSize; \
a61af66fc99e Initial load
duke
parents:
diff changeset
516 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
517 \
a61af66fc99e Initial load
duke
parents:
diff changeset
518 HeapWord* q = bottom(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
519 HeapWord* t = scan_limit(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
520 \
a61af66fc99e Initial load
duke
parents:
diff changeset
521 HeapWord* end_of_live= q; /* One byte beyond the last byte of the last \
a61af66fc99e Initial load
duke
parents:
diff changeset
522 live object. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
523 HeapWord* first_dead = end();/* The first dead object. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
524 LiveRange* liveRange = NULL; /* The current live range, recorded in the \
a61af66fc99e Initial load
duke
parents:
diff changeset
525 first header of preceding free area. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
526 _first_dead = first_dead; \
a61af66fc99e Initial load
duke
parents:
diff changeset
527 \
a61af66fc99e Initial load
duke
parents:
diff changeset
528 const intx interval = PrefetchScanIntervalInBytes; \
a61af66fc99e Initial load
duke
parents:
diff changeset
529 \
a61af66fc99e Initial load
duke
parents:
diff changeset
530 while (q < t) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
531 assert(!block_is_obj(q) || \
a61af66fc99e Initial load
duke
parents:
diff changeset
532 oop(q)->mark()->is_marked() || oop(q)->mark()->is_unlocked() || \
a61af66fc99e Initial load
duke
parents:
diff changeset
533 oop(q)->mark()->has_bias_pattern(), \
a61af66fc99e Initial load
duke
parents:
diff changeset
534 "these are the only valid states during a mark sweep"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
535 if (block_is_obj(q) && oop(q)->is_gc_marked()) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
536 /* prefetch beyond q */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
537 Prefetch::write(q, interval); \
a61af66fc99e Initial load
duke
parents:
diff changeset
538 /* size_t size = oop(q)->size(); changing this for cms for perm gen */\
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
539 size_t size = block_size(q); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
540 compact_top = cp->space->forward(oop(q), size, cp, compact_top); \
a61af66fc99e Initial load
duke
parents:
diff changeset
541 q += size; \
a61af66fc99e Initial load
duke
parents:
diff changeset
542 end_of_live = q; \
a61af66fc99e Initial load
duke
parents:
diff changeset
543 } else { \
a61af66fc99e Initial load
duke
parents:
diff changeset
544 /* run over all the contiguous dead objects */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
545 HeapWord* end = q; \
a61af66fc99e Initial load
duke
parents:
diff changeset
546 do { \
a61af66fc99e Initial load
duke
parents:
diff changeset
547 /* prefetch beyond end */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
548 Prefetch::write(end, interval); \
a61af66fc99e Initial load
duke
parents:
diff changeset
549 end += block_size(end); \
a61af66fc99e Initial load
duke
parents:
diff changeset
550 } while (end < t && (!block_is_obj(end) || !oop(end)->is_gc_marked()));\
a61af66fc99e Initial load
duke
parents:
diff changeset
551 \
a61af66fc99e Initial load
duke
parents:
diff changeset
552 /* see if we might want to pretend this object is alive so that \
a61af66fc99e Initial load
duke
parents:
diff changeset
553 * we don't have to compact quite as often. \
a61af66fc99e Initial load
duke
parents:
diff changeset
554 */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
555 if (allowed_deadspace > 0 && q == compact_top) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
556 size_t sz = pointer_delta(end, q); \
a61af66fc99e Initial load
duke
parents:
diff changeset
557 if (insert_deadspace(allowed_deadspace, q, sz)) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
558 compact_top = cp->space->forward(oop(q), sz, cp, compact_top); \
a61af66fc99e Initial load
duke
parents:
diff changeset
559 q = end; \
a61af66fc99e Initial load
duke
parents:
diff changeset
560 end_of_live = end; \
a61af66fc99e Initial load
duke
parents:
diff changeset
561 continue; \
a61af66fc99e Initial load
duke
parents:
diff changeset
562 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
563 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
564 \
a61af66fc99e Initial load
duke
parents:
diff changeset
565 /* otherwise, it really is a free region. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
566 \
a61af66fc99e Initial load
duke
parents:
diff changeset
567 /* for the previous LiveRange, record the end of the live objects. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
568 if (liveRange) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
569 liveRange->set_end(q); \
a61af66fc99e Initial load
duke
parents:
diff changeset
570 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
571 \
a61af66fc99e Initial load
duke
parents:
diff changeset
572 /* record the current LiveRange object. \
a61af66fc99e Initial load
duke
parents:
diff changeset
573 * liveRange->start() is overlaid on the mark word. \
a61af66fc99e Initial load
duke
parents:
diff changeset
574 */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
575 liveRange = (LiveRange*)q; \
a61af66fc99e Initial load
duke
parents:
diff changeset
576 liveRange->set_start(end); \
a61af66fc99e Initial load
duke
parents:
diff changeset
577 liveRange->set_end(end); \
a61af66fc99e Initial load
duke
parents:
diff changeset
578 \
a61af66fc99e Initial load
duke
parents:
diff changeset
579 /* see if this is the first dead region. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
580 if (q < first_dead) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
581 first_dead = q; \
a61af66fc99e Initial load
duke
parents:
diff changeset
582 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
583 \
a61af66fc99e Initial load
duke
parents:
diff changeset
584 /* move on to the next object */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
585 q = end; \
a61af66fc99e Initial load
duke
parents:
diff changeset
586 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
587 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
588 \
a61af66fc99e Initial load
duke
parents:
diff changeset
589 assert(q == t, "just checking"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
590 if (liveRange != NULL) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
591 liveRange->set_end(q); \
a61af66fc99e Initial load
duke
parents:
diff changeset
592 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
593 _end_of_live = end_of_live; \
a61af66fc99e Initial load
duke
parents:
diff changeset
594 if (end_of_live < first_dead) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
595 first_dead = end_of_live; \
a61af66fc99e Initial load
duke
parents:
diff changeset
596 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
597 _first_dead = first_dead; \
a61af66fc99e Initial load
duke
parents:
diff changeset
598 \
a61af66fc99e Initial load
duke
parents:
diff changeset
599 /* save the compaction_top of the compaction space. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
600 cp->space->set_compaction_top(compact_top); \
a61af66fc99e Initial load
duke
parents:
diff changeset
601 }
a61af66fc99e Initial load
duke
parents:
diff changeset
602
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
603 #define SCAN_AND_ADJUST_POINTERS(adjust_obj_size) { \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
604 /* adjust all the interior pointers to point at the new locations of objects \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
605 * Used by MarkSweep::mark_sweep_phase3() */ \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
606 \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
607 HeapWord* q = bottom(); \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
608 HeapWord* t = _end_of_live; /* Established by "prepare_for_compaction". */ \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
609 \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
610 assert(_first_dead <= _end_of_live, "Stands to reason, no?"); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
611 \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
612 if (q < t && _first_dead > q && \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
613 !oop(q)->is_gc_marked()) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
614 /* we have a chunk of the space which hasn't moved and we've \
a61af66fc99e Initial load
duke
parents:
diff changeset
615 * reinitialized the mark word during the previous pass, so we can't \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
616 * use is_gc_marked for the traversal. */ \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
617 HeapWord* end = _first_dead; \
a61af66fc99e Initial load
duke
parents:
diff changeset
618 \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
619 while (q < end) { \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
620 /* I originally tried to conjoin "block_start(q) == q" to the \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
621 * assertion below, but that doesn't work, because you can't \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
622 * accurately traverse previous objects to get to the current one \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
623 * after their pointers (including pointers into permGen) have been \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
624 * updated, until the actual compaction is done. dld, 4/00 */ \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
625 assert(block_is_obj(q), \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
626 "should be at block boundaries, and should be looking at objs"); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
627 \
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
628 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::track_interior_pointers(oop(q))); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
629 \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
630 /* point all the oops to the new location */ \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
631 size_t size = oop(q)->adjust_pointers(); \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
632 size = adjust_obj_size(size); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
633 \
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
634 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::check_interior_pointers()); \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
635 \
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
636 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::validate_live_oop(oop(q), size)); \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
637 \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
638 q += size; \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
639 } \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
640 \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
641 if (_first_dead == t) { \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
642 q = t; \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
643 } else { \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
644 /* $$$ This is funky. Using this to read the previously written \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
645 * LiveRange. See also use below. */ \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
646 q = (HeapWord*)oop(_first_dead)->mark()->decode_pointer(); \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
647 } \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
648 } \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
649 \
a61af66fc99e Initial load
duke
parents:
diff changeset
650 const intx interval = PrefetchScanIntervalInBytes; \
a61af66fc99e Initial load
duke
parents:
diff changeset
651 \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
652 debug_only(HeapWord* prev_q = NULL); \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
653 while (q < t) { \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
654 /* prefetch beyond q */ \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
655 Prefetch::write(q, interval); \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
656 if (oop(q)->is_gc_marked()) { \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
657 /* q is alive */ \
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
658 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::track_interior_pointers(oop(q))); \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
659 /* point all the oops to the new location */ \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
660 size_t size = oop(q)->adjust_pointers(); \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
661 size = adjust_obj_size(size); \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
662 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::check_interior_pointers()); \
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
663 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::validate_live_oop(oop(q), size)); \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
664 debug_only(prev_q = q); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
665 q += size; \
356
tonyp
parents: 347 269
diff changeset
666 } else { \
tonyp
parents: 347 269
diff changeset
667 /* q is not a live object, so its mark should point at the next \
tonyp
parents: 347 269
diff changeset
668 * live object */ \
tonyp
parents: 347 269
diff changeset
669 debug_only(prev_q = q); \
tonyp
parents: 347 269
diff changeset
670 q = (HeapWord*) oop(q)->mark()->decode_pointer(); \
tonyp
parents: 347 269
diff changeset
671 assert(q > prev_q, "we should be moving forward through memory"); \
tonyp
parents: 347 269
diff changeset
672 } \
tonyp
parents: 347 269
diff changeset
673 } \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
674 \
356
tonyp
parents: 347 269
diff changeset
675 assert(q == t, "just checking"); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
676 }
a61af66fc99e Initial load
duke
parents:
diff changeset
677
356
tonyp
parents: 347 269
diff changeset
678 #define SCAN_AND_COMPACT(obj_size) { \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
679 /* Copy all live objects to their new location \
356
tonyp
parents: 347 269
diff changeset
680 * Used by MarkSweep::mark_sweep_phase4() */ \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
681 \
356
tonyp
parents: 347 269
diff changeset
682 HeapWord* q = bottom(); \
tonyp
parents: 347 269
diff changeset
683 HeapWord* const t = _end_of_live; \
tonyp
parents: 347 269
diff changeset
684 debug_only(HeapWord* prev_q = NULL); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
685 \
356
tonyp
parents: 347 269
diff changeset
686 if (q < t && _first_dead > q && \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
687 !oop(q)->is_gc_marked()) { \
356
tonyp
parents: 347 269
diff changeset
688 debug_only( \
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
689 /* we have a chunk of the space which hasn't moved and we've reinitialized \
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
690 * the mark word during the previous pass, so we can't use is_gc_marked for \
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
691 * the traversal. */ \
356
tonyp
parents: 347 269
diff changeset
692 HeapWord* const end = _first_dead; \
tonyp
parents: 347 269
diff changeset
693 \
tonyp
parents: 347 269
diff changeset
694 while (q < end) { \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
695 size_t size = obj_size(q); \
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
696 assert(!oop(q)->is_gc_marked(), \
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
697 "should be unmarked (special dense prefix handling)"); \
356
tonyp
parents: 347 269
diff changeset
698 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::live_oop_moved_to(q, size, q)); \
tonyp
parents: 347 269
diff changeset
699 debug_only(prev_q = q); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
700 q += size; \
356
tonyp
parents: 347 269
diff changeset
701 } \
tonyp
parents: 347 269
diff changeset
702 ) /* debug_only */ \
tonyp
parents: 347 269
diff changeset
703 \
tonyp
parents: 347 269
diff changeset
704 if (_first_dead == t) { \
tonyp
parents: 347 269
diff changeset
705 q = t; \
tonyp
parents: 347 269
diff changeset
706 } else { \
tonyp
parents: 347 269
diff changeset
707 /* $$$ Funky */ \
tonyp
parents: 347 269
diff changeset
708 q = (HeapWord*) oop(_first_dead)->mark()->decode_pointer(); \
tonyp
parents: 347 269
diff changeset
709 } \
tonyp
parents: 347 269
diff changeset
710 } \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
711 \
356
tonyp
parents: 347 269
diff changeset
712 const intx scan_interval = PrefetchScanIntervalInBytes; \
tonyp
parents: 347 269
diff changeset
713 const intx copy_interval = PrefetchCopyIntervalInBytes; \
tonyp
parents: 347 269
diff changeset
714 while (q < t) { \
tonyp
parents: 347 269
diff changeset
715 if (!oop(q)->is_gc_marked()) { \
tonyp
parents: 347 269
diff changeset
716 /* mark is pointer to next marked oop */ \
tonyp
parents: 347 269
diff changeset
717 debug_only(prev_q = q); \
tonyp
parents: 347 269
diff changeset
718 q = (HeapWord*) oop(q)->mark()->decode_pointer(); \
tonyp
parents: 347 269
diff changeset
719 assert(q > prev_q, "we should be moving forward through memory"); \
tonyp
parents: 347 269
diff changeset
720 } else { \
tonyp
parents: 347 269
diff changeset
721 /* prefetch beyond q */ \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
722 Prefetch::read(q, scan_interval); \
a61af66fc99e Initial load
duke
parents:
diff changeset
723 \
a61af66fc99e Initial load
duke
parents:
diff changeset
724 /* size and destination */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
725 size_t size = obj_size(q); \
a61af66fc99e Initial load
duke
parents:
diff changeset
726 HeapWord* compaction_top = (HeapWord*)oop(q)->forwardee(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
727 \
356
tonyp
parents: 347 269
diff changeset
728 /* prefetch beyond compaction_top */ \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
729 Prefetch::write(compaction_top, copy_interval); \
a61af66fc99e Initial load
duke
parents:
diff changeset
730 \
356
tonyp
parents: 347 269
diff changeset
731 /* copy object and reinit its mark */ \
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
732 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::live_oop_moved_to(q, size, \
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
733 compaction_top)); \
356
tonyp
parents: 347 269
diff changeset
734 assert(q != compaction_top, "everything in this pass should be moving"); \
tonyp
parents: 347 269
diff changeset
735 Copy::aligned_conjoint_words(q, compaction_top, size); \
tonyp
parents: 347 269
diff changeset
736 oop(compaction_top)->init_mark(); \
tonyp
parents: 347 269
diff changeset
737 assert(oop(compaction_top)->klass() != NULL, "should have a class"); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
738 \
356
tonyp
parents: 347 269
diff changeset
739 debug_only(prev_q = q); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
740 q += size; \
356
tonyp
parents: 347 269
diff changeset
741 } \
tonyp
parents: 347 269
diff changeset
742 } \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
743 \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
744 /* Let's remember if we were empty before we did the compaction. */ \
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
745 bool was_empty = used_region().is_empty(); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
746 /* Reset space after compaction is complete */ \
356
tonyp
parents: 347 269
diff changeset
747 reset_after_compaction(); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
748 /* We do this clear, below, since it has overloaded meanings for some */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
749 /* space subtypes. For example, OffsetTableContigSpace's that were */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
750 /* compacted into will have had their offset table thresholds updated */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
751 /* continuously, but those that weren't need to have their thresholds */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
752 /* re-initialized. Also mangles unused area for debugging. */ \
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
753 if (used_region().is_empty()) { \
356
tonyp
parents: 347 269
diff changeset
754 if (!was_empty) clear(SpaceDecorator::Mangle); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
755 } else { \
a61af66fc99e Initial load
duke
parents:
diff changeset
756 if (ZapUnusedHeapArea) mangle_unused_area(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
757 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
758 }
a61af66fc99e Initial load
duke
parents:
diff changeset
759
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
760 class GenSpaceMangler;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
761
0
a61af66fc99e Initial load
duke
parents:
diff changeset
762 // A space in which the free area is contiguous. It therefore supports
a61af66fc99e Initial load
duke
parents:
diff changeset
763 // faster allocation, and compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
764 class ContiguousSpace: public CompactibleSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
765 friend class OneContigSpaceCardGeneration;
a61af66fc99e Initial load
duke
parents:
diff changeset
766 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
767 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
768 HeapWord* _top;
a61af66fc99e Initial load
duke
parents:
diff changeset
769 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
770 // 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
771 GenSpaceMangler* _mangler;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
772
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
773 GenSpaceMangler* mangler() { return _mangler; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
774
a61af66fc99e Initial load
duke
parents:
diff changeset
775 // Allocation helpers (return NULL if full).
a61af66fc99e Initial load
duke
parents:
diff changeset
776 inline HeapWord* allocate_impl(size_t word_size, HeapWord* end_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
777 inline HeapWord* par_allocate_impl(size_t word_size, HeapWord* end_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
778
a61af66fc99e Initial load
duke
parents:
diff changeset
779 public:
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
780 ContiguousSpace();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
781 ~ContiguousSpace();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
782
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
783 virtual void initialize(MemRegion mr, bool clear_space, bool mangle_space);
356
tonyp
parents: 347 269
diff changeset
784 virtual void clear(bool mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
785
a61af66fc99e Initial load
duke
parents:
diff changeset
786 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
787 HeapWord* top() const { return _top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
788 void set_top(HeapWord* value) { _top = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
789
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
790 virtual void set_saved_mark() { _saved_mark_word = top(); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
791 void reset_saved_mark() { _saved_mark_word = bottom(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
792
a61af66fc99e Initial load
duke
parents:
diff changeset
793 WaterMark bottom_mark() { return WaterMark(this, bottom()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
794 WaterMark top_mark() { return WaterMark(this, top()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
795 WaterMark saved_mark() { return WaterMark(this, saved_mark_word()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
796 bool saved_mark_at_top() const { return saved_mark_word() == top(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
797
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
798 // 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
799 // 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
800
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
801 // 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
802 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
803 // 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
804 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
805
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
806 // 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
807 // 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
808 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
809 // Mangle [top, end)
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
810 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
811 // Mangle the given MemRegion.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
812 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
813
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
814 // 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
815 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
816 // 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
817 // 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
818 void check_mangled_unused_area_complete() PRODUCT_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
819
a61af66fc99e Initial load
duke
parents:
diff changeset
820 // Size computations: sizes in bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
821 size_t capacity() const { return byte_size(bottom(), end()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
822 size_t used() const { return byte_size(bottom(), top()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
823 size_t free() const { return byte_size(top(), end()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
824
a61af66fc99e Initial load
duke
parents:
diff changeset
825 // Override from space.
a61af66fc99e Initial load
duke
parents:
diff changeset
826 bool is_in(const void* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
827
a61af66fc99e Initial load
duke
parents:
diff changeset
828 virtual bool is_free_block(const HeapWord* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
829
a61af66fc99e Initial load
duke
parents:
diff changeset
830 // In a contiguous space we have a more obvious bound on what parts
a61af66fc99e Initial load
duke
parents:
diff changeset
831 // contain objects.
a61af66fc99e Initial load
duke
parents:
diff changeset
832 MemRegion used_region() const { return MemRegion(bottom(), top()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
833
a61af66fc99e Initial load
duke
parents:
diff changeset
834 MemRegion used_region_at_save_marks() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
835 return MemRegion(bottom(), saved_mark_word());
a61af66fc99e Initial load
duke
parents:
diff changeset
836 }
a61af66fc99e Initial load
duke
parents:
diff changeset
837
a61af66fc99e Initial load
duke
parents:
diff changeset
838 // Allocation (return NULL if full)
a61af66fc99e Initial load
duke
parents:
diff changeset
839 virtual HeapWord* allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
840 virtual HeapWord* par_allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
841
a61af66fc99e Initial load
duke
parents:
diff changeset
842 virtual bool obj_allocated_since_save_marks(const oop obj) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
843 return (HeapWord*)obj >= saved_mark_word();
a61af66fc99e Initial load
duke
parents:
diff changeset
844 }
a61af66fc99e Initial load
duke
parents:
diff changeset
845
a61af66fc99e Initial load
duke
parents:
diff changeset
846 // Iteration
a61af66fc99e Initial load
duke
parents:
diff changeset
847 void oop_iterate(OopClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
848 void oop_iterate(MemRegion mr, OopClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
849 void object_iterate(ObjectClosure* blk);
517
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 438
diff changeset
850 // 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
851 // 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
852 void safe_object_iterate(ObjectClosure* blk);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
853 void object_iterate_mem(MemRegion mr, UpwardsObjectClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
854 // iterates on objects up to the safe limit
a61af66fc99e Initial load
duke
parents:
diff changeset
855 HeapWord* object_iterate_careful(ObjectClosureCareful* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
856 inline HeapWord* concurrent_iteration_safe_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
857 // changes the safe limit, all objects from bottom() to the new
a61af66fc99e Initial load
duke
parents:
diff changeset
858 // limit should be properly initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
859 inline void set_concurrent_iteration_safe_limit(HeapWord* new_limit);
a61af66fc99e Initial load
duke
parents:
diff changeset
860
a61af66fc99e Initial load
duke
parents:
diff changeset
861 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
862 // In support of parallel oop_iterate.
a61af66fc99e Initial load
duke
parents:
diff changeset
863 #define ContigSpace_PAR_OOP_ITERATE_DECL(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
864 void par_oop_iterate(MemRegion mr, OopClosureType* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
865
a61af66fc99e Initial load
duke
parents:
diff changeset
866 ALL_PAR_OOP_ITERATE_CLOSURES(ContigSpace_PAR_OOP_ITERATE_DECL)
a61af66fc99e Initial load
duke
parents:
diff changeset
867 #undef ContigSpace_PAR_OOP_ITERATE_DECL
a61af66fc99e Initial load
duke
parents:
diff changeset
868 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
869
a61af66fc99e Initial load
duke
parents:
diff changeset
870 // Compaction support
a61af66fc99e Initial load
duke
parents:
diff changeset
871 virtual void reset_after_compaction() {
a61af66fc99e Initial load
duke
parents:
diff changeset
872 assert(compaction_top() >= bottom() && compaction_top() <= end(), "should point inside space");
a61af66fc99e Initial load
duke
parents:
diff changeset
873 set_top(compaction_top());
a61af66fc99e Initial load
duke
parents:
diff changeset
874 // set new iteration safe limit
a61af66fc99e Initial load
duke
parents:
diff changeset
875 set_concurrent_iteration_safe_limit(compaction_top());
a61af66fc99e Initial load
duke
parents:
diff changeset
876 }
a61af66fc99e Initial load
duke
parents:
diff changeset
877 virtual size_t minimum_free_block_size() const { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
878
a61af66fc99e Initial load
duke
parents:
diff changeset
879 // Override.
a61af66fc99e Initial load
duke
parents:
diff changeset
880 DirtyCardToOopClosure* new_dcto_cl(OopClosure* cl,
a61af66fc99e Initial load
duke
parents:
diff changeset
881 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
882 HeapWord* boundary = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
883
a61af66fc99e Initial load
duke
parents:
diff changeset
884 // Apply "blk->do_oop" to the addresses of all reference fields in objects
a61af66fc99e Initial load
duke
parents:
diff changeset
885 // starting with the _saved_mark_word, which was noted during a generation's
a61af66fc99e Initial load
duke
parents:
diff changeset
886 // save_marks and is required to denote the head of an object.
a61af66fc99e Initial load
duke
parents:
diff changeset
887 // Fields in objects allocated by applications of the closure
a61af66fc99e Initial load
duke
parents:
diff changeset
888 // *are* included in the iteration.
a61af66fc99e Initial load
duke
parents:
diff changeset
889 // Updates _saved_mark_word to point to just after the last object
a61af66fc99e Initial load
duke
parents:
diff changeset
890 // iterated over.
a61af66fc99e Initial load
duke
parents:
diff changeset
891 #define ContigSpace_OOP_SINCE_SAVE_MARKS_DECL(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
892 void oop_since_save_marks_iterate##nv_suffix(OopClosureType* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
893
a61af66fc99e Initial load
duke
parents:
diff changeset
894 ALL_SINCE_SAVE_MARKS_CLOSURES(ContigSpace_OOP_SINCE_SAVE_MARKS_DECL)
a61af66fc99e Initial load
duke
parents:
diff changeset
895 #undef ContigSpace_OOP_SINCE_SAVE_MARKS_DECL
a61af66fc99e Initial load
duke
parents:
diff changeset
896
a61af66fc99e Initial load
duke
parents:
diff changeset
897 // Same as object_iterate, but starting from "mark", which is required
a61af66fc99e Initial load
duke
parents:
diff changeset
898 // to denote the start of an object. Objects allocated by
a61af66fc99e Initial load
duke
parents:
diff changeset
899 // applications of the closure *are* included in the iteration.
a61af66fc99e Initial load
duke
parents:
diff changeset
900 virtual void object_iterate_from(WaterMark mark, ObjectClosure* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
901
a61af66fc99e Initial load
duke
parents:
diff changeset
902 // Very inefficient implementation.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
903 virtual HeapWord* block_start_const(const void* p) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
904 size_t block_size(const HeapWord* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
905 // If a block is in the allocated area, it is an object.
a61af66fc99e Initial load
duke
parents:
diff changeset
906 bool block_is_obj(const HeapWord* p) const { return p < top(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
907
a61af66fc99e Initial load
duke
parents:
diff changeset
908 // Addresses for inlined allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
909 HeapWord** top_addr() { return &_top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
910 HeapWord** end_addr() { return &_end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
911
a61af66fc99e Initial load
duke
parents:
diff changeset
912 // Overrides for more efficient compaction support.
a61af66fc99e Initial load
duke
parents:
diff changeset
913 void prepare_for_compaction(CompactPoint* cp);
a61af66fc99e Initial load
duke
parents:
diff changeset
914
a61af66fc99e Initial load
duke
parents:
diff changeset
915 // PrintHeapAtGC support.
a61af66fc99e Initial load
duke
parents:
diff changeset
916 virtual void print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
917
a61af66fc99e Initial load
duke
parents:
diff changeset
918 // Checked dynamic downcasts.
a61af66fc99e Initial load
duke
parents:
diff changeset
919 virtual ContiguousSpace* toContiguousSpace() {
a61af66fc99e Initial load
duke
parents:
diff changeset
920 return this;
a61af66fc99e Initial load
duke
parents:
diff changeset
921 }
a61af66fc99e Initial load
duke
parents:
diff changeset
922
a61af66fc99e Initial load
duke
parents:
diff changeset
923 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
924 virtual void verify(bool allow_dirty) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
925
a61af66fc99e Initial load
duke
parents:
diff changeset
926 // Used to increase collection frequency. "factor" of 0 means entire
a61af66fc99e Initial load
duke
parents:
diff changeset
927 // space.
a61af66fc99e Initial load
duke
parents:
diff changeset
928 void allocate_temporary_filler(int factor);
a61af66fc99e Initial load
duke
parents:
diff changeset
929
a61af66fc99e Initial load
duke
parents:
diff changeset
930 };
a61af66fc99e Initial load
duke
parents:
diff changeset
931
a61af66fc99e Initial load
duke
parents:
diff changeset
932
a61af66fc99e Initial load
duke
parents:
diff changeset
933 // A dirty card to oop closure that does filtering.
a61af66fc99e Initial load
duke
parents:
diff changeset
934 // It knows how to filter out objects that are outside of the _boundary.
a61af66fc99e Initial load
duke
parents:
diff changeset
935 class Filtering_DCTOC : public DirtyCardToOopClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
936 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
937 // Override.
a61af66fc99e Initial load
duke
parents:
diff changeset
938 void walk_mem_region(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
939 HeapWord* bottom, HeapWord* top);
a61af66fc99e Initial load
duke
parents:
diff changeset
940
a61af66fc99e Initial load
duke
parents:
diff changeset
941 // Walk the given memory region, from bottom to top, applying
a61af66fc99e Initial load
duke
parents:
diff changeset
942 // the given oop closure to (possibly) all objects found. The
a61af66fc99e Initial load
duke
parents:
diff changeset
943 // given oop closure may or may not be the same as the oop
a61af66fc99e Initial load
duke
parents:
diff changeset
944 // closure with which this closure was created, as it may
a61af66fc99e Initial load
duke
parents:
diff changeset
945 // be a filtering closure which makes use of the _boundary.
a61af66fc99e Initial load
duke
parents:
diff changeset
946 // We offer two signatures, so the FilteringClosure static type is
a61af66fc99e Initial load
duke
parents:
diff changeset
947 // apparent.
a61af66fc99e Initial load
duke
parents:
diff changeset
948 virtual void walk_mem_region_with_cl(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
949 HeapWord* bottom, HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
950 OopClosure* cl) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
951 virtual void walk_mem_region_with_cl(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
952 HeapWord* bottom, HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
953 FilteringClosure* cl) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
954
a61af66fc99e Initial load
duke
parents:
diff changeset
955 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
956 Filtering_DCTOC(Space* sp, OopClosure* cl,
a61af66fc99e Initial load
duke
parents:
diff changeset
957 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
958 HeapWord* boundary) :
a61af66fc99e Initial load
duke
parents:
diff changeset
959 DirtyCardToOopClosure(sp, cl, precision, boundary) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
960 };
a61af66fc99e Initial load
duke
parents:
diff changeset
961
a61af66fc99e Initial load
duke
parents:
diff changeset
962 // A dirty card to oop closure for contiguous spaces
a61af66fc99e Initial load
duke
parents:
diff changeset
963 // (ContiguousSpace and sub-classes).
a61af66fc99e Initial load
duke
parents:
diff changeset
964 // It is a FilteringClosure, as defined above, and it knows:
a61af66fc99e Initial load
duke
parents:
diff changeset
965 //
a61af66fc99e Initial load
duke
parents:
diff changeset
966 // 1. That the actual top of any area in a memory region
a61af66fc99e Initial load
duke
parents:
diff changeset
967 // contained by the space is bounded by the end of the contiguous
a61af66fc99e Initial load
duke
parents:
diff changeset
968 // region of the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
969 // 2. That the space is really made up of objects and not just
a61af66fc99e Initial load
duke
parents:
diff changeset
970 // blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
971
a61af66fc99e Initial load
duke
parents:
diff changeset
972 class ContiguousSpaceDCTOC : public Filtering_DCTOC {
a61af66fc99e Initial load
duke
parents:
diff changeset
973 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
974 // Overrides.
a61af66fc99e Initial load
duke
parents:
diff changeset
975 HeapWord* get_actual_top(HeapWord* top, HeapWord* top_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
976
a61af66fc99e Initial load
duke
parents:
diff changeset
977 virtual void walk_mem_region_with_cl(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
978 HeapWord* bottom, HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
979 OopClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
980 virtual void walk_mem_region_with_cl(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
981 HeapWord* bottom, HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
982 FilteringClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
983
a61af66fc99e Initial load
duke
parents:
diff changeset
984 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
985 ContiguousSpaceDCTOC(ContiguousSpace* sp, OopClosure* cl,
a61af66fc99e Initial load
duke
parents:
diff changeset
986 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
987 HeapWord* boundary) :
a61af66fc99e Initial load
duke
parents:
diff changeset
988 Filtering_DCTOC(sp, cl, precision, boundary)
a61af66fc99e Initial load
duke
parents:
diff changeset
989 {}
a61af66fc99e Initial load
duke
parents:
diff changeset
990 };
a61af66fc99e Initial load
duke
parents:
diff changeset
991
a61af66fc99e Initial load
duke
parents:
diff changeset
992
a61af66fc99e Initial load
duke
parents:
diff changeset
993 // Class EdenSpace describes eden-space in new generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
994
a61af66fc99e Initial load
duke
parents:
diff changeset
995 class DefNewGeneration;
a61af66fc99e Initial load
duke
parents:
diff changeset
996
a61af66fc99e Initial load
duke
parents:
diff changeset
997 class EdenSpace : public ContiguousSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
998 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
999 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 DefNewGeneration* _gen;
a61af66fc99e Initial load
duke
parents:
diff changeset
1001
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 // _soft_end is used as a soft limit on allocation. As soft limits are
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 // reached, the slow-path allocation code can invoke other actions and then
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 // adjust _soft_end up to a new soft limit or to end().
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 HeapWord* _soft_end;
a61af66fc99e Initial load
duke
parents:
diff changeset
1006
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 public:
347
60fb9c4db4e6 6718086: CMS assert: _concurrent_iteration_safe_limit update missed
ysr
parents: 342
diff changeset
1008 EdenSpace(DefNewGeneration* gen) :
60fb9c4db4e6 6718086: CMS assert: _concurrent_iteration_safe_limit update missed
ysr
parents: 342
diff changeset
1009 _gen(gen), _soft_end(NULL) {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1010
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 // Get/set just the 'soft' limit.
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 HeapWord* soft_end() { return _soft_end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 HeapWord** soft_end_addr() { return &_soft_end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 void set_soft_end(HeapWord* value) { _soft_end = value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1015
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 // Override.
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1017 void clear(bool mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1018
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 // Set both the 'hard' and 'soft' limits (_end and _soft_end).
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 void set_end(HeapWord* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 set_soft_end(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 ContiguousSpace::set_end(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1024
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 // Allocation (return NULL if full)
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 HeapWord* allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 HeapWord* par_allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1029
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 // Class ConcEdenSpace extends EdenSpace for the sake of safe
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 // allocation while soft-end is being modified concurrently
a61af66fc99e Initial load
duke
parents:
diff changeset
1032
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 class ConcEdenSpace : public EdenSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 ConcEdenSpace(DefNewGeneration* gen) : EdenSpace(gen) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1036
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 // Allocation (return NULL if full)
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 HeapWord* par_allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1040
a61af66fc99e Initial load
duke
parents:
diff changeset
1041
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 // A ContigSpace that Supports an efficient "block_start" operation via
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 // a BlockOffsetArray (whose BlockOffsetSharedArray may be shared with
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 // other spaces.) This is the abstract base class for old generation
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 // (tenured, perm) spaces.
a61af66fc99e Initial load
duke
parents:
diff changeset
1046
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 class OffsetTableContigSpace: public ContiguousSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 BlockOffsetArrayContigSpace _offsets;
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 Mutex _par_alloc_lock;
a61af66fc99e Initial load
duke
parents:
diff changeset
1052
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 OffsetTableContigSpace(BlockOffsetSharedArray* sharedOffsetArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1057
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 void set_bottom(HeapWord* value);
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 void set_end(HeapWord* value);
a61af66fc99e Initial load
duke
parents:
diff changeset
1060
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
1061 void clear(bool mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1062
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
1063 inline HeapWord* block_start_const(const void* p) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1064
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 // Add offset table update.
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 virtual inline HeapWord* allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 inline HeapWord* par_allocate(size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1068
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 // MarkSweep support phase3
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 virtual HeapWord* initialize_threshold();
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 virtual HeapWord* cross_threshold(HeapWord* start, HeapWord* end);
a61af66fc99e Initial load
duke
parents:
diff changeset
1072
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 virtual void print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1074
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 void verify(bool allow_dirty) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1077
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 // Shared space support
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 void serialize_block_offset_array_offsets(SerializeOopClosure* soc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1081
a61af66fc99e Initial load
duke
parents:
diff changeset
1082
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 // Class TenuredSpace is used by TenuredGeneration
a61af66fc99e Initial load
duke
parents:
diff changeset
1084
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 class TenuredSpace: public OffsetTableContigSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 // Mark sweep support
438
122d10c82f3f 6765804: GC "dead ratios" should be unsigned
jcoomes
parents: 356
diff changeset
1089 size_t allowed_dead_ratio() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 TenuredSpace(BlockOffsetSharedArray* sharedOffsetArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 MemRegion mr) :
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 OffsetTableContigSpace(sharedOffsetArray, mr) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1096
a61af66fc99e Initial load
duke
parents:
diff changeset
1097
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 // Class ContigPermSpace is used by CompactingPermGen
a61af66fc99e Initial load
duke
parents:
diff changeset
1099
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 class ContigPermSpace: public OffsetTableContigSpace {
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 // Mark sweep support
438
122d10c82f3f 6765804: GC "dead ratios" should be unsigned
jcoomes
parents: 356
diff changeset
1104 size_t allowed_dead_ratio() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 ContigPermSpace(BlockOffsetSharedArray* sharedOffsetArray, MemRegion mr) :
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 OffsetTableContigSpace(sharedOffsetArray, mr) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 };