annotate src/share/vm/memory/space.cpp @ 2368:dde920245681

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