annotate src/share/vm/memory/space.cpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents ee019285a52c
children 7848fc12602b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17467
diff changeset
2 * Copyright (c) 1997, 2014, 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"
20317
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
31 #include "gc_interface/collectedHeap.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
32 #include "memory/blockOffsetTable.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
33 #include "memory/defNewGeneration.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
34 #include "memory/genCollectedHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
35 #include "memory/space.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
36 #include "memory/space.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
37 #include "memory/universe.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
38 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
39 #include "oops/oop.inline2.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
40 #include "runtime/java.hpp"
20198
c49dcaf78a65 8042737: Introduce umbrella header prefetch.inline.hpp
goetz
parents: 20197
diff changeset
41 #include "runtime/prefetch.inline.hpp"
20197
ce8f6bb717c9 8042195: Introduce umbrella header orderAccess.inline.hpp.
goetz
parents: 17937
diff changeset
42 #include "runtime/orderAccess.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
43 #include "runtime/safepoint.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
44 #include "utilities/copy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1579
diff changeset
45 #include "utilities/globalDefinitions.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7448
diff changeset
46 #include "utilities/macros.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
47
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17467
diff changeset
48 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17467
diff changeset
49
0
a61af66fc99e Initial load
duke
parents:
diff changeset
50 HeapWord* DirtyCardToOopClosure::get_actual_top(HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
51 HeapWord* top_obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
52 if (top_obj != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
53 if (_sp->block_is_obj(top_obj)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
54 if (_precision == CardTableModRefBS::ObjHeadPreciseArray) {
a61af66fc99e Initial load
duke
parents:
diff changeset
55 if (oop(top_obj)->is_objArray() || oop(top_obj)->is_typeArray()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // An arrayOop is starting on the dirty card - since we do exact
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // store checks for objArrays we are done.
a61af66fc99e Initial load
duke
parents:
diff changeset
58 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // Otherwise, it is possible that the object starting on the dirty
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // card spans the entire card, and that the store happened on a
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // later card. Figure out where the object ends.
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // Use the block_size() method of the space over which
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // the iteration is being done. That space (e.g. CMS) may have
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // specific requirements on object sizes which will
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // be reflected in the block_size() method.
a61af66fc99e Initial load
duke
parents:
diff changeset
66 top = top_obj + oop(top_obj)->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
67 }
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 top = top_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 }
a61af66fc99e Initial load
duke
parents:
diff changeset
72 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
73 assert(top == _sp->end(), "only case where top_obj == NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
74 }
a61af66fc99e Initial load
duke
parents:
diff changeset
75 return top;
a61af66fc99e Initial load
duke
parents:
diff changeset
76 }
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78 void DirtyCardToOopClosure::walk_mem_region(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
79 HeapWord* bottom,
a61af66fc99e Initial load
duke
parents:
diff changeset
80 HeapWord* top) {
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // 1. Blocks may or may not be objects.
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // 2. Even when a block_is_obj(), it may not entirely
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // occupy the block if the block quantum is larger than
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // the object size.
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // We can and should try to optimize by calling the non-MemRegion
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // version of oop_iterate() for all but the extremal objects
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // (for which we need to call the MemRegion version of
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // oop_iterate()) To be done post-beta XXX
a61af66fc99e Initial load
duke
parents:
diff changeset
89 for (; bottom < top; bottom += _sp->block_size(bottom)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // As in the case of contiguous space above, we'd like to
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // just use the value returned by oop_iterate to increment the
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // current pointer; unfortunately, that won't work in CMS because
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // we'd need an interface change (it seems) to have the space
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // "adjust the object size" (for instance pad it up to its
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // block alignment or minimum block size restrictions. XXX
a61af66fc99e Initial load
duke
parents:
diff changeset
96 if (_sp->block_is_obj(bottom) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
97 !_sp->obj_allocated_since_save_marks(oop(bottom))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
98 oop(bottom)->oop_iterate(_cl, mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 }
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
102
3357
fc2b798ab316 6883834: ParNew: assert(!_g->to()->is_in_reserved(obj),"Scanning field twice?") with LargeObjects tests
ysr
parents: 2433
diff changeset
103 // We get called with "mr" representing the dirty region
fc2b798ab316 6883834: ParNew: assert(!_g->to()->is_in_reserved(obj),"Scanning field twice?") with LargeObjects tests
ysr
parents: 2433
diff changeset
104 // that we want to process. Because of imprecise marking,
fc2b798ab316 6883834: ParNew: assert(!_g->to()->is_in_reserved(obj),"Scanning field twice?") with LargeObjects tests
ysr
parents: 2433
diff changeset
105 // we may need to extend the incoming "mr" to the right,
fc2b798ab316 6883834: ParNew: assert(!_g->to()->is_in_reserved(obj),"Scanning field twice?") with LargeObjects tests
ysr
parents: 2433
diff changeset
106 // and scan more. However, because we may already have
fc2b798ab316 6883834: ParNew: assert(!_g->to()->is_in_reserved(obj),"Scanning field twice?") with LargeObjects tests
ysr
parents: 2433
diff changeset
107 // scanned some of that extended region, we may need to
fc2b798ab316 6883834: ParNew: assert(!_g->to()->is_in_reserved(obj),"Scanning field twice?") with LargeObjects tests
ysr
parents: 2433
diff changeset
108 // trim its right-end back some so we do not scan what
fc2b798ab316 6883834: ParNew: assert(!_g->to()->is_in_reserved(obj),"Scanning field twice?") with LargeObjects tests
ysr
parents: 2433
diff changeset
109 // we (or another worker thread) may already have scanned
fc2b798ab316 6883834: ParNew: assert(!_g->to()->is_in_reserved(obj),"Scanning field twice?") with LargeObjects tests
ysr
parents: 2433
diff changeset
110 // or planning to scan.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
111 void DirtyCardToOopClosure::do_MemRegion(MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // Some collectors need to do special things whenever their dirty
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // cards are processed. For instance, CMS must remember mutator updates
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // (i.e. dirty cards) so as to re-scan mutated objects.
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // Such work can be piggy-backed here on dirty card scanning, so as to make
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // it slightly more efficient than doing a complete non-detructive pre-scan
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // of the card table.
a61af66fc99e Initial load
duke
parents:
diff changeset
119 MemRegionClosure* pCl = _sp->preconsumptionDirtyCardClosure();
a61af66fc99e Initial load
duke
parents:
diff changeset
120 if (pCl != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
121 pCl->do_MemRegion(mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 HeapWord* bottom = mr.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
125 HeapWord* last = mr.last();
a61af66fc99e Initial load
duke
parents:
diff changeset
126 HeapWord* top = mr.end();
a61af66fc99e Initial load
duke
parents:
diff changeset
127 HeapWord* bottom_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
128 HeapWord* top_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 assert(_precision == CardTableModRefBS::ObjHeadPreciseArray ||
a61af66fc99e Initial load
duke
parents:
diff changeset
131 _precision == CardTableModRefBS::Precise,
a61af66fc99e Initial load
duke
parents:
diff changeset
132 "Only ones we deal with for now.");
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 assert(_precision != CardTableModRefBS::ObjHeadPreciseArray ||
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
135 _cl->idempotent() || _last_bottom == NULL ||
0
a61af66fc99e Initial load
duke
parents:
diff changeset
136 top <= _last_bottom,
a61af66fc99e Initial load
duke
parents:
diff changeset
137 "Not decreasing");
a61af66fc99e Initial load
duke
parents:
diff changeset
138 NOT_PRODUCT(_last_bottom = mr.start());
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 bottom_obj = _sp->block_start(bottom);
a61af66fc99e Initial load
duke
parents:
diff changeset
141 top_obj = _sp->block_start(last);
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143 assert(bottom_obj <= bottom, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
144 assert(top_obj <= top, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // Given what we think is the top of the memory region and
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // the start of the object at the top, get the actual
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // value of the top.
a61af66fc99e Initial load
duke
parents:
diff changeset
149 top = get_actual_top(top, top_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // If the previous call did some part of this region, don't redo.
a61af66fc99e Initial load
duke
parents:
diff changeset
152 if (_precision == CardTableModRefBS::ObjHeadPreciseArray &&
a61af66fc99e Initial load
duke
parents:
diff changeset
153 _min_done != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
154 _min_done < top) {
a61af66fc99e Initial load
duke
parents:
diff changeset
155 top = _min_done;
a61af66fc99e Initial load
duke
parents:
diff changeset
156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // Top may have been reset, and in fact may be below bottom,
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // e.g. the dirty card region is entirely in a now free object
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // -- something that could happen with a concurrent sweeper.
a61af66fc99e Initial load
duke
parents:
diff changeset
161 bottom = MIN2(bottom, top);
3357
fc2b798ab316 6883834: ParNew: assert(!_g->to()->is_in_reserved(obj),"Scanning field twice?") with LargeObjects tests
ysr
parents: 2433
diff changeset
162 MemRegion extended_mr = MemRegion(bottom, top);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
163 assert(bottom <= top &&
a61af66fc99e Initial load
duke
parents:
diff changeset
164 (_precision != CardTableModRefBS::ObjHeadPreciseArray ||
a61af66fc99e Initial load
duke
parents:
diff changeset
165 _min_done == NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
166 top <= _min_done),
a61af66fc99e Initial load
duke
parents:
diff changeset
167 "overlap!");
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // Walk the region if it is not empty; otherwise there is nothing to do.
3357
fc2b798ab316 6883834: ParNew: assert(!_g->to()->is_in_reserved(obj),"Scanning field twice?") with LargeObjects tests
ysr
parents: 2433
diff changeset
170 if (!extended_mr.is_empty()) {
fc2b798ab316 6883834: ParNew: assert(!_g->to()->is_in_reserved(obj),"Scanning field twice?") with LargeObjects tests
ysr
parents: 2433
diff changeset
171 walk_mem_region(extended_mr, bottom_obj, top);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
173
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
174 // 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
175 // record a _min_done for it.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
176 if (!_cl->idempotent()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
177 _min_done = bottom;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
178 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
179 assert(_min_done == _last_explicit_min_done,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
180 "Don't update _min_done for idempotent cl");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
181 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
183
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6008
diff changeset
184 DirtyCardToOopClosure* Space::new_dcto_cl(ExtendedOopClosure* cl,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
185 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
186 HeapWord* boundary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
187 return new DirtyCardToOopClosure(this, cl, precision, boundary);
a61af66fc99e Initial load
duke
parents:
diff changeset
188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 HeapWord* ContiguousSpaceDCTOC::get_actual_top(HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
191 HeapWord* top_obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
192 if (top_obj != NULL && top_obj < (_sp->toContiguousSpace())->top()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
193 if (_precision == CardTableModRefBS::ObjHeadPreciseArray) {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 if (oop(top_obj)->is_objArray() || oop(top_obj)->is_typeArray()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // An arrayOop is starting on the dirty card - since we do exact
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // store checks for objArrays we are done.
a61af66fc99e Initial load
duke
parents:
diff changeset
197 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // Otherwise, it is possible that the object starting on the dirty
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // card spans the entire card, and that the store happened on a
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // later card. Figure out where the object ends.
a61af66fc99e Initial load
duke
parents:
diff changeset
201 assert(_sp->block_size(top_obj) == (size_t) oop(top_obj)->size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
202 "Block size and object size mismatch");
a61af66fc99e Initial load
duke
parents:
diff changeset
203 top = top_obj + oop(top_obj)->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
206 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 top = (_sp->toContiguousSpace())->top();
a61af66fc99e Initial load
duke
parents:
diff changeset
208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
209 return top;
a61af66fc99e Initial load
duke
parents:
diff changeset
210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212 void Filtering_DCTOC::walk_mem_region(MemRegion mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
213 HeapWord* bottom,
a61af66fc99e Initial load
duke
parents:
diff changeset
214 HeapWord* top) {
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // Note that this assumption won't hold if we have a concurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // collector in this space, which may have freed up objects after
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // they were dirtied and before the stop-the-world GC that is
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // examining cards here.
a61af66fc99e Initial load
duke
parents:
diff changeset
219 assert(bottom < top, "ought to be at least one obj on a dirty card.");
a61af66fc99e Initial load
duke
parents:
diff changeset
220
a61af66fc99e Initial load
duke
parents:
diff changeset
221 if (_boundary != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // We have a boundary outside of which we don't want to look
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // at objects, so create a filtering closure around the
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // oop closure before walking the region.
a61af66fc99e Initial load
duke
parents:
diff changeset
225 FilteringClosure filter(_boundary, _cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
226 walk_mem_region_with_cl(mr, bottom, top, &filter);
a61af66fc99e Initial load
duke
parents:
diff changeset
227 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // No boundary, simply walk the heap with the oop closure.
a61af66fc99e Initial load
duke
parents:
diff changeset
229 walk_mem_region_with_cl(mr, bottom, top, _cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232 }
a61af66fc99e Initial load
duke
parents:
diff changeset
233
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // We must replicate this so that the static type of "FilteringClosure"
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // (see above) is apparent at the oop_iterate calls.
a61af66fc99e Initial load
duke
parents:
diff changeset
236 #define ContiguousSpaceDCTOC__walk_mem_region_with_cl_DEFN(ClosureType) \
a61af66fc99e Initial load
duke
parents:
diff changeset
237 void ContiguousSpaceDCTOC::walk_mem_region_with_cl(MemRegion mr, \
a61af66fc99e Initial load
duke
parents:
diff changeset
238 HeapWord* bottom, \
a61af66fc99e Initial load
duke
parents:
diff changeset
239 HeapWord* top, \
a61af66fc99e Initial load
duke
parents:
diff changeset
240 ClosureType* cl) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
241 bottom += oop(bottom)->oop_iterate(cl, mr); \
a61af66fc99e Initial load
duke
parents:
diff changeset
242 if (bottom < top) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
243 HeapWord* next_obj = bottom + oop(bottom)->size(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
244 while (next_obj < top) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
245 /* Bottom lies entirely below top, so we can call the */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
246 /* non-memRegion version of oop_iterate below. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
247 oop(bottom)->oop_iterate(cl); \
a61af66fc99e Initial load
duke
parents:
diff changeset
248 bottom = next_obj; \
a61af66fc99e Initial load
duke
parents:
diff changeset
249 next_obj = bottom + oop(bottom)->size(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
250 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
251 /* Last object. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
252 oop(bottom)->oop_iterate(cl, mr); \
a61af66fc99e Initial load
duke
parents:
diff changeset
253 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // (There are only two of these, rather than N, because the split is due
a61af66fc99e Initial load
duke
parents:
diff changeset
257 // only to the introduction of the FilteringClosure, a local part of the
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // impl of this abstraction.)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6008
diff changeset
259 ContiguousSpaceDCTOC__walk_mem_region_with_cl_DEFN(ExtendedOopClosure)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
260 ContiguousSpaceDCTOC__walk_mem_region_with_cl_DEFN(FilteringClosure)
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 DirtyCardToOopClosure*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6008
diff changeset
263 ContiguousSpace::new_dcto_cl(ExtendedOopClosure* cl,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
264 CardTableModRefBS::PrecisionStyle precision,
a61af66fc99e Initial load
duke
parents:
diff changeset
265 HeapWord* boundary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
266 return new ContiguousSpaceDCTOC(this, cl, precision, boundary);
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
268
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
269 void Space::initialize(MemRegion mr,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
270 bool clear_space,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
271 bool mangle_space) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
272 HeapWord* bottom = mr.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
273 HeapWord* end = mr.end();
a61af66fc99e Initial load
duke
parents:
diff changeset
274 assert(Universe::on_page_boundary(bottom) && Universe::on_page_boundary(end),
a61af66fc99e Initial load
duke
parents:
diff changeset
275 "invalid space boundaries");
a61af66fc99e Initial load
duke
parents:
diff changeset
276 set_bottom(bottom);
a61af66fc99e Initial load
duke
parents:
diff changeset
277 set_end(end);
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
278 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
279 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
280
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
281 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
282 if (ZapUnusedHeapArea && mangle_space) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
283 mangle_unused_area();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
284 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
286
356
tonyp
parents: 347 269
diff changeset
287 ContiguousSpace::ContiguousSpace(): CompactibleSpace(), _top(NULL),
tonyp
parents: 347 269
diff changeset
288 _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
289 _mangler = new GenSpaceMangler(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
291
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
292 ContiguousSpace::~ContiguousSpace() {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
293 delete _mangler;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
294 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
295
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
296 void ContiguousSpace::initialize(MemRegion mr,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
297 bool clear_space,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
298 bool mangle_space)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
299 {
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
300 CompactibleSpace::initialize(mr, clear_space, mangle_space);
347
60fb9c4db4e6 6718086: CMS assert: _concurrent_iteration_safe_limit update missed
ysr
parents: 344
diff changeset
301 set_concurrent_iteration_safe_limit(top());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
303
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
304 void ContiguousSpace::clear(bool mangle_space) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
305 set_top(bottom());
a61af66fc99e Initial load
duke
parents:
diff changeset
306 set_saved_mark();
356
tonyp
parents: 347 269
diff changeset
307 CompactibleSpace::clear(mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 bool ContiguousSpace::is_free_block(const HeapWord* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
311 return p >= _top;
a61af66fc99e Initial load
duke
parents:
diff changeset
312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
313
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
314 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
315 ContiguousSpace::clear(mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
316 _offsets.initialize_threshold();
a61af66fc99e Initial load
duke
parents:
diff changeset
317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 void OffsetTableContigSpace::set_bottom(HeapWord* new_bottom) {
a61af66fc99e Initial load
duke
parents:
diff changeset
320 Space::set_bottom(new_bottom);
a61af66fc99e Initial load
duke
parents:
diff changeset
321 _offsets.set_bottom(new_bottom);
a61af66fc99e Initial load
duke
parents:
diff changeset
322 }
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 void OffsetTableContigSpace::set_end(HeapWord* new_end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // Space should not advertize an increase in size
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // until after the underlying offest table has been enlarged.
a61af66fc99e Initial load
duke
parents:
diff changeset
327 _offsets.resize(pointer_delta(new_end, bottom()));
a61af66fc99e Initial load
duke
parents:
diff changeset
328 Space::set_end(new_end);
a61af66fc99e Initial load
duke
parents:
diff changeset
329 }
a61af66fc99e Initial load
duke
parents:
diff changeset
330
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
331 #ifndef PRODUCT
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
332
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
333 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
334 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
335 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
336 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
337 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
338 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
339 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
340 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
341 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
342
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
343 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
344 mangler()->check_mangled_unused_area_complete();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
346
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
347 // 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
348 // 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
349 // mangled.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
350 void ContiguousSpace::mangle_unused_area() {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
351 mangler()->mangle_unused_area();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
352 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
353 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
354 mangler()->mangle_unused_area_complete();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
355 }
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
356 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
357 // 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
358 // 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
359 // 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
360 // bounds checking is appropriate.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
361 MemRegion space_mr(bottom(), end());
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
362 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
363 SpaceMangler::mangle_region(mr);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
364 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
365 #endif // NOT_PRODUCT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
366
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
367 void CompactibleSpace::initialize(MemRegion mr,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
368 bool clear_space,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
369 bool mangle_space) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
370 Space::initialize(mr, clear_space, mangle_space);
356
tonyp
parents: 347 269
diff changeset
371 set_compaction_top(bottom());
tonyp
parents: 347 269
diff changeset
372 _next_compaction_space = NULL;
tonyp
parents: 347 269
diff changeset
373 }
tonyp
parents: 347 269
diff changeset
374
tonyp
parents: 347 269
diff changeset
375 void CompactibleSpace::clear(bool mangle_space) {
tonyp
parents: 347 269
diff changeset
376 Space::clear(mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
377 _compaction_top = bottom();
a61af66fc99e Initial load
duke
parents:
diff changeset
378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
379
a61af66fc99e Initial load
duke
parents:
diff changeset
380 HeapWord* CompactibleSpace::forward(oop q, size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
381 CompactPoint* cp, HeapWord* compact_top) {
a61af66fc99e Initial load
duke
parents:
diff changeset
382 // q is alive
a61af66fc99e Initial load
duke
parents:
diff changeset
383 // First check if we should switch compaction space
a61af66fc99e Initial load
duke
parents:
diff changeset
384 assert(this == cp->space, "'this' should be current compaction space.");
a61af66fc99e Initial load
duke
parents:
diff changeset
385 size_t compaction_max_size = pointer_delta(end(), compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
386 while (size > compaction_max_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // switch to next compaction space
a61af66fc99e Initial load
duke
parents:
diff changeset
388 cp->space->set_compaction_top(compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
389 cp->space = cp->space->next_compaction_space();
a61af66fc99e Initial load
duke
parents:
diff changeset
390 if (cp->space == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
391 cp->gen = GenCollectedHeap::heap()->prev_gen(cp->gen);
a61af66fc99e Initial load
duke
parents:
diff changeset
392 assert(cp->gen != NULL, "compaction must succeed");
a61af66fc99e Initial load
duke
parents:
diff changeset
393 cp->space = cp->gen->first_compaction_space();
a61af66fc99e Initial load
duke
parents:
diff changeset
394 assert(cp->space != NULL, "generation must have a first compaction space");
a61af66fc99e Initial load
duke
parents:
diff changeset
395 }
a61af66fc99e Initial load
duke
parents:
diff changeset
396 compact_top = cp->space->bottom();
a61af66fc99e Initial load
duke
parents:
diff changeset
397 cp->space->set_compaction_top(compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
398 cp->threshold = cp->space->initialize_threshold();
a61af66fc99e Initial load
duke
parents:
diff changeset
399 compaction_max_size = pointer_delta(cp->space->end(), compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
400 }
a61af66fc99e Initial load
duke
parents:
diff changeset
401
a61af66fc99e Initial load
duke
parents:
diff changeset
402 // store the forwarding pointer into the mark word
a61af66fc99e Initial load
duke
parents:
diff changeset
403 if ((HeapWord*)q != compact_top) {
a61af66fc99e Initial load
duke
parents:
diff changeset
404 q->forward_to(oop(compact_top));
a61af66fc99e Initial load
duke
parents:
diff changeset
405 assert(q->is_gc_marked(), "encoding the pointer should preserve the mark");
a61af66fc99e Initial load
duke
parents:
diff changeset
406 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
407 // if the object isn't moving we can just set the mark to the default
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // mark and handle it specially later on.
a61af66fc99e Initial load
duke
parents:
diff changeset
409 q->init_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
410 assert(q->forwardee() == NULL, "should be forwarded to NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
411 }
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 compact_top += size;
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // we need to update the offset table so that the beginnings of objects can be
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // found during scavenge. Note that we are updating the offset table based on
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // where the object will be once the compaction phase finishes.
a61af66fc99e Initial load
duke
parents:
diff changeset
418 if (compact_top > cp->threshold)
a61af66fc99e Initial load
duke
parents:
diff changeset
419 cp->threshold =
a61af66fc99e Initial load
duke
parents:
diff changeset
420 cp->space->cross_threshold(compact_top - size, compact_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
421 return compact_top;
a61af66fc99e Initial load
duke
parents:
diff changeset
422 }
a61af66fc99e Initial load
duke
parents:
diff changeset
423
a61af66fc99e Initial load
duke
parents:
diff changeset
424
a61af66fc99e Initial load
duke
parents:
diff changeset
425 bool CompactibleSpace::insert_deadspace(size_t& allowed_deadspace_words,
a61af66fc99e Initial load
duke
parents:
diff changeset
426 HeapWord* q, size_t deadlength) {
a61af66fc99e Initial load
duke
parents:
diff changeset
427 if (allowed_deadspace_words >= deadlength) {
a61af66fc99e Initial load
duke
parents:
diff changeset
428 allowed_deadspace_words -= deadlength;
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 438
diff changeset
429 CollectedHeap::fill_with_object(q, deadlength);
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 438
diff changeset
430 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
431 assert((int) deadlength == oop(q)->size(), "bad filler object size");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
432 // Recall that we required "q == compaction_top".
a61af66fc99e Initial load
duke
parents:
diff changeset
433 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
434 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
435 allowed_deadspace_words = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
436 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
437 }
a61af66fc99e Initial load
duke
parents:
diff changeset
438 }
a61af66fc99e Initial load
duke
parents:
diff changeset
439
a61af66fc99e Initial load
duke
parents:
diff changeset
440 #define block_is_always_obj(q) true
a61af66fc99e Initial load
duke
parents:
diff changeset
441 #define obj_size(q) oop(q)->size()
a61af66fc99e Initial load
duke
parents:
diff changeset
442 #define adjust_obj_size(s) s
a61af66fc99e Initial load
duke
parents:
diff changeset
443
a61af66fc99e Initial load
duke
parents:
diff changeset
444 void CompactibleSpace::prepare_for_compaction(CompactPoint* cp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
445 SCAN_AND_FORWARD(cp, end, block_is_obj, block_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
446 }
a61af66fc99e Initial load
duke
parents:
diff changeset
447
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // Faster object search.
a61af66fc99e Initial load
duke
parents:
diff changeset
449 void ContiguousSpace::prepare_for_compaction(CompactPoint* cp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
450 SCAN_AND_FORWARD(cp, top, block_is_always_obj, obj_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
451 }
a61af66fc99e Initial load
duke
parents:
diff changeset
452
a61af66fc99e Initial load
duke
parents:
diff changeset
453 void Space::adjust_pointers() {
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // adjust all the interior pointers to point at the new locations of objects
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // Used by MarkSweep::mark_sweep_phase3()
a61af66fc99e Initial load
duke
parents:
diff changeset
456
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // First check to see if there is any work to be done.
a61af66fc99e Initial load
duke
parents:
diff changeset
458 if (used() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
459 return; // Nothing to do.
a61af66fc99e Initial load
duke
parents:
diff changeset
460 }
a61af66fc99e Initial load
duke
parents:
diff changeset
461
a61af66fc99e Initial load
duke
parents:
diff changeset
462 // Otherwise...
a61af66fc99e Initial load
duke
parents:
diff changeset
463 HeapWord* q = bottom();
a61af66fc99e Initial load
duke
parents:
diff changeset
464 HeapWord* t = end();
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466 debug_only(HeapWord* prev_q = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
467 while (q < t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
468 if (oop(q)->is_gc_marked()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // q is alive
a61af66fc99e Initial load
duke
parents:
diff changeset
470
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();
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474 debug_only(prev_q = q);
a61af66fc99e Initial load
duke
parents:
diff changeset
475
a61af66fc99e Initial load
duke
parents:
diff changeset
476 q += size;
a61af66fc99e Initial load
duke
parents:
diff changeset
477 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
478 // q is not a live object. But we're not in a compactible space,
a61af66fc99e Initial load
duke
parents:
diff changeset
479 // So we don't have live ranges.
a61af66fc99e Initial load
duke
parents:
diff changeset
480 debug_only(prev_q = q);
a61af66fc99e Initial load
duke
parents:
diff changeset
481 q += block_size(q);
a61af66fc99e Initial load
duke
parents:
diff changeset
482 assert(q > prev_q, "we should be moving forward through memory");
a61af66fc99e Initial load
duke
parents:
diff changeset
483 }
a61af66fc99e Initial load
duke
parents:
diff changeset
484 }
a61af66fc99e Initial load
duke
parents:
diff changeset
485 assert(q == t, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
486 }
a61af66fc99e Initial load
duke
parents:
diff changeset
487
a61af66fc99e Initial load
duke
parents:
diff changeset
488 void CompactibleSpace::adjust_pointers() {
a61af66fc99e Initial load
duke
parents:
diff changeset
489 // Check first is there is any work to do.
a61af66fc99e Initial load
duke
parents:
diff changeset
490 if (used() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
491 return; // Nothing to do.
a61af66fc99e Initial load
duke
parents:
diff changeset
492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
493
a61af66fc99e Initial load
duke
parents:
diff changeset
494 SCAN_AND_ADJUST_POINTERS(adjust_obj_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
495 }
a61af66fc99e Initial load
duke
parents:
diff changeset
496
a61af66fc99e Initial load
duke
parents:
diff changeset
497 void CompactibleSpace::compact() {
a61af66fc99e Initial load
duke
parents:
diff changeset
498 SCAN_AND_COMPACT(obj_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
499 }
a61af66fc99e Initial load
duke
parents:
diff changeset
500
a61af66fc99e Initial load
duke
parents:
diff changeset
501 void Space::print_short() const { print_short_on(tty); }
a61af66fc99e Initial load
duke
parents:
diff changeset
502
a61af66fc99e Initial load
duke
parents:
diff changeset
503 void Space::print_short_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
504 st->print(" space " SIZE_FORMAT "K, %3d%% used", capacity() / K,
a61af66fc99e Initial load
duke
parents:
diff changeset
505 (int) ((double) used() * 100 / capacity()));
a61af66fc99e Initial load
duke
parents:
diff changeset
506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 void Space::print() const { print_on(tty); }
a61af66fc99e Initial load
duke
parents:
diff changeset
509
a61af66fc99e Initial load
duke
parents:
diff changeset
510 void Space::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
511 print_short_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
512 st->print_cr(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ")",
a61af66fc99e Initial load
duke
parents:
diff changeset
513 bottom(), end());
a61af66fc99e Initial load
duke
parents:
diff changeset
514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516 void ContiguousSpace::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
517 print_short_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
518 st->print_cr(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", " INTPTR_FORMAT ")",
a61af66fc99e Initial load
duke
parents:
diff changeset
519 bottom(), top(), end());
a61af66fc99e Initial load
duke
parents:
diff changeset
520 }
a61af66fc99e Initial load
duke
parents:
diff changeset
521
a61af66fc99e Initial load
duke
parents:
diff changeset
522 void OffsetTableContigSpace::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
523 print_short_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
524 st->print_cr(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", "
a61af66fc99e Initial load
duke
parents:
diff changeset
525 INTPTR_FORMAT ", " INTPTR_FORMAT ")",
a61af66fc99e Initial load
duke
parents:
diff changeset
526 bottom(), top(), _offsets.threshold(), end());
a61af66fc99e Initial load
duke
parents:
diff changeset
527 }
a61af66fc99e Initial load
duke
parents:
diff changeset
528
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 4708
diff changeset
529 void ContiguousSpace::verify() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
530 HeapWord* p = bottom();
a61af66fc99e Initial load
duke
parents:
diff changeset
531 HeapWord* t = top();
a61af66fc99e Initial load
duke
parents:
diff changeset
532 HeapWord* prev_p = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
533 while (p < t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
534 oop(p)->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
535 prev_p = p;
a61af66fc99e Initial load
duke
parents:
diff changeset
536 p += oop(p)->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
537 }
a61af66fc99e Initial load
duke
parents:
diff changeset
538 guarantee(p == top(), "end of last object must match end of space");
a61af66fc99e Initial load
duke
parents:
diff changeset
539 if (top() != end()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
540 guarantee(top() == block_start_const(end()-1) &&
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
541 top() == block_start_const(top()),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
542 "top should be start of unallocated block, if it exists");
a61af66fc99e Initial load
duke
parents:
diff changeset
543 }
a61af66fc99e Initial load
duke
parents:
diff changeset
544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
545
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6008
diff changeset
546 void Space::oop_iterate(ExtendedOopClosure* blk) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
547 ObjectToOopClosure blk2(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
548 object_iterate(&blk2);
a61af66fc99e Initial load
duke
parents:
diff changeset
549 }
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551 bool Space::obj_is_alive(const HeapWord* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
552 assert (block_is_obj(p), "The address should point to an object");
a61af66fc99e Initial load
duke
parents:
diff changeset
553 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
554 }
a61af66fc99e Initial load
duke
parents:
diff changeset
555
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7448
diff changeset
556 #if INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
557 #define ContigSpace_PAR_OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
558 \
a61af66fc99e Initial load
duke
parents:
diff changeset
559 void ContiguousSpace::par_oop_iterate(MemRegion mr, OopClosureType* blk) {\
a61af66fc99e Initial load
duke
parents:
diff changeset
560 HeapWord* obj_addr = mr.start(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
561 HeapWord* t = mr.end(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
562 while (obj_addr < t) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
563 assert(oop(obj_addr)->is_oop(), "Should be an oop"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
564 obj_addr += oop(obj_addr)->oop_iterate(blk); \
a61af66fc99e Initial load
duke
parents:
diff changeset
565 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
566 }
a61af66fc99e Initial load
duke
parents:
diff changeset
567
a61af66fc99e Initial load
duke
parents:
diff changeset
568 ALL_PAR_OOP_ITERATE_CLOSURES(ContigSpace_PAR_OOP_ITERATE_DEFN)
a61af66fc99e Initial load
duke
parents:
diff changeset
569
a61af66fc99e Initial load
duke
parents:
diff changeset
570 #undef ContigSpace_PAR_OOP_ITERATE_DEFN
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7448
diff changeset
571 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
572
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6008
diff changeset
573 void ContiguousSpace::oop_iterate(ExtendedOopClosure* blk) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
574 if (is_empty()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
575 HeapWord* obj_addr = bottom();
a61af66fc99e Initial load
duke
parents:
diff changeset
576 HeapWord* t = top();
a61af66fc99e Initial load
duke
parents:
diff changeset
577 // Could call objects iterate, but this is easier.
a61af66fc99e Initial load
duke
parents:
diff changeset
578 while (obj_addr < t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
579 obj_addr += oop(obj_addr)->oop_iterate(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
580 }
a61af66fc99e Initial load
duke
parents:
diff changeset
581 }
a61af66fc99e Initial load
duke
parents:
diff changeset
582
a61af66fc99e Initial load
duke
parents:
diff changeset
583 void ContiguousSpace::object_iterate(ObjectClosure* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
584 if (is_empty()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
585 WaterMark bm = bottom_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
586 object_iterate_from(bm, blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
587 }
a61af66fc99e Initial load
duke
parents:
diff changeset
588
517
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 481
diff changeset
589 // 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
590 // are the same.
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 481
diff changeset
591 void ContiguousSpace::safe_object_iterate(ObjectClosure* blk) {
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 481
diff changeset
592 object_iterate(blk);
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 481
diff changeset
593 }
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 481
diff changeset
594
0
a61af66fc99e Initial load
duke
parents:
diff changeset
595 void ContiguousSpace::object_iterate_from(WaterMark mark, ObjectClosure* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
596 assert(mark.space() == this, "Mark does not match space");
a61af66fc99e Initial load
duke
parents:
diff changeset
597 HeapWord* p = mark.point();
a61af66fc99e Initial load
duke
parents:
diff changeset
598 while (p < top()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
599 blk->do_object(oop(p));
a61af66fc99e Initial load
duke
parents:
diff changeset
600 p += oop(p)->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
601 }
a61af66fc99e Initial load
duke
parents:
diff changeset
602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604 HeapWord*
a61af66fc99e Initial load
duke
parents:
diff changeset
605 ContiguousSpace::object_iterate_careful(ObjectClosureCareful* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
606 HeapWord * limit = concurrent_iteration_safe_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
607 assert(limit <= top(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
608 for (HeapWord* p = bottom(); p < limit;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
609 size_t size = blk->do_object_careful(oop(p));
a61af66fc99e Initial load
duke
parents:
diff changeset
610 if (size == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
611 return p; // failed at p
a61af66fc99e Initial load
duke
parents:
diff changeset
612 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
613 p += size;
a61af66fc99e Initial load
duke
parents:
diff changeset
614 }
a61af66fc99e Initial load
duke
parents:
diff changeset
615 }
a61af66fc99e Initial load
duke
parents:
diff changeset
616 return NULL; // all done
a61af66fc99e Initial load
duke
parents:
diff changeset
617 }
a61af66fc99e Initial load
duke
parents:
diff changeset
618
a61af66fc99e Initial load
duke
parents:
diff changeset
619 #define ContigSpace_OOP_SINCE_SAVE_MARKS_DEFN(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
620 \
a61af66fc99e Initial load
duke
parents:
diff changeset
621 void ContiguousSpace:: \
a61af66fc99e Initial load
duke
parents:
diff changeset
622 oop_since_save_marks_iterate##nv_suffix(OopClosureType* blk) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
623 HeapWord* t; \
a61af66fc99e Initial load
duke
parents:
diff changeset
624 HeapWord* p = saved_mark_word(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
625 assert(p != NULL, "expected saved mark"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
626 \
a61af66fc99e Initial load
duke
parents:
diff changeset
627 const intx interval = PrefetchScanIntervalInBytes; \
a61af66fc99e Initial load
duke
parents:
diff changeset
628 do { \
a61af66fc99e Initial load
duke
parents:
diff changeset
629 t = top(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
630 while (p < t) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
631 Prefetch::write(p, interval); \
a61af66fc99e Initial load
duke
parents:
diff changeset
632 debug_only(HeapWord* prev = p); \
a61af66fc99e Initial load
duke
parents:
diff changeset
633 oop m = oop(p); \
a61af66fc99e Initial load
duke
parents:
diff changeset
634 p += m->oop_iterate(blk); \
a61af66fc99e Initial load
duke
parents:
diff changeset
635 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
636 } while (t < top()); \
a61af66fc99e Initial load
duke
parents:
diff changeset
637 \
a61af66fc99e Initial load
duke
parents:
diff changeset
638 set_saved_mark_word(p); \
a61af66fc99e Initial load
duke
parents:
diff changeset
639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
640
a61af66fc99e Initial load
duke
parents:
diff changeset
641 ALL_SINCE_SAVE_MARKS_CLOSURES(ContigSpace_OOP_SINCE_SAVE_MARKS_DEFN)
a61af66fc99e Initial load
duke
parents:
diff changeset
642
a61af66fc99e Initial load
duke
parents:
diff changeset
643 #undef ContigSpace_OOP_SINCE_SAVE_MARKS_DEFN
a61af66fc99e Initial load
duke
parents:
diff changeset
644
a61af66fc99e Initial load
duke
parents:
diff changeset
645 // Very general, slow implementation.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
646 HeapWord* ContiguousSpace::block_start_const(const void* p) const {
7181
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
647 assert(MemRegion(bottom(), end()).contains(p),
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
648 err_msg("p (" PTR_FORMAT ") not in space [" PTR_FORMAT ", " PTR_FORMAT ")",
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
649 p, bottom(), end()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
650 if (p >= top()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
651 return top();
a61af66fc99e Initial load
duke
parents:
diff changeset
652 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
653 HeapWord* last = bottom();
a61af66fc99e Initial load
duke
parents:
diff changeset
654 HeapWord* cur = last;
a61af66fc99e Initial load
duke
parents:
diff changeset
655 while (cur <= p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
656 last = cur;
a61af66fc99e Initial load
duke
parents:
diff changeset
657 cur += oop(cur)->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
658 }
7181
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
659 assert(oop(last)->is_oop(),
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
660 err_msg(PTR_FORMAT " should be an object start", last));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
661 return last;
a61af66fc99e Initial load
duke
parents:
diff changeset
662 }
a61af66fc99e Initial load
duke
parents:
diff changeset
663 }
a61af66fc99e Initial load
duke
parents:
diff changeset
664
a61af66fc99e Initial load
duke
parents:
diff changeset
665 size_t ContiguousSpace::block_size(const HeapWord* p) const {
7181
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
666 assert(MemRegion(bottom(), end()).contains(p),
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
667 err_msg("p (" PTR_FORMAT ") not in space [" PTR_FORMAT ", " PTR_FORMAT ")",
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
668 p, bottom(), end()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
669 HeapWord* current_top = top();
7181
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
670 assert(p <= current_top,
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
671 err_msg("p > current top - p: " PTR_FORMAT ", current top: " PTR_FORMAT,
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
672 p, current_top));
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
673 assert(p == current_top || oop(p)->is_oop(),
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
674 err_msg("p (" PTR_FORMAT ") is not a block start - "
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
675 "current_top: " PTR_FORMAT ", is_oop: %s",
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
676 p, current_top, BOOL_TO_STR(oop(p)->is_oop())));
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
677 if (p < current_top) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
678 return oop(p)->size();
7181
2fc0334f613a 7194633: G1: Assertion and guarantee failures in block offset table
johnc
parents: 6725
diff changeset
679 } else {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
680 assert(p == current_top, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
681 return pointer_delta(end(), (HeapWord*) p);
a61af66fc99e Initial load
duke
parents:
diff changeset
682 }
a61af66fc99e Initial load
duke
parents:
diff changeset
683 }
a61af66fc99e Initial load
duke
parents:
diff changeset
684
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // This version requires locking.
a61af66fc99e Initial load
duke
parents:
diff changeset
686 inline HeapWord* ContiguousSpace::allocate_impl(size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
687 HeapWord* const end_value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
688 assert(Heap_lock->owned_by_self() ||
20276
1526a938e670 8047818: G1 HeapRegions can no longer be ContiguousSpaces
mgerdin
parents: 20267
diff changeset
689 (SafepointSynchronize::is_at_safepoint() && Thread::current()->is_VM_thread()),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
690 "not locked");
a61af66fc99e Initial load
duke
parents:
diff changeset
691 HeapWord* obj = top();
a61af66fc99e Initial load
duke
parents:
diff changeset
692 if (pointer_delta(end_value, obj) >= size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
693 HeapWord* new_top = obj + size;
a61af66fc99e Initial load
duke
parents:
diff changeset
694 set_top(new_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
695 assert(is_aligned(obj) && is_aligned(new_top), "checking alignment");
a61af66fc99e Initial load
duke
parents:
diff changeset
696 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
697 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
698 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
699 }
a61af66fc99e Initial load
duke
parents:
diff changeset
700 }
a61af66fc99e Initial load
duke
parents:
diff changeset
701
a61af66fc99e Initial load
duke
parents:
diff changeset
702 // This version is lock-free.
a61af66fc99e Initial load
duke
parents:
diff changeset
703 inline HeapWord* ContiguousSpace::par_allocate_impl(size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
704 HeapWord* const end_value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
705 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
706 HeapWord* obj = top();
a61af66fc99e Initial load
duke
parents:
diff changeset
707 if (pointer_delta(end_value, obj) >= size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
708 HeapWord* new_top = obj + size;
a61af66fc99e Initial load
duke
parents:
diff changeset
709 HeapWord* result = (HeapWord*)Atomic::cmpxchg_ptr(new_top, top_addr(), obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
710 // result can be one of two:
a61af66fc99e Initial load
duke
parents:
diff changeset
711 // the old top value: the exchange succeeded
a61af66fc99e Initial load
duke
parents:
diff changeset
712 // otherwise: the new value of the top is returned.
a61af66fc99e Initial load
duke
parents:
diff changeset
713 if (result == obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
714 assert(is_aligned(obj) && is_aligned(new_top), "checking alignment");
a61af66fc99e Initial load
duke
parents:
diff changeset
715 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
716 }
a61af66fc99e Initial load
duke
parents:
diff changeset
717 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
718 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
719 }
a61af66fc99e Initial load
duke
parents:
diff changeset
720 } while (true);
a61af66fc99e Initial load
duke
parents:
diff changeset
721 }
a61af66fc99e Initial load
duke
parents:
diff changeset
722
20317
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
723 HeapWord* ContiguousSpace::allocate_aligned(size_t size) {
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
724 assert(Heap_lock->owned_by_self() || (SafepointSynchronize::is_at_safepoint() && Thread::current()->is_VM_thread()), "not locked");
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
725 HeapWord* end_value = end();
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
726
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
727 HeapWord* obj = CollectedHeap::align_allocation_or_fail(top(), end_value, SurvivorAlignmentInBytes);
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
728 if (obj == NULL) {
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
729 return NULL;
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
730 }
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
731
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
732 if (pointer_delta(end_value, obj) >= size) {
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
733 HeapWord* new_top = obj + size;
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
734 set_top(new_top);
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
735 assert(is_ptr_aligned(obj, SurvivorAlignmentInBytes) && is_aligned(new_top),
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
736 "checking alignment");
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
737 return obj;
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
738 } else {
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
739 set_top(obj);
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
740 return NULL;
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
741 }
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
742 }
ee019285a52c 8031323: Optionally align objects copied to survivor spaces
jmasa
parents: 20276
diff changeset
743
0
a61af66fc99e Initial load
duke
parents:
diff changeset
744 // Requires locking.
a61af66fc99e Initial load
duke
parents:
diff changeset
745 HeapWord* ContiguousSpace::allocate(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
746 return allocate_impl(size, end());
a61af66fc99e Initial load
duke
parents:
diff changeset
747 }
a61af66fc99e Initial load
duke
parents:
diff changeset
748
a61af66fc99e Initial load
duke
parents:
diff changeset
749 // Lock-free.
a61af66fc99e Initial load
duke
parents:
diff changeset
750 HeapWord* ContiguousSpace::par_allocate(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
751 return par_allocate_impl(size, end());
a61af66fc99e Initial load
duke
parents:
diff changeset
752 }
a61af66fc99e Initial load
duke
parents:
diff changeset
753
a61af66fc99e Initial load
duke
parents:
diff changeset
754 void ContiguousSpace::allocate_temporary_filler(int factor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
755 // allocate temporary type array decreasing free size with factor 'factor'
a61af66fc99e Initial load
duke
parents:
diff changeset
756 assert(factor >= 0, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
757 size_t size = pointer_delta(end(), top());
a61af66fc99e Initial load
duke
parents:
diff changeset
758
a61af66fc99e Initial load
duke
parents:
diff changeset
759 // if space is full, return
a61af66fc99e Initial load
duke
parents:
diff changeset
760 if (size == 0) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
761
a61af66fc99e Initial load
duke
parents:
diff changeset
762 if (factor > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
763 size -= size/factor;
a61af66fc99e Initial load
duke
parents:
diff changeset
764 }
a61af66fc99e Initial load
duke
parents:
diff changeset
765 size = align_object_size(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
766
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1142
diff changeset
767 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
768 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
769 size_t length = (size - array_header_size) * (HeapWordSize / sizeof(jint));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
770 // allocate uninitialized int array
a61af66fc99e Initial load
duke
parents:
diff changeset
771 typeArrayOop t = (typeArrayOop) allocate(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
772 assert(t != NULL, "allocation should succeed");
a61af66fc99e Initial load
duke
parents:
diff changeset
773 t->set_mark(markOopDesc::prototype());
a61af66fc99e Initial load
duke
parents:
diff changeset
774 t->set_klass(Universe::intArrayKlassObj());
a61af66fc99e Initial load
duke
parents:
diff changeset
775 t->set_length((int)length);
a61af66fc99e Initial load
duke
parents:
diff changeset
776 } else {
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1142
diff changeset
777 assert(size == CollectedHeap::min_fill_size(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
778 "size for smallest fake object doesn't match");
a61af66fc99e Initial load
duke
parents:
diff changeset
779 instanceOop obj = (instanceOop) allocate(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
780 obj->set_mark(markOopDesc::prototype());
167
feeb96a45707 6696264: assert("narrow oop can never be zero") for GCBasher & ParNewGC
coleenp
parents: 113
diff changeset
781 obj->set_klass_gap(0);
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 579
diff changeset
782 obj->set_klass(SystemDictionary::Object_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
783 }
a61af66fc99e Initial load
duke
parents:
diff changeset
784 }
a61af66fc99e Initial load
duke
parents:
diff changeset
785
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 167
diff changeset
786 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
787 ContiguousSpace::clear(mangle_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
788 set_soft_end(end());
a61af66fc99e Initial load
duke
parents:
diff changeset
789 }
a61af66fc99e Initial load
duke
parents:
diff changeset
790
a61af66fc99e Initial load
duke
parents:
diff changeset
791 // Requires locking.
a61af66fc99e Initial load
duke
parents:
diff changeset
792 HeapWord* EdenSpace::allocate(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
793 return allocate_impl(size, soft_end());
a61af66fc99e Initial load
duke
parents:
diff changeset
794 }
a61af66fc99e Initial load
duke
parents:
diff changeset
795
a61af66fc99e Initial load
duke
parents:
diff changeset
796 // Lock-free.
a61af66fc99e Initial load
duke
parents:
diff changeset
797 HeapWord* EdenSpace::par_allocate(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
798 return par_allocate_impl(size, soft_end());
a61af66fc99e Initial load
duke
parents:
diff changeset
799 }
a61af66fc99e Initial load
duke
parents:
diff changeset
800
a61af66fc99e Initial load
duke
parents:
diff changeset
801 HeapWord* ConcEdenSpace::par_allocate(size_t size)
a61af66fc99e Initial load
duke
parents:
diff changeset
802 {
a61af66fc99e Initial load
duke
parents:
diff changeset
803 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
804 // The invariant is top() should be read before end() because
a61af66fc99e Initial load
duke
parents:
diff changeset
805 // top() can't be greater than end(), so if an update of _soft_end
a61af66fc99e Initial load
duke
parents:
diff changeset
806 // occurs between 'end_val = end();' and 'top_val = top();' top()
a61af66fc99e Initial load
duke
parents:
diff changeset
807 // also can grow up to the new end() and the condition
a61af66fc99e Initial load
duke
parents:
diff changeset
808 // 'top_val > end_val' is true. To ensure the loading order
a61af66fc99e Initial load
duke
parents:
diff changeset
809 // OrderAccess::loadload() is required after top() read.
a61af66fc99e Initial load
duke
parents:
diff changeset
810 HeapWord* obj = top();
a61af66fc99e Initial load
duke
parents:
diff changeset
811 OrderAccess::loadload();
a61af66fc99e Initial load
duke
parents:
diff changeset
812 if (pointer_delta(*soft_end_addr(), obj) >= size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
813 HeapWord* new_top = obj + size;
a61af66fc99e Initial load
duke
parents:
diff changeset
814 HeapWord* result = (HeapWord*)Atomic::cmpxchg_ptr(new_top, top_addr(), obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
815 // result can be one of two:
a61af66fc99e Initial load
duke
parents:
diff changeset
816 // the old top value: the exchange succeeded
a61af66fc99e Initial load
duke
parents:
diff changeset
817 // otherwise: the new value of the top is returned.
a61af66fc99e Initial load
duke
parents:
diff changeset
818 if (result == obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
819 assert(is_aligned(obj) && is_aligned(new_top), "checking alignment");
a61af66fc99e Initial load
duke
parents:
diff changeset
820 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
821 }
a61af66fc99e Initial load
duke
parents:
diff changeset
822 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
823 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
824 }
a61af66fc99e Initial load
duke
parents:
diff changeset
825 } while (true);
a61af66fc99e Initial load
duke
parents:
diff changeset
826 }
a61af66fc99e Initial load
duke
parents:
diff changeset
827
a61af66fc99e Initial load
duke
parents:
diff changeset
828
a61af66fc99e Initial load
duke
parents:
diff changeset
829 HeapWord* OffsetTableContigSpace::initialize_threshold() {
a61af66fc99e Initial load
duke
parents:
diff changeset
830 return _offsets.initialize_threshold();
a61af66fc99e Initial load
duke
parents:
diff changeset
831 }
a61af66fc99e Initial load
duke
parents:
diff changeset
832
a61af66fc99e Initial load
duke
parents:
diff changeset
833 HeapWord* OffsetTableContigSpace::cross_threshold(HeapWord* start, HeapWord* end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
834 _offsets.alloc_block(start, end);
a61af66fc99e Initial load
duke
parents:
diff changeset
835 return _offsets.threshold();
a61af66fc99e Initial load
duke
parents:
diff changeset
836 }
a61af66fc99e Initial load
duke
parents:
diff changeset
837
a61af66fc99e Initial load
duke
parents:
diff changeset
838 OffsetTableContigSpace::OffsetTableContigSpace(BlockOffsetSharedArray* sharedOffsetArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
839 MemRegion mr) :
a61af66fc99e Initial load
duke
parents:
diff changeset
840 _offsets(sharedOffsetArray, mr),
a61af66fc99e Initial load
duke
parents:
diff changeset
841 _par_alloc_lock(Mutex::leaf, "OffsetTableContigSpace par alloc lock", true)
a61af66fc99e Initial load
duke
parents:
diff changeset
842 {
a61af66fc99e Initial load
duke
parents:
diff changeset
843 _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
844 initialize(mr, SpaceDecorator::Clear, SpaceDecorator::Mangle);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
845 }
a61af66fc99e Initial load
duke
parents:
diff changeset
846
a61af66fc99e Initial load
duke
parents:
diff changeset
847 #define OBJ_SAMPLE_INTERVAL 0
a61af66fc99e Initial load
duke
parents:
diff changeset
848 #define BLOCK_SAMPLE_INTERVAL 100
a61af66fc99e Initial load
duke
parents:
diff changeset
849
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 4708
diff changeset
850 void OffsetTableContigSpace::verify() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
851 HeapWord* p = bottom();
a61af66fc99e Initial load
duke
parents:
diff changeset
852 HeapWord* prev_p = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
853 int objs = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
854 int blocks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
855
a61af66fc99e Initial load
duke
parents:
diff changeset
856 if (VerifyObjectStartArray) {
a61af66fc99e Initial load
duke
parents:
diff changeset
857 _offsets.verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
858 }
a61af66fc99e Initial load
duke
parents:
diff changeset
859
a61af66fc99e Initial load
duke
parents:
diff changeset
860 while (p < top()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
861 size_t size = oop(p)->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
862 // For a sampling of objects in the space, find it using the
a61af66fc99e Initial load
duke
parents:
diff changeset
863 // block offset table.
a61af66fc99e Initial load
duke
parents:
diff changeset
864 if (blocks == BLOCK_SAMPLE_INTERVAL) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
865 guarantee(p == block_start_const(p + (size/2)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
866 "check offset computation");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
867 blocks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
868 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
869 blocks++;
a61af66fc99e Initial load
duke
parents:
diff changeset
870 }
a61af66fc99e Initial load
duke
parents:
diff changeset
871
a61af66fc99e Initial load
duke
parents:
diff changeset
872 if (objs == OBJ_SAMPLE_INTERVAL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
873 oop(p)->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
874 objs = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
875 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
876 objs++;
a61af66fc99e Initial load
duke
parents:
diff changeset
877 }
a61af66fc99e Initial load
duke
parents:
diff changeset
878 prev_p = p;
a61af66fc99e Initial load
duke
parents:
diff changeset
879 p += size;
a61af66fc99e Initial load
duke
parents:
diff changeset
880 }
a61af66fc99e Initial load
duke
parents:
diff changeset
881 guarantee(p == top(), "end of last object must match end of space");
a61af66fc99e Initial load
duke
parents:
diff changeset
882 }
a61af66fc99e Initial load
duke
parents:
diff changeset
883
a61af66fc99e Initial load
duke
parents:
diff changeset
884
438
122d10c82f3f 6765804: GC "dead ratios" should be unsigned
jcoomes
parents: 356
diff changeset
885 size_t TenuredSpace::allowed_dead_ratio() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
886 return MarkSweepDeadRatio;
a61af66fc99e Initial load
duke
parents:
diff changeset
887 }