annotate src/share/vm/memory/space.cpp @ 1716:be3f9c242c9d

6948538: CMS: BOT walkers can fall into object allocation and initialization cracks Summary: GC workers now recognize an intermediate transient state of blocks which are allocated but have not yet completed initialization. blk_start() calls do not attempt to determine the size of a block in the transient state, rather waiting for the block to become initialized so that it is safe to query its size. Audited and ensured the order of initialization of object fields (klass, free bit and size) to respect block state transition protocol. Also included some new assertion checking code enabled in debug mode. Reviewed-by: chrisphi, johnc, poonam
author ysr
date Mon, 16 Aug 2010 15:58:42 -0700
parents e9ff18c4ace7
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: 1142
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: 1142
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1142
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: 1142
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 # include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 # include "incls/_space.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
28 void SpaceMemRegionOopsIterClosure::do_oop(oop* p) { SpaceMemRegionOopsIterClosure::do_oop_work(p); }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
29 void SpaceMemRegionOopsIterClosure::do_oop(narrowOop* p) { SpaceMemRegionOopsIterClosure::do_oop_work(p); }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
30
0
a61af66fc99e Initial load
duke
parents:
diff changeset
31 HeapWord* DirtyCardToOopClosure::get_actual_top(HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
32 HeapWord* top_obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
33 if (top_obj != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
34 if (_sp->block_is_obj(top_obj)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
35 if (_precision == CardTableModRefBS::ObjHeadPreciseArray) {
a61af66fc99e Initial load
duke
parents:
diff changeset
36 if (oop(top_obj)->is_objArray() || oop(top_obj)->is_typeArray()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // An arrayOop is starting on the dirty card - since we do exact
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // store checks for objArrays we are done.
a61af66fc99e Initial load
duke
parents:
diff changeset
39 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // Otherwise, it is possible that the object starting on the dirty
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // card spans the entire card, and that the store happened on a
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // later card. Figure out where the object ends.
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // Use the block_size() method of the space over which
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // the iteration is being done. That space (e.g. CMS) may have
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // specific requirements on object sizes which will
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // be reflected in the block_size() method.
a61af66fc99e Initial load
duke
parents:
diff changeset
47 top = top_obj + oop(top_obj)->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
48 }
a61af66fc99e Initial load
duke
parents:
diff changeset
49 }
a61af66fc99e Initial load
duke
parents:
diff changeset
50 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
51 top = top_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 }
a61af66fc99e Initial load
duke
parents:
diff changeset
53 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
54 assert(top == _sp->end(), "only case where top_obj == NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
55 }
a61af66fc99e Initial load
duke
parents:
diff changeset
56 return top;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 }
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 void DirtyCardToOopClosure::walk_mem_region(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
60 HeapWord* bottom,
a61af66fc99e Initial load
duke
parents:
diff changeset
61 HeapWord* top) {
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // 1. Blocks may or may not be objects.
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // 2. Even when a block_is_obj(), it may not entirely
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // occupy the block if the block quantum is larger than
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // the object size.
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // We can and should try to optimize by calling the non-MemRegion
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // version of oop_iterate() for all but the extremal objects
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // (for which we need to call the MemRegion version of
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // oop_iterate()) To be done post-beta XXX
a61af66fc99e Initial load
duke
parents:
diff changeset
70 for (; bottom < top; bottom += _sp->block_size(bottom)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // As in the case of contiguous space above, we'd like to
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // just use the value returned by oop_iterate to increment the
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // current pointer; unfortunately, that won't work in CMS because
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // we'd need an interface change (it seems) to have the space
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // "adjust the object size" (for instance pad it up to its
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // block alignment or minimum block size restrictions. XXX
a61af66fc99e Initial load
duke
parents:
diff changeset
77 if (_sp->block_is_obj(bottom) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
78 !_sp->obj_allocated_since_save_marks(oop(bottom))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
79 oop(bottom)->oop_iterate(_cl, mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
80 }
a61af66fc99e Initial load
duke
parents:
diff changeset
81 }
a61af66fc99e Initial load
duke
parents:
diff changeset
82 }
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 void DirtyCardToOopClosure::do_MemRegion(MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // Some collectors need to do special things whenever their dirty
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // cards are processed. For instance, CMS must remember mutator updates
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // (i.e. dirty cards) so as to re-scan mutated objects.
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // Such work can be piggy-backed here on dirty card scanning, so as to make
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // it slightly more efficient than doing a complete non-detructive pre-scan
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // of the card table.
a61af66fc99e Initial load
duke
parents:
diff changeset
92 MemRegionClosure* pCl = _sp->preconsumptionDirtyCardClosure();
a61af66fc99e Initial load
duke
parents:
diff changeset
93 if (pCl != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
94 pCl->do_MemRegion(mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
95 }
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97 HeapWord* bottom = mr.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
98 HeapWord* last = mr.last();
a61af66fc99e Initial load
duke
parents:
diff changeset
99 HeapWord* top = mr.end();
a61af66fc99e Initial load
duke
parents:
diff changeset
100 HeapWord* bottom_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
101 HeapWord* top_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 assert(_precision == CardTableModRefBS::ObjHeadPreciseArray ||
a61af66fc99e Initial load
duke
parents:
diff changeset
104 _precision == CardTableModRefBS::Precise,
a61af66fc99e Initial load
duke
parents:
diff changeset
105 "Only ones we deal with for now.");
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 assert(_precision != CardTableModRefBS::ObjHeadPreciseArray ||
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
108 _cl->idempotent() || _last_bottom == NULL ||
0
a61af66fc99e Initial load
duke
parents:
diff changeset
109 top <= _last_bottom,
a61af66fc99e Initial load
duke
parents:
diff changeset
110 "Not decreasing");
a61af66fc99e Initial load
duke
parents:
diff changeset
111 NOT_PRODUCT(_last_bottom = mr.start());
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 bottom_obj = _sp->block_start(bottom);
a61af66fc99e Initial load
duke
parents:
diff changeset
114 top_obj = _sp->block_start(last);
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 assert(bottom_obj <= bottom, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
117 assert(top_obj <= top, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // Given what we think is the top of the memory region and
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // the start of the object at the top, get the actual
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // value of the top.
a61af66fc99e Initial load
duke
parents:
diff changeset
122 top = get_actual_top(top, top_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // If the previous call did some part of this region, don't redo.
a61af66fc99e Initial load
duke
parents:
diff changeset
125 if (_precision == CardTableModRefBS::ObjHeadPreciseArray &&
a61af66fc99e Initial load
duke
parents:
diff changeset
126 _min_done != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
127 _min_done < top) {
a61af66fc99e Initial load
duke
parents:
diff changeset
128 top = _min_done;
a61af66fc99e Initial load
duke
parents:
diff changeset
129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // Top may have been reset, and in fact may be below bottom,
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // e.g. the dirty card region is entirely in a now free object
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // -- something that could happen with a concurrent sweeper.
a61af66fc99e Initial load
duke
parents:
diff changeset
134 bottom = MIN2(bottom, top);
a61af66fc99e Initial load
duke
parents:
diff changeset
135 mr = MemRegion(bottom, top);
a61af66fc99e Initial load
duke
parents:
diff changeset
136 assert(bottom <= top &&
a61af66fc99e Initial load
duke
parents:
diff changeset
137 (_precision != CardTableModRefBS::ObjHeadPreciseArray ||
a61af66fc99e Initial load
duke
parents:
diff changeset
138 _min_done == NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
139 top <= _min_done),
a61af66fc99e Initial load
duke
parents:
diff changeset
140 "overlap!");
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // Walk the region if it is not empty; otherwise there is nothing to do.
a61af66fc99e Initial load
duke
parents:
diff changeset
143 if (!mr.is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
144 walk_mem_region(mr, bottom_obj, top);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
146
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
147 // An idempotent closure might be applied in any order, so we don't
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
148 // record a _min_done for it.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
149 if (!_cl->idempotent()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
150 _min_done = bottom;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
151 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
152 assert(_min_done == _last_explicit_min_done,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
153 "Don't update _min_done for idempotent cl");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
154 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 DirtyCardToOopClosure* Space::new_dcto_cl(OopClosure* cl,
a61af66fc99e Initial load
duke
parents:
diff changeset
158 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
159 HeapWord* boundary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
160 return new DirtyCardToOopClosure(this, cl, precision, boundary);
a61af66fc99e Initial load
duke
parents:
diff changeset
161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163 HeapWord* ContiguousSpaceDCTOC::get_actual_top(HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
164 HeapWord* top_obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
165 if (top_obj != NULL && top_obj < (_sp->toContiguousSpace())->top()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
166 if (_precision == CardTableModRefBS::ObjHeadPreciseArray) {
a61af66fc99e Initial load
duke
parents:
diff changeset
167 if (oop(top_obj)->is_objArray() || oop(top_obj)->is_typeArray()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // An arrayOop is starting on the dirty card - since we do exact
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // store checks for objArrays we are done.
a61af66fc99e Initial load
duke
parents:
diff changeset
170 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // Otherwise, it is possible that the object starting on the dirty
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // card spans the entire card, and that the store happened on a
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // later card. Figure out where the object ends.
a61af66fc99e Initial load
duke
parents:
diff changeset
174 assert(_sp->block_size(top_obj) == (size_t) oop(top_obj)->size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
175 "Block size and object size mismatch");
a61af66fc99e Initial load
duke
parents:
diff changeset
176 top = top_obj + oop(top_obj)->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
179 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
180 top = (_sp->toContiguousSpace())->top();
a61af66fc99e Initial load
duke
parents:
diff changeset
181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
182 return top;
a61af66fc99e Initial load
duke
parents:
diff changeset
183 }
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185 void Filtering_DCTOC::walk_mem_region(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
186 HeapWord* bottom,
a61af66fc99e Initial load
duke
parents:
diff changeset
187 HeapWord* top) {
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // Note that this assumption won't hold if we have a concurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // collector in this space, which may have freed up objects after
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // they were dirtied and before the stop-the-world GC that is
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // examining cards here.
a61af66fc99e Initial load
duke
parents:
diff changeset
192 assert(bottom < top, "ought to be at least one obj on a dirty card.");
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 if (_boundary != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // We have a boundary outside of which we don't want to look
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // at objects, so create a filtering closure around the
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // oop closure before walking the region.
a61af66fc99e Initial load
duke
parents:
diff changeset
198 FilteringClosure filter(_boundary, _cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
199 walk_mem_region_with_cl(mr, bottom, top, &filter);
a61af66fc99e Initial load
duke
parents:
diff changeset
200 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // No boundary, simply walk the heap with the oop closure.
a61af66fc99e Initial load
duke
parents:
diff changeset
202 walk_mem_region_with_cl(mr, bottom, top, _cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // We must replicate this so that the static type of "FilteringClosure"
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // (see above) is apparent at the oop_iterate calls.
a61af66fc99e Initial load
duke
parents:
diff changeset
209 #define ContiguousSpaceDCTOC__walk_mem_region_with_cl_DEFN(ClosureType) \
a61af66fc99e Initial load
duke
parents:
diff changeset
210 void ContiguousSpaceDCTOC::walk_mem_region_with_cl(MemRegion mr, \
a61af66fc99e Initial load
duke
parents:
diff changeset
211 HeapWord* bottom, \
a61af66fc99e Initial load
duke
parents:
diff changeset
212 HeapWord* top, \
a61af66fc99e Initial load
duke
parents:
diff changeset
213 ClosureType* cl) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
214 bottom += oop(bottom)->oop_iterate(cl, mr); \
a61af66fc99e Initial load
duke
parents:
diff changeset
215 if (bottom < top) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
216 HeapWord* next_obj = bottom + oop(bottom)->size(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
217 while (next_obj < top) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
218 /* Bottom lies entirely below top, so we can call the */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
219 /* non-memRegion version of oop_iterate below. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
220 oop(bottom)->oop_iterate(cl); \
a61af66fc99e Initial load
duke
parents:
diff changeset
221 bottom = next_obj; \
a61af66fc99e Initial load
duke
parents:
diff changeset
222 next_obj = bottom + oop(bottom)->size(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
223 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
224 /* Last object. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
225 oop(bottom)->oop_iterate(cl, mr); \
a61af66fc99e Initial load
duke
parents:
diff changeset
226 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // (There are only two of these, rather than N, because the split is due
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // only to the introduction of the FilteringClosure, a local part of the
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // impl of this abstraction.)
a61af66fc99e Initial load
duke
parents:
diff changeset
232 ContiguousSpaceDCTOC__walk_mem_region_with_cl_DEFN(OopClosure)
a61af66fc99e Initial load
duke
parents:
diff changeset
233 ContiguousSpaceDCTOC__walk_mem_region_with_cl_DEFN(FilteringClosure)
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 DirtyCardToOopClosure*
a61af66fc99e Initial load
duke
parents:
diff changeset
236 ContiguousSpace::new_dcto_cl(OopClosure* cl,
a61af66fc99e Initial load
duke
parents:
diff changeset
237 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
238 HeapWord* boundary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
239 return new ContiguousSpaceDCTOC(this, cl, precision, boundary);
a61af66fc99e Initial load
duke
parents:
diff changeset
240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
241
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
242 void Space::initialize(MemRegion mr,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
243 bool clear_space,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
244 bool mangle_space) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
245 HeapWord* bottom = mr.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
246 HeapWord* end = mr.end();
a61af66fc99e Initial load
duke
parents:
diff changeset
247 assert(Universe::on_page_boundary(bottom) && Universe::on_page_boundary(end),
a61af66fc99e Initial load
duke
parents:
diff changeset
248 "invalid space boundaries");
a61af66fc99e Initial load
duke
parents:
diff changeset
249 set_bottom(bottom);
a61af66fc99e Initial load
duke
parents:
diff changeset
250 set_end(end);
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
251 if (clear_space) clear(mangle_space);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
252 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
253
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
254 void Space::clear(bool mangle_space) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
255 if (ZapUnusedHeapArea && mangle_space) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
256 mangle_unused_area();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
257 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
259
356
tonyp
parents: 347 269
diff changeset
260 ContiguousSpace::ContiguousSpace(): CompactibleSpace(), _top(NULL),
tonyp
parents: 347 269
diff changeset
261 _concurrent_iteration_safe_limit(NULL) {
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
262 _mangler = new GenSpaceMangler(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
264
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
265 ContiguousSpace::~ContiguousSpace() {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
266 delete _mangler;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
267 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
268
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
269 void ContiguousSpace::initialize(MemRegion mr,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
270 bool clear_space,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
271 bool mangle_space)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
272 {
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
273 CompactibleSpace::initialize(mr, clear_space, mangle_space);
347
60fb9c4db4e6 6718086: CMS assert: _concurrent_iteration_safe_limit update missed
ysr
parents: 344
diff changeset
274 set_concurrent_iteration_safe_limit(top());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
275 }
a61af66fc99e Initial load
duke
parents:
diff changeset
276
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
277 void ContiguousSpace::clear(bool mangle_space) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
278 set_top(bottom());
a61af66fc99e Initial load
duke
parents:
diff changeset
279 set_saved_mark();
356
tonyp
parents: 347 269
diff changeset
280 CompactibleSpace::clear(mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283 bool Space::is_in(const void* p) const {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
284 HeapWord* b = block_start_const(p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
285 return b != NULL && block_is_obj(b);
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 bool ContiguousSpace::is_in(const void* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
289 return _bottom <= p && p < _top;
a61af66fc99e Initial load
duke
parents:
diff changeset
290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292 bool ContiguousSpace::is_free_block(const HeapWord* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
293 return p >= _top;
a61af66fc99e Initial load
duke
parents:
diff changeset
294 }
a61af66fc99e Initial load
duke
parents:
diff changeset
295
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
296 void OffsetTableContigSpace::clear(bool mangle_space) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
297 ContiguousSpace::clear(mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
298 _offsets.initialize_threshold();
a61af66fc99e Initial load
duke
parents:
diff changeset
299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
300
a61af66fc99e Initial load
duke
parents:
diff changeset
301 void OffsetTableContigSpace::set_bottom(HeapWord* new_bottom) {
a61af66fc99e Initial load
duke
parents:
diff changeset
302 Space::set_bottom(new_bottom);
a61af66fc99e Initial load
duke
parents:
diff changeset
303 _offsets.set_bottom(new_bottom);
a61af66fc99e Initial load
duke
parents:
diff changeset
304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306 void OffsetTableContigSpace::set_end(HeapWord* new_end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // Space should not advertize an increase in size
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // until after the underlying offest table has been enlarged.
a61af66fc99e Initial load
duke
parents:
diff changeset
309 _offsets.resize(pointer_delta(new_end, bottom()));
a61af66fc99e Initial load
duke
parents:
diff changeset
310 Space::set_end(new_end);
a61af66fc99e Initial load
duke
parents:
diff changeset
311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
312
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
313 #ifndef PRODUCT
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
314
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
315 void ContiguousSpace::set_top_for_allocations(HeapWord* v) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
316 mangler()->set_top_for_allocations(v);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
317 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
318 void ContiguousSpace::set_top_for_allocations() {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
319 mangler()->set_top_for_allocations(top());
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
320 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
321 void ContiguousSpace::check_mangled_unused_area(HeapWord* limit) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
322 mangler()->check_mangled_unused_area(limit);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
323 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
324
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
325 void ContiguousSpace::check_mangled_unused_area_complete() {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
326 mangler()->check_mangled_unused_area_complete();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
328
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
329 // Mangled only the unused space that has not previously
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
330 // been mangled and that has not been allocated since being
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
331 // mangled.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
332 void ContiguousSpace::mangle_unused_area() {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
333 mangler()->mangle_unused_area();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
334 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
335 void ContiguousSpace::mangle_unused_area_complete() {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
336 mangler()->mangle_unused_area_complete();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
337 }
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
338 void ContiguousSpace::mangle_region(MemRegion mr) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
339 // Although this method uses SpaceMangler::mangle_region() which
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
340 // is not specific to a space, the when the ContiguousSpace version
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
341 // is called, it is always with regard to a space and this
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
342 // bounds checking is appropriate.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
343 MemRegion space_mr(bottom(), end());
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
344 assert(space_mr.contains(mr), "Mangling outside space");
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
345 SpaceMangler::mangle_region(mr);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
346 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
347 #endif // NOT_PRODUCT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
348
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
349 void CompactibleSpace::initialize(MemRegion mr,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
350 bool clear_space,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
351 bool mangle_space) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
352 Space::initialize(mr, clear_space, mangle_space);
356
tonyp
parents: 347 269
diff changeset
353 set_compaction_top(bottom());
tonyp
parents: 347 269
diff changeset
354 _next_compaction_space = NULL;
tonyp
parents: 347 269
diff changeset
355 }
tonyp
parents: 347 269
diff changeset
356
tonyp
parents: 347 269
diff changeset
357 void CompactibleSpace::clear(bool mangle_space) {
tonyp
parents: 347 269
diff changeset
358 Space::clear(mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
359 _compaction_top = bottom();
a61af66fc99e Initial load
duke
parents:
diff changeset
360 }
a61af66fc99e Initial load
duke
parents:
diff changeset
361
a61af66fc99e Initial load
duke
parents:
diff changeset
362 HeapWord* CompactibleSpace::forward(oop q, size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
363 CompactPoint* cp, HeapWord* compact_top) {
a61af66fc99e Initial load
duke
parents:
diff changeset
364 // q is alive
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // First check if we should switch compaction space
a61af66fc99e Initial load
duke
parents:
diff changeset
366 assert(this == cp->space, "'this' should be current compaction space.");
a61af66fc99e Initial load
duke
parents:
diff changeset
367 size_t compaction_max_size = pointer_delta(end(), compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
368 while (size > compaction_max_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // switch to next compaction space
a61af66fc99e Initial load
duke
parents:
diff changeset
370 cp->space->set_compaction_top(compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
371 cp->space = cp->space->next_compaction_space();
a61af66fc99e Initial load
duke
parents:
diff changeset
372 if (cp->space == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
373 cp->gen = GenCollectedHeap::heap()->prev_gen(cp->gen);
a61af66fc99e Initial load
duke
parents:
diff changeset
374 assert(cp->gen != NULL, "compaction must succeed");
a61af66fc99e Initial load
duke
parents:
diff changeset
375 cp->space = cp->gen->first_compaction_space();
a61af66fc99e Initial load
duke
parents:
diff changeset
376 assert(cp->space != NULL, "generation must have a first compaction space");
a61af66fc99e Initial load
duke
parents:
diff changeset
377 }
a61af66fc99e Initial load
duke
parents:
diff changeset
378 compact_top = cp->space->bottom();
a61af66fc99e Initial load
duke
parents:
diff changeset
379 cp->space->set_compaction_top(compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
380 cp->threshold = cp->space->initialize_threshold();
a61af66fc99e Initial load
duke
parents:
diff changeset
381 compaction_max_size = pointer_delta(cp->space->end(), compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 // store the forwarding pointer into the mark word
a61af66fc99e Initial load
duke
parents:
diff changeset
385 if ((HeapWord*)q != compact_top) {
a61af66fc99e Initial load
duke
parents:
diff changeset
386 q->forward_to(oop(compact_top));
a61af66fc99e Initial load
duke
parents:
diff changeset
387 assert(q->is_gc_marked(), "encoding the pointer should preserve the mark");
a61af66fc99e Initial load
duke
parents:
diff changeset
388 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
389 // if the object isn't moving we can just set the mark to the default
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // mark and handle it specially later on.
a61af66fc99e Initial load
duke
parents:
diff changeset
391 q->init_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
392 assert(q->forwardee() == NULL, "should be forwarded to NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
393 }
a61af66fc99e Initial load
duke
parents:
diff changeset
394
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
395 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::register_live_oop(q, size));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
396 compact_top += size;
a61af66fc99e Initial load
duke
parents:
diff changeset
397
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // we need to update the offset table so that the beginnings of objects can be
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // found during scavenge. Note that we are updating the offset table based on
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // where the object will be once the compaction phase finishes.
a61af66fc99e Initial load
duke
parents:
diff changeset
401 if (compact_top > cp->threshold)
a61af66fc99e Initial load
duke
parents:
diff changeset
402 cp->threshold =
a61af66fc99e Initial load
duke
parents:
diff changeset
403 cp->space->cross_threshold(compact_top - size, compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
404 return compact_top;
a61af66fc99e Initial load
duke
parents:
diff changeset
405 }
a61af66fc99e Initial load
duke
parents:
diff changeset
406
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 bool CompactibleSpace::insert_deadspace(size_t& allowed_deadspace_words,
a61af66fc99e Initial load
duke
parents:
diff changeset
409 HeapWord* q, size_t deadlength) {
a61af66fc99e Initial load
duke
parents:
diff changeset
410 if (allowed_deadspace_words >= deadlength) {
a61af66fc99e Initial load
duke
parents:
diff changeset
411 allowed_deadspace_words -= deadlength;
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 438
diff changeset
412 CollectedHeap::fill_with_object(q, deadlength);
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 438
diff changeset
413 oop(q)->set_mark(oop(q)->mark()->set_marked());
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 438
diff changeset
414 assert((int) deadlength == oop(q)->size(), "bad filler object size");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // Recall that we required "q == compaction_top".
a61af66fc99e Initial load
duke
parents:
diff changeset
416 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
417 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
418 allowed_deadspace_words = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
419 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
422
a61af66fc99e Initial load
duke
parents:
diff changeset
423 #define block_is_always_obj(q) true
a61af66fc99e Initial load
duke
parents:
diff changeset
424 #define obj_size(q) oop(q)->size()
a61af66fc99e Initial load
duke
parents:
diff changeset
425 #define adjust_obj_size(s) s
a61af66fc99e Initial load
duke
parents:
diff changeset
426
a61af66fc99e Initial load
duke
parents:
diff changeset
427 void CompactibleSpace::prepare_for_compaction(CompactPoint* cp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
428 SCAN_AND_FORWARD(cp, end, block_is_obj, block_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
429 }
a61af66fc99e Initial load
duke
parents:
diff changeset
430
a61af66fc99e Initial load
duke
parents:
diff changeset
431 // Faster object search.
a61af66fc99e Initial load
duke
parents:
diff changeset
432 void ContiguousSpace::prepare_for_compaction(CompactPoint* cp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
433 SCAN_AND_FORWARD(cp, top, block_is_always_obj, obj_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
435
a61af66fc99e Initial load
duke
parents:
diff changeset
436 void Space::adjust_pointers() {
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // adjust all the interior pointers to point at the new locations of objects
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // Used by MarkSweep::mark_sweep_phase3()
a61af66fc99e Initial load
duke
parents:
diff changeset
439
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // First check to see if there is any work to be done.
a61af66fc99e Initial load
duke
parents:
diff changeset
441 if (used() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
442 return; // Nothing to do.
a61af66fc99e Initial load
duke
parents:
diff changeset
443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
444
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // Otherwise...
a61af66fc99e Initial load
duke
parents:
diff changeset
446 HeapWord* q = bottom();
a61af66fc99e Initial load
duke
parents:
diff changeset
447 HeapWord* t = end();
a61af66fc99e Initial load
duke
parents:
diff changeset
448
a61af66fc99e Initial load
duke
parents:
diff changeset
449 debug_only(HeapWord* prev_q = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
450 while (q < t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
451 if (oop(q)->is_gc_marked()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
452 // q is alive
a61af66fc99e Initial load
duke
parents:
diff changeset
453
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
454 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::track_interior_pointers(oop(q)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // point all the oops to the new location
a61af66fc99e Initial load
duke
parents:
diff changeset
456 size_t size = oop(q)->adjust_pointers();
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
457 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::check_interior_pointers());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
458
a61af66fc99e Initial load
duke
parents:
diff changeset
459 debug_only(prev_q = q);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
460 VALIDATE_MARK_SWEEP_ONLY(MarkSweep::validate_live_oop(oop(q), size));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
461
a61af66fc99e Initial load
duke
parents:
diff changeset
462 q += size;
a61af66fc99e Initial load
duke
parents:
diff changeset
463 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // q is not a live object. But we're not in a compactible space,
a61af66fc99e Initial load
duke
parents:
diff changeset
465 // So we don't have live ranges.
a61af66fc99e Initial load
duke
parents:
diff changeset
466 debug_only(prev_q = q);
a61af66fc99e Initial load
duke
parents:
diff changeset
467 q += block_size(q);
a61af66fc99e Initial load
duke
parents:
diff changeset
468 assert(q > prev_q, "we should be moving forward through memory");
a61af66fc99e Initial load
duke
parents:
diff changeset
469 }
a61af66fc99e Initial load
duke
parents:
diff changeset
470 }
a61af66fc99e Initial load
duke
parents:
diff changeset
471 assert(q == t, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474 void CompactibleSpace::adjust_pointers() {
a61af66fc99e Initial load
duke
parents:
diff changeset
475 // Check first is there is any work to do.
a61af66fc99e Initial load
duke
parents:
diff changeset
476 if (used() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
477 return; // Nothing to do.
a61af66fc99e Initial load
duke
parents:
diff changeset
478 }
a61af66fc99e Initial load
duke
parents:
diff changeset
479
a61af66fc99e Initial load
duke
parents:
diff changeset
480 SCAN_AND_ADJUST_POINTERS(adjust_obj_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
481 }
a61af66fc99e Initial load
duke
parents:
diff changeset
482
a61af66fc99e Initial load
duke
parents:
diff changeset
483 void CompactibleSpace::compact() {
a61af66fc99e Initial load
duke
parents:
diff changeset
484 SCAN_AND_COMPACT(obj_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
486
a61af66fc99e Initial load
duke
parents:
diff changeset
487 void Space::print_short() const { print_short_on(tty); }
a61af66fc99e Initial load
duke
parents:
diff changeset
488
a61af66fc99e Initial load
duke
parents:
diff changeset
489 void Space::print_short_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
490 st->print(" space " SIZE_FORMAT "K, %3d%% used", capacity() / K,
a61af66fc99e Initial load
duke
parents:
diff changeset
491 (int) ((double) used() * 100 / capacity()));
a61af66fc99e Initial load
duke
parents:
diff changeset
492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
493
a61af66fc99e Initial load
duke
parents:
diff changeset
494 void Space::print() const { print_on(tty); }
a61af66fc99e Initial load
duke
parents:
diff changeset
495
a61af66fc99e Initial load
duke
parents:
diff changeset
496 void Space::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
497 print_short_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
498 st->print_cr(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ")",
a61af66fc99e Initial load
duke
parents:
diff changeset
499 bottom(), end());
a61af66fc99e Initial load
duke
parents:
diff changeset
500 }
a61af66fc99e Initial load
duke
parents:
diff changeset
501
a61af66fc99e Initial load
duke
parents:
diff changeset
502 void ContiguousSpace::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
503 print_short_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
504 st->print_cr(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", " INTPTR_FORMAT ")",
a61af66fc99e Initial load
duke
parents:
diff changeset
505 bottom(), top(), end());
a61af66fc99e Initial load
duke
parents:
diff changeset
506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 void OffsetTableContigSpace::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
509 print_short_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
510 st->print_cr(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", "
a61af66fc99e Initial load
duke
parents:
diff changeset
511 INTPTR_FORMAT ", " INTPTR_FORMAT ")",
a61af66fc99e Initial load
duke
parents:
diff changeset
512 bottom(), top(), _offsets.threshold(), end());
a61af66fc99e Initial load
duke
parents:
diff changeset
513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
514
a61af66fc99e Initial load
duke
parents:
diff changeset
515 void ContiguousSpace::verify(bool allow_dirty) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
516 HeapWord* p = bottom();
a61af66fc99e Initial load
duke
parents:
diff changeset
517 HeapWord* t = top();
a61af66fc99e Initial load
duke
parents:
diff changeset
518 HeapWord* prev_p = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
519 while (p < t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
520 oop(p)->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
521 prev_p = p;
a61af66fc99e Initial load
duke
parents:
diff changeset
522 p += oop(p)->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
523 }
a61af66fc99e Initial load
duke
parents:
diff changeset
524 guarantee(p == top(), "end of last object must match end of space");
a61af66fc99e Initial load
duke
parents:
diff changeset
525 if (top() != end()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
526 guarantee(top() == block_start_const(end()-1) &&
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
527 top() == block_start_const(top()),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
528 "top should be start of unallocated block, if it exists");
a61af66fc99e Initial load
duke
parents:
diff changeset
529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
530 }
a61af66fc99e Initial load
duke
parents:
diff changeset
531
a61af66fc99e Initial load
duke
parents:
diff changeset
532 void Space::oop_iterate(OopClosure* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
533 ObjectToOopClosure blk2(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
534 object_iterate(&blk2);
a61af66fc99e Initial load
duke
parents:
diff changeset
535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
536
a61af66fc99e Initial load
duke
parents:
diff changeset
537 HeapWord* Space::object_iterate_careful(ObjectClosureCareful* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
538 guarantee(false, "NYI");
a61af66fc99e Initial load
duke
parents:
diff changeset
539 return bottom();
a61af66fc99e Initial load
duke
parents:
diff changeset
540 }
a61af66fc99e Initial load
duke
parents:
diff changeset
541
a61af66fc99e Initial load
duke
parents:
diff changeset
542 HeapWord* Space::object_iterate_careful_m(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
543 ObjectClosureCareful* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
544 guarantee(false, "NYI");
a61af66fc99e Initial load
duke
parents:
diff changeset
545 return bottom();
a61af66fc99e Initial load
duke
parents:
diff changeset
546 }
a61af66fc99e Initial load
duke
parents:
diff changeset
547
a61af66fc99e Initial load
duke
parents:
diff changeset
548
a61af66fc99e Initial load
duke
parents:
diff changeset
549 void Space::object_iterate_mem(MemRegion mr, UpwardsObjectClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
550 assert(!mr.is_empty(), "Should be non-empty");
a61af66fc99e Initial load
duke
parents:
diff changeset
551 // We use MemRegion(bottom(), end()) rather than used_region() below
a61af66fc99e Initial load
duke
parents:
diff changeset
552 // because the two are not necessarily equal for some kinds of
a61af66fc99e Initial load
duke
parents:
diff changeset
553 // spaces, in particular, certain kinds of free list spaces.
a61af66fc99e Initial load
duke
parents:
diff changeset
554 // We could use the more complicated but more precise:
a61af66fc99e Initial load
duke
parents:
diff changeset
555 // MemRegion(used_region().start(), round_to(used_region().end(), CardSize))
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // but the slight imprecision seems acceptable in the assertion check.
a61af66fc99e Initial load
duke
parents:
diff changeset
557 assert(MemRegion(bottom(), end()).contains(mr),
a61af66fc99e Initial load
duke
parents:
diff changeset
558 "Should be within used space");
a61af66fc99e Initial load
duke
parents:
diff changeset
559 HeapWord* prev = cl->previous(); // max address from last time
a61af66fc99e Initial load
duke
parents:
diff changeset
560 if (prev >= mr.end()) { // nothing to do
a61af66fc99e Initial load
duke
parents:
diff changeset
561 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
562 }
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // This assert will not work when we go from cms space to perm
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // space, and use same closure. Easy fix deferred for later. XXX YSR
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // assert(prev == NULL || contains(prev), "Should be within space");
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567 bool last_was_obj_array = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
568 HeapWord *blk_start_addr, *region_start_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
569 if (prev > mr.start()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
570 region_start_addr = prev;
a61af66fc99e Initial load
duke
parents:
diff changeset
571 blk_start_addr = prev;
518
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 517
diff changeset
572 // The previous invocation may have pushed "prev" beyond the
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 517
diff changeset
573 // last allocated block yet there may be still be blocks
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 517
diff changeset
574 // in this region due to a particular coalescing policy.
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 517
diff changeset
575 // Relax the assertion so that the case where the unallocated
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 517
diff changeset
576 // block is maintained and "prev" is beyond the unallocated
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 517
diff changeset
577 // block does not cause the assertion to fire.
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 517
diff changeset
578 assert((BlockOffsetArrayUseUnallocatedBlock &&
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 517
diff changeset
579 (!is_in(prev))) ||
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 517
diff changeset
580 (blk_start_addr == block_start(region_start_addr)), "invariant");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
581 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
582 region_start_addr = mr.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
583 blk_start_addr = block_start(region_start_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
584 }
a61af66fc99e Initial load
duke
parents:
diff changeset
585 HeapWord* region_end_addr = mr.end();
a61af66fc99e Initial load
duke
parents:
diff changeset
586 MemRegion derived_mr(region_start_addr, region_end_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
587 while (blk_start_addr < region_end_addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
588 const size_t size = block_size(blk_start_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
589 if (block_is_obj(blk_start_addr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
590 last_was_obj_array = cl->do_object_bm(oop(blk_start_addr), derived_mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
591 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
592 last_was_obj_array = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
594 blk_start_addr += size;
a61af66fc99e Initial load
duke
parents:
diff changeset
595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
596 if (!last_was_obj_array) {
a61af66fc99e Initial load
duke
parents:
diff changeset
597 assert((bottom() <= blk_start_addr) && (blk_start_addr <= end()),
a61af66fc99e Initial load
duke
parents:
diff changeset
598 "Should be within (closed) used space");
a61af66fc99e Initial load
duke
parents:
diff changeset
599 assert(blk_start_addr > prev, "Invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
600 cl->set_previous(blk_start_addr); // min address for next time
a61af66fc99e Initial load
duke
parents:
diff changeset
601 }
a61af66fc99e Initial load
duke
parents:
diff changeset
602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604 bool Space::obj_is_alive(const HeapWord* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
605 assert (block_is_obj(p), "The address should point to an object");
a61af66fc99e Initial load
duke
parents:
diff changeset
606 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
607 }
a61af66fc99e Initial load
duke
parents:
diff changeset
608
a61af66fc99e Initial load
duke
parents:
diff changeset
609 void ContiguousSpace::object_iterate_mem(MemRegion mr, UpwardsObjectClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
610 assert(!mr.is_empty(), "Should be non-empty");
a61af66fc99e Initial load
duke
parents:
diff changeset
611 assert(used_region().contains(mr), "Should be within used space");
a61af66fc99e Initial load
duke
parents:
diff changeset
612 HeapWord* prev = cl->previous(); // max address from last time
a61af66fc99e Initial load
duke
parents:
diff changeset
613 if (prev >= mr.end()) { // nothing to do
a61af66fc99e Initial load
duke
parents:
diff changeset
614 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
615 }
a61af66fc99e Initial load
duke
parents:
diff changeset
616 // See comment above (in more general method above) in case you
a61af66fc99e Initial load
duke
parents:
diff changeset
617 // happen to use this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
618 assert(prev == NULL || is_in_reserved(prev), "Should be within space");
a61af66fc99e Initial load
duke
parents:
diff changeset
619
a61af66fc99e Initial load
duke
parents:
diff changeset
620 bool last_was_obj_array = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
621 HeapWord *obj_start_addr, *region_start_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
622 if (prev > mr.start()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
623 region_start_addr = prev;
a61af66fc99e Initial load
duke
parents:
diff changeset
624 obj_start_addr = prev;
a61af66fc99e Initial load
duke
parents:
diff changeset
625 assert(obj_start_addr == block_start(region_start_addr), "invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
626 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
627 region_start_addr = mr.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
628 obj_start_addr = block_start(region_start_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
630 HeapWord* region_end_addr = mr.end();
a61af66fc99e Initial load
duke
parents:
diff changeset
631 MemRegion derived_mr(region_start_addr, region_end_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
632 while (obj_start_addr < region_end_addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
633 oop obj = oop(obj_start_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
634 const size_t size = obj->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
635 last_was_obj_array = cl->do_object_bm(obj, derived_mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
636 obj_start_addr += size;
a61af66fc99e Initial load
duke
parents:
diff changeset
637 }
a61af66fc99e Initial load
duke
parents:
diff changeset
638 if (!last_was_obj_array) {
a61af66fc99e Initial load
duke
parents:
diff changeset
639 assert((bottom() <= obj_start_addr) && (obj_start_addr <= end()),
a61af66fc99e Initial load
duke
parents:
diff changeset
640 "Should be within (closed) used space");
a61af66fc99e Initial load
duke
parents:
diff changeset
641 assert(obj_start_addr > prev, "Invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
642 cl->set_previous(obj_start_addr); // min address for next time
a61af66fc99e Initial load
duke
parents:
diff changeset
643 }
a61af66fc99e Initial load
duke
parents:
diff changeset
644 }
a61af66fc99e Initial load
duke
parents:
diff changeset
645
a61af66fc99e Initial load
duke
parents:
diff changeset
646 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
647 #define ContigSpace_PAR_OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
648 \
a61af66fc99e Initial load
duke
parents:
diff changeset
649 void ContiguousSpace::par_oop_iterate(MemRegion mr, OopClosureType* blk) {\
a61af66fc99e Initial load
duke
parents:
diff changeset
650 HeapWord* obj_addr = mr.start(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
651 HeapWord* t = mr.end(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
652 while (obj_addr < t) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
653 assert(oop(obj_addr)->is_oop(), "Should be an oop"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
654 obj_addr += oop(obj_addr)->oop_iterate(blk); \
a61af66fc99e Initial load
duke
parents:
diff changeset
655 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
656 }
a61af66fc99e Initial load
duke
parents:
diff changeset
657
a61af66fc99e Initial load
duke
parents:
diff changeset
658 ALL_PAR_OOP_ITERATE_CLOSURES(ContigSpace_PAR_OOP_ITERATE_DEFN)
a61af66fc99e Initial load
duke
parents:
diff changeset
659
a61af66fc99e Initial load
duke
parents:
diff changeset
660 #undef ContigSpace_PAR_OOP_ITERATE_DEFN
a61af66fc99e Initial load
duke
parents:
diff changeset
661 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
662
a61af66fc99e Initial load
duke
parents:
diff changeset
663 void ContiguousSpace::oop_iterate(OopClosure* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
664 if (is_empty()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
665 HeapWord* obj_addr = bottom();
a61af66fc99e Initial load
duke
parents:
diff changeset
666 HeapWord* t = top();
a61af66fc99e Initial load
duke
parents:
diff changeset
667 // Could call objects iterate, but this is easier.
a61af66fc99e Initial load
duke
parents:
diff changeset
668 while (obj_addr < t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
669 obj_addr += oop(obj_addr)->oop_iterate(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
670 }
a61af66fc99e Initial load
duke
parents:
diff changeset
671 }
a61af66fc99e Initial load
duke
parents:
diff changeset
672
a61af66fc99e Initial load
duke
parents:
diff changeset
673 void ContiguousSpace::oop_iterate(MemRegion mr, OopClosure* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
674 if (is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
675 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
676 }
a61af66fc99e Initial load
duke
parents:
diff changeset
677 MemRegion cur = MemRegion(bottom(), top());
a61af66fc99e Initial load
duke
parents:
diff changeset
678 mr = mr.intersection(cur);
a61af66fc99e Initial load
duke
parents:
diff changeset
679 if (mr.is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
680 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
681 }
a61af66fc99e Initial load
duke
parents:
diff changeset
682 if (mr.equals(cur)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
683 oop_iterate(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
684 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
686 assert(mr.end() <= top(), "just took an intersection above");
a61af66fc99e Initial load
duke
parents:
diff changeset
687 HeapWord* obj_addr = block_start(mr.start());
a61af66fc99e Initial load
duke
parents:
diff changeset
688 HeapWord* t = mr.end();
a61af66fc99e Initial load
duke
parents:
diff changeset
689
a61af66fc99e Initial load
duke
parents:
diff changeset
690 // Handle first object specially.
a61af66fc99e Initial load
duke
parents:
diff changeset
691 oop obj = oop(obj_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
692 SpaceMemRegionOopsIterClosure smr_blk(blk, mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
693 obj_addr += obj->oop_iterate(&smr_blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
694 while (obj_addr < t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
695 oop obj = oop(obj_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
696 assert(obj->is_oop(), "expected an oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
697 obj_addr += obj->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
698 // If "obj_addr" is not greater than top, then the
a61af66fc99e Initial load
duke
parents:
diff changeset
699 // entire object "obj" is within the region.
a61af66fc99e Initial load
duke
parents:
diff changeset
700 if (obj_addr <= t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
701 obj->oop_iterate(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
702 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
703 // "obj" extends beyond end of region
a61af66fc99e Initial load
duke
parents:
diff changeset
704 obj->oop_iterate(&smr_blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
705 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
706 }
a61af66fc99e Initial load
duke
parents:
diff changeset
707 };
a61af66fc99e Initial load
duke
parents:
diff changeset
708 }
a61af66fc99e Initial load
duke
parents:
diff changeset
709
a61af66fc99e Initial load
duke
parents:
diff changeset
710 void ContiguousSpace::object_iterate(ObjectClosure* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
711 if (is_empty()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
712 WaterMark bm = bottom_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
713 object_iterate_from(bm, blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
714 }
a61af66fc99e Initial load
duke
parents:
diff changeset
715
517
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 481
diff changeset
716 // For a continguous space object_iterate() and safe_object_iterate()
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 481
diff changeset
717 // are the same.
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 481
diff changeset
718 void ContiguousSpace::safe_object_iterate(ObjectClosure* blk) {
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 481
diff changeset
719 object_iterate(blk);
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 481
diff changeset
720 }
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 481
diff changeset
721
0
a61af66fc99e Initial load
duke
parents:
diff changeset
722 void ContiguousSpace::object_iterate_from(WaterMark mark, ObjectClosure* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
723 assert(mark.space() == this, "Mark does not match space");
a61af66fc99e Initial load
duke
parents:
diff changeset
724 HeapWord* p = mark.point();
a61af66fc99e Initial load
duke
parents:
diff changeset
725 while (p < top()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
726 blk->do_object(oop(p));
a61af66fc99e Initial load
duke
parents:
diff changeset
727 p += oop(p)->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
728 }
a61af66fc99e Initial load
duke
parents:
diff changeset
729 }
a61af66fc99e Initial load
duke
parents:
diff changeset
730
a61af66fc99e Initial load
duke
parents:
diff changeset
731 HeapWord*
a61af66fc99e Initial load
duke
parents:
diff changeset
732 ContiguousSpace::object_iterate_careful(ObjectClosureCareful* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
733 HeapWord * limit = concurrent_iteration_safe_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
734 assert(limit <= top(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
735 for (HeapWord* p = bottom(); p < limit;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
736 size_t size = blk->do_object_careful(oop(p));
a61af66fc99e Initial load
duke
parents:
diff changeset
737 if (size == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
738 return p; // failed at p
a61af66fc99e Initial load
duke
parents:
diff changeset
739 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
740 p += size;
a61af66fc99e Initial load
duke
parents:
diff changeset
741 }
a61af66fc99e Initial load
duke
parents:
diff changeset
742 }
a61af66fc99e Initial load
duke
parents:
diff changeset
743 return NULL; // all done
a61af66fc99e Initial load
duke
parents:
diff changeset
744 }
a61af66fc99e Initial load
duke
parents:
diff changeset
745
a61af66fc99e Initial load
duke
parents:
diff changeset
746 #define ContigSpace_OOP_SINCE_SAVE_MARKS_DEFN(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
747 \
a61af66fc99e Initial load
duke
parents:
diff changeset
748 void ContiguousSpace:: \
a61af66fc99e Initial load
duke
parents:
diff changeset
749 oop_since_save_marks_iterate##nv_suffix(OopClosureType* blk) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
750 HeapWord* t; \
a61af66fc99e Initial load
duke
parents:
diff changeset
751 HeapWord* p = saved_mark_word(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
752 assert(p != NULL, "expected saved mark"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
753 \
a61af66fc99e Initial load
duke
parents:
diff changeset
754 const intx interval = PrefetchScanIntervalInBytes; \
a61af66fc99e Initial load
duke
parents:
diff changeset
755 do { \
a61af66fc99e Initial load
duke
parents:
diff changeset
756 t = top(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
757 while (p < t) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
758 Prefetch::write(p, interval); \
a61af66fc99e Initial load
duke
parents:
diff changeset
759 debug_only(HeapWord* prev = p); \
a61af66fc99e Initial load
duke
parents:
diff changeset
760 oop m = oop(p); \
a61af66fc99e Initial load
duke
parents:
diff changeset
761 p += m->oop_iterate(blk); \
a61af66fc99e Initial load
duke
parents:
diff changeset
762 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
763 } while (t < top()); \
a61af66fc99e Initial load
duke
parents:
diff changeset
764 \
a61af66fc99e Initial load
duke
parents:
diff changeset
765 set_saved_mark_word(p); \
a61af66fc99e Initial load
duke
parents:
diff changeset
766 }
a61af66fc99e Initial load
duke
parents:
diff changeset
767
a61af66fc99e Initial load
duke
parents:
diff changeset
768 ALL_SINCE_SAVE_MARKS_CLOSURES(ContigSpace_OOP_SINCE_SAVE_MARKS_DEFN)
a61af66fc99e Initial load
duke
parents:
diff changeset
769
a61af66fc99e Initial load
duke
parents:
diff changeset
770 #undef ContigSpace_OOP_SINCE_SAVE_MARKS_DEFN
a61af66fc99e Initial load
duke
parents:
diff changeset
771
a61af66fc99e Initial load
duke
parents:
diff changeset
772 // Very general, slow implementation.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
773 HeapWord* ContiguousSpace::block_start_const(const void* p) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
774 assert(MemRegion(bottom(), end()).contains(p), "p not in space");
a61af66fc99e Initial load
duke
parents:
diff changeset
775 if (p >= top()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
776 return top();
a61af66fc99e Initial load
duke
parents:
diff changeset
777 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
778 HeapWord* last = bottom();
a61af66fc99e Initial load
duke
parents:
diff changeset
779 HeapWord* cur = last;
a61af66fc99e Initial load
duke
parents:
diff changeset
780 while (cur <= p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
781 last = cur;
a61af66fc99e Initial load
duke
parents:
diff changeset
782 cur += oop(cur)->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
783 }
a61af66fc99e Initial load
duke
parents:
diff changeset
784 assert(oop(last)->is_oop(), "Should be an object start");
a61af66fc99e Initial load
duke
parents:
diff changeset
785 return last;
a61af66fc99e Initial load
duke
parents:
diff changeset
786 }
a61af66fc99e Initial load
duke
parents:
diff changeset
787 }
a61af66fc99e Initial load
duke
parents:
diff changeset
788
a61af66fc99e Initial load
duke
parents:
diff changeset
789 size_t ContiguousSpace::block_size(const HeapWord* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
790 assert(MemRegion(bottom(), end()).contains(p), "p not in space");
a61af66fc99e Initial load
duke
parents:
diff changeset
791 HeapWord* current_top = top();
a61af66fc99e Initial load
duke
parents:
diff changeset
792 assert(p <= current_top, "p is not a block start");
a61af66fc99e Initial load
duke
parents:
diff changeset
793 assert(p == current_top || oop(p)->is_oop(), "p is not a block start");
a61af66fc99e Initial load
duke
parents:
diff changeset
794 if (p < current_top)
a61af66fc99e Initial load
duke
parents:
diff changeset
795 return oop(p)->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
796 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
797 assert(p == current_top, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
798 return pointer_delta(end(), (HeapWord*) p);
a61af66fc99e Initial load
duke
parents:
diff changeset
799 }
a61af66fc99e Initial load
duke
parents:
diff changeset
800 }
a61af66fc99e Initial load
duke
parents:
diff changeset
801
a61af66fc99e Initial load
duke
parents:
diff changeset
802 // This version requires locking.
a61af66fc99e Initial load
duke
parents:
diff changeset
803 inline HeapWord* ContiguousSpace::allocate_impl(size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
804 HeapWord* const end_value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
805 assert(Heap_lock->owned_by_self() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
806 (SafepointSynchronize::is_at_safepoint() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
807 Thread::current()->is_VM_thread()),
a61af66fc99e Initial load
duke
parents:
diff changeset
808 "not locked");
a61af66fc99e Initial load
duke
parents:
diff changeset
809 HeapWord* obj = top();
a61af66fc99e Initial load
duke
parents:
diff changeset
810 if (pointer_delta(end_value, obj) >= size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
811 HeapWord* new_top = obj + size;
a61af66fc99e Initial load
duke
parents:
diff changeset
812 set_top(new_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
813 assert(is_aligned(obj) && is_aligned(new_top), "checking alignment");
a61af66fc99e Initial load
duke
parents:
diff changeset
814 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
815 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
816 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
817 }
a61af66fc99e Initial load
duke
parents:
diff changeset
818 }
a61af66fc99e Initial load
duke
parents:
diff changeset
819
a61af66fc99e Initial load
duke
parents:
diff changeset
820 // This version is lock-free.
a61af66fc99e Initial load
duke
parents:
diff changeset
821 inline HeapWord* ContiguousSpace::par_allocate_impl(size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
822 HeapWord* const end_value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
823 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
824 HeapWord* obj = top();
a61af66fc99e Initial load
duke
parents:
diff changeset
825 if (pointer_delta(end_value, obj) >= size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
826 HeapWord* new_top = obj + size;
a61af66fc99e Initial load
duke
parents:
diff changeset
827 HeapWord* result = (HeapWord*)Atomic::cmpxchg_ptr(new_top, top_addr(), obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
828 // result can be one of two:
a61af66fc99e Initial load
duke
parents:
diff changeset
829 // the old top value: the exchange succeeded
a61af66fc99e Initial load
duke
parents:
diff changeset
830 // otherwise: the new value of the top is returned.
a61af66fc99e Initial load
duke
parents:
diff changeset
831 if (result == obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
832 assert(is_aligned(obj) && is_aligned(new_top), "checking alignment");
a61af66fc99e Initial load
duke
parents:
diff changeset
833 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
834 }
a61af66fc99e Initial load
duke
parents:
diff changeset
835 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
836 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
837 }
a61af66fc99e Initial load
duke
parents:
diff changeset
838 } while (true);
a61af66fc99e Initial load
duke
parents:
diff changeset
839 }
a61af66fc99e Initial load
duke
parents:
diff changeset
840
a61af66fc99e Initial load
duke
parents:
diff changeset
841 // Requires locking.
a61af66fc99e Initial load
duke
parents:
diff changeset
842 HeapWord* ContiguousSpace::allocate(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
843 return allocate_impl(size, end());
a61af66fc99e Initial load
duke
parents:
diff changeset
844 }
a61af66fc99e Initial load
duke
parents:
diff changeset
845
a61af66fc99e Initial load
duke
parents:
diff changeset
846 // Lock-free.
a61af66fc99e Initial load
duke
parents:
diff changeset
847 HeapWord* ContiguousSpace::par_allocate(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
848 return par_allocate_impl(size, end());
a61af66fc99e Initial load
duke
parents:
diff changeset
849 }
a61af66fc99e Initial load
duke
parents:
diff changeset
850
a61af66fc99e Initial load
duke
parents:
diff changeset
851 void ContiguousSpace::allocate_temporary_filler(int factor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
852 // allocate temporary type array decreasing free size with factor 'factor'
a61af66fc99e Initial load
duke
parents:
diff changeset
853 assert(factor >= 0, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
854 size_t size = pointer_delta(end(), top());
a61af66fc99e Initial load
duke
parents:
diff changeset
855
a61af66fc99e Initial load
duke
parents:
diff changeset
856 // if space is full, return
a61af66fc99e Initial load
duke
parents:
diff changeset
857 if (size == 0) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
858
a61af66fc99e Initial load
duke
parents:
diff changeset
859 if (factor > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
860 size -= size/factor;
a61af66fc99e Initial load
duke
parents:
diff changeset
861 }
a61af66fc99e Initial load
duke
parents:
diff changeset
862 size = align_object_size(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
863
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1142
diff changeset
864 const size_t array_header_size = typeArrayOopDesc::header_size(T_INT);
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1142
diff changeset
865 if (size >= (size_t)align_object_size(array_header_size)) {
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1142
diff changeset
866 size_t length = (size - array_header_size) * (HeapWordSize / sizeof(jint));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
867 // allocate uninitialized int array
a61af66fc99e Initial load
duke
parents:
diff changeset
868 typeArrayOop t = (typeArrayOop) allocate(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
869 assert(t != NULL, "allocation should succeed");
a61af66fc99e Initial load
duke
parents:
diff changeset
870 t->set_mark(markOopDesc::prototype());
a61af66fc99e Initial load
duke
parents:
diff changeset
871 t->set_klass(Universe::intArrayKlassObj());
a61af66fc99e Initial load
duke
parents:
diff changeset
872 t->set_length((int)length);
a61af66fc99e Initial load
duke
parents:
diff changeset
873 } else {
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1142
diff changeset
874 assert(size == CollectedHeap::min_fill_size(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
875 "size for smallest fake object doesn't match");
a61af66fc99e Initial load
duke
parents:
diff changeset
876 instanceOop obj = (instanceOop) allocate(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
877 obj->set_mark(markOopDesc::prototype());
167
feeb96a45707 6696264: assert("narrow oop can never be zero") for GCBasher & ParNewGC
coleenp
parents: 113
diff changeset
878 obj->set_klass_gap(0);
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 579
diff changeset
879 obj->set_klass(SystemDictionary::Object_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
880 }
a61af66fc99e Initial load
duke
parents:
diff changeset
881 }
a61af66fc99e Initial load
duke
parents:
diff changeset
882
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
883 void EdenSpace::clear(bool mangle_space) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
884 ContiguousSpace::clear(mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
885 set_soft_end(end());
a61af66fc99e Initial load
duke
parents:
diff changeset
886 }
a61af66fc99e Initial load
duke
parents:
diff changeset
887
a61af66fc99e Initial load
duke
parents:
diff changeset
888 // Requires locking.
a61af66fc99e Initial load
duke
parents:
diff changeset
889 HeapWord* EdenSpace::allocate(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
890 return allocate_impl(size, soft_end());
a61af66fc99e Initial load
duke
parents:
diff changeset
891 }
a61af66fc99e Initial load
duke
parents:
diff changeset
892
a61af66fc99e Initial load
duke
parents:
diff changeset
893 // Lock-free.
a61af66fc99e Initial load
duke
parents:
diff changeset
894 HeapWord* EdenSpace::par_allocate(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
895 return par_allocate_impl(size, soft_end());
a61af66fc99e Initial load
duke
parents:
diff changeset
896 }
a61af66fc99e Initial load
duke
parents:
diff changeset
897
a61af66fc99e Initial load
duke
parents:
diff changeset
898 HeapWord* ConcEdenSpace::par_allocate(size_t size)
a61af66fc99e Initial load
duke
parents:
diff changeset
899 {
a61af66fc99e Initial load
duke
parents:
diff changeset
900 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
901 // The invariant is top() should be read before end() because
a61af66fc99e Initial load
duke
parents:
diff changeset
902 // top() can't be greater than end(), so if an update of _soft_end
a61af66fc99e Initial load
duke
parents:
diff changeset
903 // occurs between 'end_val = end();' and 'top_val = top();' top()
a61af66fc99e Initial load
duke
parents:
diff changeset
904 // also can grow up to the new end() and the condition
a61af66fc99e Initial load
duke
parents:
diff changeset
905 // 'top_val > end_val' is true. To ensure the loading order
a61af66fc99e Initial load
duke
parents:
diff changeset
906 // OrderAccess::loadload() is required after top() read.
a61af66fc99e Initial load
duke
parents:
diff changeset
907 HeapWord* obj = top();
a61af66fc99e Initial load
duke
parents:
diff changeset
908 OrderAccess::loadload();
a61af66fc99e Initial load
duke
parents:
diff changeset
909 if (pointer_delta(*soft_end_addr(), obj) >= size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
910 HeapWord* new_top = obj + size;
a61af66fc99e Initial load
duke
parents:
diff changeset
911 HeapWord* result = (HeapWord*)Atomic::cmpxchg_ptr(new_top, top_addr(), obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
912 // result can be one of two:
a61af66fc99e Initial load
duke
parents:
diff changeset
913 // the old top value: the exchange succeeded
a61af66fc99e Initial load
duke
parents:
diff changeset
914 // otherwise: the new value of the top is returned.
a61af66fc99e Initial load
duke
parents:
diff changeset
915 if (result == obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
916 assert(is_aligned(obj) && is_aligned(new_top), "checking alignment");
a61af66fc99e Initial load
duke
parents:
diff changeset
917 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
918 }
a61af66fc99e Initial load
duke
parents:
diff changeset
919 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
920 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
921 }
a61af66fc99e Initial load
duke
parents:
diff changeset
922 } while (true);
a61af66fc99e Initial load
duke
parents:
diff changeset
923 }
a61af66fc99e Initial load
duke
parents:
diff changeset
924
a61af66fc99e Initial load
duke
parents:
diff changeset
925
a61af66fc99e Initial load
duke
parents:
diff changeset
926 HeapWord* OffsetTableContigSpace::initialize_threshold() {
a61af66fc99e Initial load
duke
parents:
diff changeset
927 return _offsets.initialize_threshold();
a61af66fc99e Initial load
duke
parents:
diff changeset
928 }
a61af66fc99e Initial load
duke
parents:
diff changeset
929
a61af66fc99e Initial load
duke
parents:
diff changeset
930 HeapWord* OffsetTableContigSpace::cross_threshold(HeapWord* start, HeapWord* end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
931 _offsets.alloc_block(start, end);
a61af66fc99e Initial load
duke
parents:
diff changeset
932 return _offsets.threshold();
a61af66fc99e Initial load
duke
parents:
diff changeset
933 }
a61af66fc99e Initial load
duke
parents:
diff changeset
934
a61af66fc99e Initial load
duke
parents:
diff changeset
935 OffsetTableContigSpace::OffsetTableContigSpace(BlockOffsetSharedArray* sharedOffsetArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
936 MemRegion mr) :
a61af66fc99e Initial load
duke
parents:
diff changeset
937 _offsets(sharedOffsetArray, mr),
a61af66fc99e Initial load
duke
parents:
diff changeset
938 _par_alloc_lock(Mutex::leaf, "OffsetTableContigSpace par alloc lock", true)
a61af66fc99e Initial load
duke
parents:
diff changeset
939 {
a61af66fc99e Initial load
duke
parents:
diff changeset
940 _offsets.set_contig_space(this);
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
941 initialize(mr, SpaceDecorator::Clear, SpaceDecorator::Mangle);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
942 }
a61af66fc99e Initial load
duke
parents:
diff changeset
943
a61af66fc99e Initial load
duke
parents:
diff changeset
944
a61af66fc99e Initial load
duke
parents:
diff changeset
945 class VerifyOldOopClosure : public OopClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
946 public:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
947 oop _the_obj;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
948 bool _allow_dirty;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
949 void do_oop(oop* p) {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
950 _the_obj->verify_old_oop(p, _allow_dirty);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
951 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
952 void do_oop(narrowOop* p) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
953 _the_obj->verify_old_oop(p, _allow_dirty);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
954 }
a61af66fc99e Initial load
duke
parents:
diff changeset
955 };
a61af66fc99e Initial load
duke
parents:
diff changeset
956
a61af66fc99e Initial load
duke
parents:
diff changeset
957 #define OBJ_SAMPLE_INTERVAL 0
a61af66fc99e Initial load
duke
parents:
diff changeset
958 #define BLOCK_SAMPLE_INTERVAL 100
a61af66fc99e Initial load
duke
parents:
diff changeset
959
a61af66fc99e Initial load
duke
parents:
diff changeset
960 void OffsetTableContigSpace::verify(bool allow_dirty) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
961 HeapWord* p = bottom();
a61af66fc99e Initial load
duke
parents:
diff changeset
962 HeapWord* prev_p = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
963 VerifyOldOopClosure blk; // Does this do anything?
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
964 blk._allow_dirty = allow_dirty;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
965 int objs = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
966 int blocks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
967
a61af66fc99e Initial load
duke
parents:
diff changeset
968 if (VerifyObjectStartArray) {
a61af66fc99e Initial load
duke
parents:
diff changeset
969 _offsets.verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
970 }
a61af66fc99e Initial load
duke
parents:
diff changeset
971
a61af66fc99e Initial load
duke
parents:
diff changeset
972 while (p < top()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
973 size_t size = oop(p)->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
974 // For a sampling of objects in the space, find it using the
a61af66fc99e Initial load
duke
parents:
diff changeset
975 // block offset table.
a61af66fc99e Initial load
duke
parents:
diff changeset
976 if (blocks == BLOCK_SAMPLE_INTERVAL) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
977 guarantee(p == block_start_const(p + (size/2)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
978 "check offset computation");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
979 blocks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
980 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
981 blocks++;
a61af66fc99e Initial load
duke
parents:
diff changeset
982 }
a61af66fc99e Initial load
duke
parents:
diff changeset
983
a61af66fc99e Initial load
duke
parents:
diff changeset
984 if (objs == OBJ_SAMPLE_INTERVAL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
985 oop(p)->verify();
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
986 blk._the_obj = oop(p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
987 oop(p)->oop_iterate(&blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
988 objs = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
989 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
990 objs++;
a61af66fc99e Initial load
duke
parents:
diff changeset
991 }
a61af66fc99e Initial load
duke
parents:
diff changeset
992 prev_p = p;
a61af66fc99e Initial load
duke
parents:
diff changeset
993 p += size;
a61af66fc99e Initial load
duke
parents:
diff changeset
994 }
a61af66fc99e Initial load
duke
parents:
diff changeset
995 guarantee(p == top(), "end of last object must match end of space");
a61af66fc99e Initial load
duke
parents:
diff changeset
996 }
a61af66fc99e Initial load
duke
parents:
diff changeset
997
a61af66fc99e Initial load
duke
parents:
diff changeset
998 void OffsetTableContigSpace::serialize_block_offset_array_offsets(
a61af66fc99e Initial load
duke
parents:
diff changeset
999 SerializeOopClosure* soc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 _offsets.serialize(soc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1002
a61af66fc99e Initial load
duke
parents:
diff changeset
1003
438
122d10c82f3f 6765804: GC "dead ratios" should be unsigned
jcoomes
parents: 356
diff changeset
1004 size_t TenuredSpace::allowed_dead_ratio() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 return MarkSweepDeadRatio;
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1007
a61af66fc99e Initial load
duke
parents:
diff changeset
1008
438
122d10c82f3f 6765804: GC "dead ratios" should be unsigned
jcoomes
parents: 356
diff changeset
1009 size_t ContigPermSpace::allowed_dead_ratio() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 return PermMarkSweepDeadRatio;
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 }