annotate src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.inline.hpp @ 94:0834225a7916

6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction Summary: The option CMSInitiatingPermOccupancyFraction now controls perm triggering threshold. Even though the actual value of the threshold has not yet been changed, so there is no change in policy, we now have the infrastructure in place for dynamically deciding when to collect the perm gen, an issue that will be addressed in the near future. Reviewed-by: jmasa
author ysr
date Sun, 16 Mar 2008 21:57:25 -0700
parents a61af66fc99e
children d1605aabd0a1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
2 * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved.
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 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 inline void CMSBitMap::clear_all() {
a61af66fc99e Initial load
duke
parents:
diff changeset
26 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // CMS bitmaps are usually cover large memory regions
a61af66fc99e Initial load
duke
parents:
diff changeset
28 _bm.clear_large();
a61af66fc99e Initial load
duke
parents:
diff changeset
29 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
30 }
a61af66fc99e Initial load
duke
parents:
diff changeset
31
a61af66fc99e Initial load
duke
parents:
diff changeset
32 inline size_t CMSBitMap::heapWordToOffset(HeapWord* addr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
33 return (pointer_delta(addr, _bmStartWord)) >> _shifter;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 }
a61af66fc99e Initial load
duke
parents:
diff changeset
35
a61af66fc99e Initial load
duke
parents:
diff changeset
36 inline HeapWord* CMSBitMap::offsetToHeapWord(size_t offset) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
37 return _bmStartWord + (offset << _shifter);
a61af66fc99e Initial load
duke
parents:
diff changeset
38 }
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40 inline size_t CMSBitMap::heapWordDiffToOffsetDiff(size_t diff) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
41 assert((diff & ((1 << _shifter) - 1)) == 0, "argument check");
a61af66fc99e Initial load
duke
parents:
diff changeset
42 return diff >> _shifter;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 }
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 inline void CMSBitMap::mark(HeapWord* addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
46 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
47 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
a61af66fc99e Initial load
duke
parents:
diff changeset
48 "outside underlying space?");
a61af66fc99e Initial load
duke
parents:
diff changeset
49 _bm.set_bit(heapWordToOffset(addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
50 }
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52 inline bool CMSBitMap::par_mark(HeapWord* addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
53 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
54 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
a61af66fc99e Initial load
duke
parents:
diff changeset
55 "outside underlying space?");
a61af66fc99e Initial load
duke
parents:
diff changeset
56 return _bm.par_at_put(heapWordToOffset(addr), true);
a61af66fc99e Initial load
duke
parents:
diff changeset
57 }
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 inline void CMSBitMap::par_clear(HeapWord* addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
60 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
61 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
a61af66fc99e Initial load
duke
parents:
diff changeset
62 "outside underlying space?");
a61af66fc99e Initial load
duke
parents:
diff changeset
63 _bm.par_at_put(heapWordToOffset(addr), false);
a61af66fc99e Initial load
duke
parents:
diff changeset
64 }
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 inline void CMSBitMap::mark_range(MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
67 NOT_PRODUCT(region_invariant(mr));
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // Range size is usually just 1 bit.
a61af66fc99e Initial load
duke
parents:
diff changeset
69 _bm.set_range(heapWordToOffset(mr.start()), heapWordToOffset(mr.end()),
a61af66fc99e Initial load
duke
parents:
diff changeset
70 BitMap::small_range);
a61af66fc99e Initial load
duke
parents:
diff changeset
71 }
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 inline void CMSBitMap::clear_range(MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
74 NOT_PRODUCT(region_invariant(mr));
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // Range size is usually just 1 bit.
a61af66fc99e Initial load
duke
parents:
diff changeset
76 _bm.clear_range(heapWordToOffset(mr.start()), heapWordToOffset(mr.end()),
a61af66fc99e Initial load
duke
parents:
diff changeset
77 BitMap::small_range);
a61af66fc99e Initial load
duke
parents:
diff changeset
78 }
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 inline void CMSBitMap::par_mark_range(MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
81 NOT_PRODUCT(region_invariant(mr));
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // Range size is usually just 1 bit.
a61af66fc99e Initial load
duke
parents:
diff changeset
83 _bm.par_set_range(heapWordToOffset(mr.start()), heapWordToOffset(mr.end()),
a61af66fc99e Initial load
duke
parents:
diff changeset
84 BitMap::small_range);
a61af66fc99e Initial load
duke
parents:
diff changeset
85 }
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 inline void CMSBitMap::par_clear_range(MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
88 NOT_PRODUCT(region_invariant(mr));
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // Range size is usually just 1 bit.
a61af66fc99e Initial load
duke
parents:
diff changeset
90 _bm.par_clear_range(heapWordToOffset(mr.start()), heapWordToOffset(mr.end()),
a61af66fc99e Initial load
duke
parents:
diff changeset
91 BitMap::small_range);
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 inline void CMSBitMap::mark_large_range(MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
95 NOT_PRODUCT(region_invariant(mr));
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // Range size must be greater than 32 bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
97 _bm.set_range(heapWordToOffset(mr.start()), heapWordToOffset(mr.end()),
a61af66fc99e Initial load
duke
parents:
diff changeset
98 BitMap::large_range);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 }
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 inline void CMSBitMap::clear_large_range(MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 NOT_PRODUCT(region_invariant(mr));
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // Range size must be greater than 32 bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
104 _bm.clear_range(heapWordToOffset(mr.start()), heapWordToOffset(mr.end()),
a61af66fc99e Initial load
duke
parents:
diff changeset
105 BitMap::large_range);
a61af66fc99e Initial load
duke
parents:
diff changeset
106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 inline void CMSBitMap::par_mark_large_range(MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
109 NOT_PRODUCT(region_invariant(mr));
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // Range size must be greater than 32 bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
111 _bm.par_set_range(heapWordToOffset(mr.start()), heapWordToOffset(mr.end()),
a61af66fc99e Initial load
duke
parents:
diff changeset
112 BitMap::large_range);
a61af66fc99e Initial load
duke
parents:
diff changeset
113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 inline void CMSBitMap::par_clear_large_range(MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 NOT_PRODUCT(region_invariant(mr));
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // Range size must be greater than 32 bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
118 _bm.par_clear_range(heapWordToOffset(mr.start()), heapWordToOffset(mr.end()),
a61af66fc99e Initial load
duke
parents:
diff changeset
119 BitMap::large_range);
a61af66fc99e Initial load
duke
parents:
diff changeset
120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // Starting at "addr" (inclusive) return a memory region
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // corresponding to the first maximally contiguous marked ("1") region.
a61af66fc99e Initial load
duke
parents:
diff changeset
124 inline MemRegion CMSBitMap::getAndClearMarkedRegion(HeapWord* addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
125 return getAndClearMarkedRegion(addr, endWord());
a61af66fc99e Initial load
duke
parents:
diff changeset
126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // Starting at "start_addr" (inclusive) return a memory region
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // corresponding to the first maximal contiguous marked ("1") region
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // strictly less than end_addr.
a61af66fc99e Initial load
duke
parents:
diff changeset
131 inline MemRegion CMSBitMap::getAndClearMarkedRegion(HeapWord* start_addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
132 HeapWord* end_addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
133 HeapWord *start, *end;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
135 start = getNextMarkedWordAddress (start_addr, end_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
136 end = getNextUnmarkedWordAddress(start, end_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
137 assert(start <= end, "Consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
138 MemRegion mr(start, end);
a61af66fc99e Initial load
duke
parents:
diff changeset
139 if (!mr.is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
140 clear_range(mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
142 return mr;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 inline bool CMSBitMap::isMarked(HeapWord* addr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
146 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
147 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
a61af66fc99e Initial load
duke
parents:
diff changeset
148 "outside underlying space?");
a61af66fc99e Initial load
duke
parents:
diff changeset
149 return _bm.at(heapWordToOffset(addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // The same as isMarked() but without a lock check.
a61af66fc99e Initial load
duke
parents:
diff changeset
153 inline bool CMSBitMap::par_isMarked(HeapWord* addr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
154 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
a61af66fc99e Initial load
duke
parents:
diff changeset
155 "outside underlying space?");
a61af66fc99e Initial load
duke
parents:
diff changeset
156 return _bm.at(heapWordToOffset(addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
158
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 inline bool CMSBitMap::isUnmarked(HeapWord* addr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
161 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
162 assert(_bmStartWord <= addr && addr < (_bmStartWord + _bmWordSize),
a61af66fc99e Initial load
duke
parents:
diff changeset
163 "outside underlying space?");
a61af66fc99e Initial load
duke
parents:
diff changeset
164 return !_bm.at(heapWordToOffset(addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // Return the HeapWord address corresponding to next "1" bit
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // (inclusive).
a61af66fc99e Initial load
duke
parents:
diff changeset
169 inline HeapWord* CMSBitMap::getNextMarkedWordAddress(HeapWord* addr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
170 return getNextMarkedWordAddress(addr, endWord());
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // Return the least HeapWord address corresponding to next "1" bit
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // starting at start_addr (inclusive) but strictly less than end_addr.
a61af66fc99e Initial load
duke
parents:
diff changeset
175 inline HeapWord* CMSBitMap::getNextMarkedWordAddress(
a61af66fc99e Initial load
duke
parents:
diff changeset
176 HeapWord* start_addr, HeapWord* end_addr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
177 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
178 size_t nextOffset = _bm.get_next_one_offset(
a61af66fc99e Initial load
duke
parents:
diff changeset
179 heapWordToOffset(start_addr),
a61af66fc99e Initial load
duke
parents:
diff changeset
180 heapWordToOffset(end_addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
181 HeapWord* nextAddr = offsetToHeapWord(nextOffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
182 assert(nextAddr >= start_addr &&
a61af66fc99e Initial load
duke
parents:
diff changeset
183 nextAddr <= end_addr, "get_next_one postcondition");
a61af66fc99e Initial load
duke
parents:
diff changeset
184 assert((nextAddr == end_addr) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
185 isMarked(nextAddr), "get_next_one postcondition");
a61af66fc99e Initial load
duke
parents:
diff changeset
186 return nextAddr;
a61af66fc99e Initial load
duke
parents:
diff changeset
187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // Return the HeapWord address corrsponding to the next "0" bit
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // (inclusive).
a61af66fc99e Initial load
duke
parents:
diff changeset
192 inline HeapWord* CMSBitMap::getNextUnmarkedWordAddress(HeapWord* addr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
193 return getNextUnmarkedWordAddress(addr, endWord());
a61af66fc99e Initial load
duke
parents:
diff changeset
194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // Return the HeapWord address corrsponding to the next "0" bit
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // (inclusive).
a61af66fc99e Initial load
duke
parents:
diff changeset
198 inline HeapWord* CMSBitMap::getNextUnmarkedWordAddress(
a61af66fc99e Initial load
duke
parents:
diff changeset
199 HeapWord* start_addr, HeapWord* end_addr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
200 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
201 size_t nextOffset = _bm.get_next_zero_offset(
a61af66fc99e Initial load
duke
parents:
diff changeset
202 heapWordToOffset(start_addr),
a61af66fc99e Initial load
duke
parents:
diff changeset
203 heapWordToOffset(end_addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
204 HeapWord* nextAddr = offsetToHeapWord(nextOffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
205 assert(nextAddr >= start_addr &&
a61af66fc99e Initial load
duke
parents:
diff changeset
206 nextAddr <= end_addr, "get_next_zero postcondition");
a61af66fc99e Initial load
duke
parents:
diff changeset
207 assert((nextAddr == end_addr) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
208 isUnmarked(nextAddr), "get_next_zero postcondition");
a61af66fc99e Initial load
duke
parents:
diff changeset
209 return nextAddr;
a61af66fc99e Initial load
duke
parents:
diff changeset
210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212 inline bool CMSBitMap::isAllClear() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
213 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
214 return getNextMarkedWordAddress(startWord()) >= endWord();
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 inline void CMSBitMap::iterate(BitMapClosure* cl, HeapWord* left,
a61af66fc99e Initial load
duke
parents:
diff changeset
218 HeapWord* right) {
a61af66fc99e Initial load
duke
parents:
diff changeset
219 assert_locked();
a61af66fc99e Initial load
duke
parents:
diff changeset
220 left = MAX2(_bmStartWord, left);
a61af66fc99e Initial load
duke
parents:
diff changeset
221 right = MIN2(_bmStartWord + _bmWordSize, right);
a61af66fc99e Initial load
duke
parents:
diff changeset
222 if (right > left) {
a61af66fc99e Initial load
duke
parents:
diff changeset
223 _bm.iterate(cl, heapWordToOffset(left), heapWordToOffset(right));
a61af66fc99e Initial load
duke
parents:
diff changeset
224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
225 }
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227 inline void CMSCollector::start_icms() {
a61af66fc99e Initial load
duke
parents:
diff changeset
228 if (CMSIncrementalMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
229 ConcurrentMarkSweepThread::start_icms();
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 inline void CMSCollector::stop_icms() {
a61af66fc99e Initial load
duke
parents:
diff changeset
234 if (CMSIncrementalMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
235 ConcurrentMarkSweepThread::stop_icms();
a61af66fc99e Initial load
duke
parents:
diff changeset
236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 inline void CMSCollector::disable_icms() {
a61af66fc99e Initial load
duke
parents:
diff changeset
240 if (CMSIncrementalMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
241 ConcurrentMarkSweepThread::disable_icms();
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 inline void CMSCollector::enable_icms() {
a61af66fc99e Initial load
duke
parents:
diff changeset
246 if (CMSIncrementalMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
247 ConcurrentMarkSweepThread::enable_icms();
a61af66fc99e Initial load
duke
parents:
diff changeset
248 }
a61af66fc99e Initial load
duke
parents:
diff changeset
249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 inline void CMSCollector::icms_wait() {
a61af66fc99e Initial load
duke
parents:
diff changeset
252 if (CMSIncrementalMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 cmsThread()->icms_wait();
a61af66fc99e Initial load
duke
parents:
diff changeset
254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 inline void CMSCollector::save_sweep_limits() {
a61af66fc99e Initial load
duke
parents:
diff changeset
258 _cmsGen->save_sweep_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
259 _permGen->save_sweep_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
260 }
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 inline bool CMSCollector::is_dead_obj(oop obj) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
263 HeapWord* addr = (HeapWord*)obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 assert((_cmsGen->cmsSpace()->is_in_reserved(addr)
a61af66fc99e Initial load
duke
parents:
diff changeset
265 && _cmsGen->cmsSpace()->block_is_obj(addr))
a61af66fc99e Initial load
duke
parents:
diff changeset
266 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
267 (_permGen->cmsSpace()->is_in_reserved(addr)
a61af66fc99e Initial load
duke
parents:
diff changeset
268 && _permGen->cmsSpace()->block_is_obj(addr)),
a61af66fc99e Initial load
duke
parents:
diff changeset
269 "must be object");
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
270 return should_unload_classes() &&
0
a61af66fc99e Initial load
duke
parents:
diff changeset
271 _collectorState == Sweeping &&
a61af66fc99e Initial load
duke
parents:
diff changeset
272 !_markBitMap.isMarked(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275 inline bool CMSCollector::should_abort_preclean() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // We are in the midst of an "abortable preclean" and either
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // scavenge is done or foreground GC wants to take over collection
a61af66fc99e Initial load
duke
parents:
diff changeset
278 return _collectorState == AbortablePreclean &&
a61af66fc99e Initial load
duke
parents:
diff changeset
279 (_abort_preclean || _foregroundGCIsActive ||
a61af66fc99e Initial load
duke
parents:
diff changeset
280 GenCollectedHeap::heap()->incremental_collection_will_fail());
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283 inline size_t CMSCollector::get_eden_used() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
284 return _young_gen->as_DefNewGeneration()->eden()->used();
a61af66fc99e Initial load
duke
parents:
diff changeset
285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287 inline size_t CMSCollector::get_eden_capacity() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
288 return _young_gen->as_DefNewGeneration()->eden()->capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
290
a61af66fc99e Initial load
duke
parents:
diff changeset
291 inline bool CMSStats::valid() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
292 return _valid_bits == _ALL_VALID;
a61af66fc99e Initial load
duke
parents:
diff changeset
293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 inline void CMSStats::record_gc0_begin() {
a61af66fc99e Initial load
duke
parents:
diff changeset
296 if (_gc0_begin_time.is_updated()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
297 float last_gc0_period = _gc0_begin_time.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
298 _gc0_period = AdaptiveWeightedAverage::exp_avg(_gc0_period,
a61af66fc99e Initial load
duke
parents:
diff changeset
299 last_gc0_period, _gc0_alpha);
a61af66fc99e Initial load
duke
parents:
diff changeset
300 _gc0_alpha = _saved_alpha;
a61af66fc99e Initial load
duke
parents:
diff changeset
301 _valid_bits |= _GC0_VALID;
a61af66fc99e Initial load
duke
parents:
diff changeset
302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
303 _cms_used_at_gc0_begin = _cms_gen->cmsSpace()->used();
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305 _gc0_begin_time.update();
a61af66fc99e Initial load
duke
parents:
diff changeset
306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
307
a61af66fc99e Initial load
duke
parents:
diff changeset
308 inline void CMSStats::record_gc0_end(size_t cms_gen_bytes_used) {
a61af66fc99e Initial load
duke
parents:
diff changeset
309 float last_gc0_duration = _gc0_begin_time.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
310 _gc0_duration = AdaptiveWeightedAverage::exp_avg(_gc0_duration,
a61af66fc99e Initial load
duke
parents:
diff changeset
311 last_gc0_duration, _gc0_alpha);
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 // Amount promoted.
a61af66fc99e Initial load
duke
parents:
diff changeset
314 _cms_used_at_gc0_end = cms_gen_bytes_used;
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316 size_t promoted_bytes = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
317 if (_cms_used_at_gc0_end >= _cms_used_at_gc0_begin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
318 promoted_bytes = _cms_used_at_gc0_end - _cms_used_at_gc0_begin;
a61af66fc99e Initial load
duke
parents:
diff changeset
319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // If the younger gen collections were skipped, then the
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // number of promoted bytes will be 0 and adding it to the
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // average will incorrectly lessen the average. It is, however,
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // also possible that no promotion was needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
325 //
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // _gc0_promoted used to be calculated as
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // _gc0_promoted = AdaptiveWeightedAverage::exp_avg(_gc0_promoted,
a61af66fc99e Initial load
duke
parents:
diff changeset
328 // promoted_bytes, _gc0_alpha);
a61af66fc99e Initial load
duke
parents:
diff changeset
329 _cms_gen->gc_stats()->avg_promoted()->sample(promoted_bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
330 _gc0_promoted = (size_t) _cms_gen->gc_stats()->avg_promoted()->average();
a61af66fc99e Initial load
duke
parents:
diff changeset
331
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // Amount directly allocated.
a61af66fc99e Initial load
duke
parents:
diff changeset
333 size_t allocated_bytes = _cms_gen->direct_allocated_words() * HeapWordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
334 _cms_gen->reset_direct_allocated_words();
a61af66fc99e Initial load
duke
parents:
diff changeset
335 _cms_allocated = AdaptiveWeightedAverage::exp_avg(_cms_allocated,
a61af66fc99e Initial load
duke
parents:
diff changeset
336 allocated_bytes, _gc0_alpha);
a61af66fc99e Initial load
duke
parents:
diff changeset
337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 inline void CMSStats::record_cms_begin() {
a61af66fc99e Initial load
duke
parents:
diff changeset
340 _cms_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // This is just an approximate value, but is good enough.
a61af66fc99e Initial load
duke
parents:
diff changeset
343 _cms_used_at_cms_begin = _cms_used_at_gc0_end;
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 _cms_period = AdaptiveWeightedAverage::exp_avg((float)_cms_period,
a61af66fc99e Initial load
duke
parents:
diff changeset
346 (float) _cms_timer.seconds(), _cms_alpha);
a61af66fc99e Initial load
duke
parents:
diff changeset
347 _cms_begin_time.update();
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 _cms_timer.reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
350 _cms_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
351 }
a61af66fc99e Initial load
duke
parents:
diff changeset
352
a61af66fc99e Initial load
duke
parents:
diff changeset
353 inline void CMSStats::record_cms_end() {
a61af66fc99e Initial load
duke
parents:
diff changeset
354 _cms_timer.stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
355
a61af66fc99e Initial load
duke
parents:
diff changeset
356 float cur_duration = _cms_timer.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
357 _cms_duration = AdaptiveWeightedAverage::exp_avg(_cms_duration,
a61af66fc99e Initial load
duke
parents:
diff changeset
358 cur_duration, _cms_alpha);
a61af66fc99e Initial load
duke
parents:
diff changeset
359
a61af66fc99e Initial load
duke
parents:
diff changeset
360 // Avoid division by 0.
a61af66fc99e Initial load
duke
parents:
diff changeset
361 const size_t cms_used_mb = MAX2(_cms_used_at_cms_begin / M, (size_t)1);
a61af66fc99e Initial load
duke
parents:
diff changeset
362 _cms_duration_per_mb = AdaptiveWeightedAverage::exp_avg(_cms_duration_per_mb,
a61af66fc99e Initial load
duke
parents:
diff changeset
363 cur_duration / cms_used_mb,
a61af66fc99e Initial load
duke
parents:
diff changeset
364 _cms_alpha);
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 _cms_end_time.update();
a61af66fc99e Initial load
duke
parents:
diff changeset
367 _cms_alpha = _saved_alpha;
a61af66fc99e Initial load
duke
parents:
diff changeset
368 _allow_duty_cycle_reduction = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
369 _valid_bits |= _CMS_VALID;
a61af66fc99e Initial load
duke
parents:
diff changeset
370
a61af66fc99e Initial load
duke
parents:
diff changeset
371 _cms_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
372 }
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 inline double CMSStats::cms_time_since_begin() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
375 return _cms_begin_time.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
376 }
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 inline double CMSStats::cms_time_since_end() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
379 return _cms_end_time.seconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
381
a61af66fc99e Initial load
duke
parents:
diff changeset
382 inline double CMSStats::promotion_rate() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
383 assert(valid(), "statistics not valid yet");
a61af66fc99e Initial load
duke
parents:
diff changeset
384 return gc0_promoted() / gc0_period();
a61af66fc99e Initial load
duke
parents:
diff changeset
385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
386
a61af66fc99e Initial load
duke
parents:
diff changeset
387 inline double CMSStats::cms_allocation_rate() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
388 assert(valid(), "statistics not valid yet");
a61af66fc99e Initial load
duke
parents:
diff changeset
389 return cms_allocated() / gc0_period();
a61af66fc99e Initial load
duke
parents:
diff changeset
390 }
a61af66fc99e Initial load
duke
parents:
diff changeset
391
a61af66fc99e Initial load
duke
parents:
diff changeset
392 inline double CMSStats::cms_consumption_rate() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
393 assert(valid(), "statistics not valid yet");
a61af66fc99e Initial load
duke
parents:
diff changeset
394 return (gc0_promoted() + cms_allocated()) / gc0_period();
a61af66fc99e Initial load
duke
parents:
diff changeset
395 }
a61af66fc99e Initial load
duke
parents:
diff changeset
396
a61af66fc99e Initial load
duke
parents:
diff changeset
397 inline unsigned int CMSStats::icms_update_duty_cycle() {
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // Update the duty cycle only if pacing is enabled and the stats are valid
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // (after at least one young gen gc and one cms cycle have completed).
a61af66fc99e Initial load
duke
parents:
diff changeset
400 if (CMSIncrementalPacing && valid()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
401 return icms_update_duty_cycle_impl();
a61af66fc99e Initial load
duke
parents:
diff changeset
402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
403 return _icms_duty_cycle;
a61af66fc99e Initial load
duke
parents:
diff changeset
404 }
a61af66fc99e Initial load
duke
parents:
diff changeset
405
a61af66fc99e Initial load
duke
parents:
diff changeset
406 inline void ConcurrentMarkSweepGeneration::save_sweep_limit() {
a61af66fc99e Initial load
duke
parents:
diff changeset
407 cmsSpace()->save_sweep_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
408 }
a61af66fc99e Initial load
duke
parents:
diff changeset
409
a61af66fc99e Initial load
duke
parents:
diff changeset
410 inline size_t ConcurrentMarkSweepGeneration::capacity() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
411 return _cmsSpace->capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
412 }
a61af66fc99e Initial load
duke
parents:
diff changeset
413
a61af66fc99e Initial load
duke
parents:
diff changeset
414 inline size_t ConcurrentMarkSweepGeneration::used() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
415 return _cmsSpace->used();
a61af66fc99e Initial load
duke
parents:
diff changeset
416 }
a61af66fc99e Initial load
duke
parents:
diff changeset
417
a61af66fc99e Initial load
duke
parents:
diff changeset
418 inline size_t ConcurrentMarkSweepGeneration::free() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
419 return _cmsSpace->free();
a61af66fc99e Initial load
duke
parents:
diff changeset
420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 inline MemRegion ConcurrentMarkSweepGeneration::used_region() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
423 return _cmsSpace->used_region();
a61af66fc99e Initial load
duke
parents:
diff changeset
424 }
a61af66fc99e Initial load
duke
parents:
diff changeset
425
a61af66fc99e Initial load
duke
parents:
diff changeset
426 inline MemRegion ConcurrentMarkSweepGeneration::used_region_at_save_marks() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
427 return _cmsSpace->used_region_at_save_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
428 }
a61af66fc99e Initial load
duke
parents:
diff changeset
429
a61af66fc99e Initial load
duke
parents:
diff changeset
430 inline void MarkFromRootsClosure::do_yield_check() {
a61af66fc99e Initial load
duke
parents:
diff changeset
431 if (ConcurrentMarkSweepThread::should_yield() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
432 !_collector->foregroundGCIsActive() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
433 _yield) {
a61af66fc99e Initial load
duke
parents:
diff changeset
434 do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
435 }
a61af66fc99e Initial load
duke
parents:
diff changeset
436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
437
a61af66fc99e Initial load
duke
parents:
diff changeset
438 inline void Par_MarkFromRootsClosure::do_yield_check() {
a61af66fc99e Initial load
duke
parents:
diff changeset
439 if (ConcurrentMarkSweepThread::should_yield() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
440 !_collector->foregroundGCIsActive() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
441 _yield) {
a61af66fc99e Initial load
duke
parents:
diff changeset
442 do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
445
a61af66fc99e Initial load
duke
parents:
diff changeset
446 // Return value of "true" indicates that the on-going preclean
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // should be aborted.
a61af66fc99e Initial load
duke
parents:
diff changeset
448 inline bool ScanMarkedObjectsAgainCarefullyClosure::do_yield_check() {
a61af66fc99e Initial load
duke
parents:
diff changeset
449 if (ConcurrentMarkSweepThread::should_yield() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
450 !_collector->foregroundGCIsActive() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
451 _yield) {
a61af66fc99e Initial load
duke
parents:
diff changeset
452 // Sample young gen size before and after yield
a61af66fc99e Initial load
duke
parents:
diff changeset
453 _collector->sample_eden();
a61af66fc99e Initial load
duke
parents:
diff changeset
454 do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
455 _collector->sample_eden();
a61af66fc99e Initial load
duke
parents:
diff changeset
456 return _collector->should_abort_preclean();
a61af66fc99e Initial load
duke
parents:
diff changeset
457 }
a61af66fc99e Initial load
duke
parents:
diff changeset
458 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
459 }
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461 inline void SurvivorSpacePrecleanClosure::do_yield_check() {
a61af66fc99e Initial load
duke
parents:
diff changeset
462 if (ConcurrentMarkSweepThread::should_yield() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
463 !_collector->foregroundGCIsActive() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
464 _yield) {
a61af66fc99e Initial load
duke
parents:
diff changeset
465 // Sample young gen size before and after yield
a61af66fc99e Initial load
duke
parents:
diff changeset
466 _collector->sample_eden();
a61af66fc99e Initial load
duke
parents:
diff changeset
467 do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
468 _collector->sample_eden();
a61af66fc99e Initial load
duke
parents:
diff changeset
469 }
a61af66fc99e Initial load
duke
parents:
diff changeset
470 }
a61af66fc99e Initial load
duke
parents:
diff changeset
471
a61af66fc99e Initial load
duke
parents:
diff changeset
472 inline void SweepClosure::do_yield_check(HeapWord* addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
473 if (ConcurrentMarkSweepThread::should_yield() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
474 !_collector->foregroundGCIsActive() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
475 _yield) {
a61af66fc99e Initial load
duke
parents:
diff changeset
476 do_yield_work(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
477 }
a61af66fc99e Initial load
duke
parents:
diff changeset
478 }
a61af66fc99e Initial load
duke
parents:
diff changeset
479
a61af66fc99e Initial load
duke
parents:
diff changeset
480 inline void MarkRefsIntoAndScanClosure::do_yield_check() {
a61af66fc99e Initial load
duke
parents:
diff changeset
481 // The conditions are ordered for the remarking phase
a61af66fc99e Initial load
duke
parents:
diff changeset
482 // when _yield is false.
a61af66fc99e Initial load
duke
parents:
diff changeset
483 if (_yield &&
a61af66fc99e Initial load
duke
parents:
diff changeset
484 !_collector->foregroundGCIsActive() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
485 ConcurrentMarkSweepThread::should_yield()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
486 do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
487 }
a61af66fc99e Initial load
duke
parents:
diff changeset
488 }
a61af66fc99e Initial load
duke
parents:
diff changeset
489
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491 inline void ModUnionClosure::do_MemRegion(MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
492 // Align the end of mr so it's at a card boundary.
a61af66fc99e Initial load
duke
parents:
diff changeset
493 // This is superfluous except at the end of the space;
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // we should do better than this XXX
a61af66fc99e Initial load
duke
parents:
diff changeset
495 MemRegion mr2(mr.start(), (HeapWord*)round_to((intptr_t)mr.end(),
a61af66fc99e Initial load
duke
parents:
diff changeset
496 CardTableModRefBS::card_size /* bytes */));
a61af66fc99e Initial load
duke
parents:
diff changeset
497 _t->mark_range(mr2);
a61af66fc99e Initial load
duke
parents:
diff changeset
498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
499
a61af66fc99e Initial load
duke
parents:
diff changeset
500 inline void ModUnionClosurePar::do_MemRegion(MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
501 // Align the end of mr so it's at a card boundary.
a61af66fc99e Initial load
duke
parents:
diff changeset
502 // This is superfluous except at the end of the space;
a61af66fc99e Initial load
duke
parents:
diff changeset
503 // we should do better than this XXX
a61af66fc99e Initial load
duke
parents:
diff changeset
504 MemRegion mr2(mr.start(), (HeapWord*)round_to((intptr_t)mr.end(),
a61af66fc99e Initial load
duke
parents:
diff changeset
505 CardTableModRefBS::card_size /* bytes */));
a61af66fc99e Initial load
duke
parents:
diff changeset
506 _t->par_mark_range(mr2);
a61af66fc99e Initial load
duke
parents:
diff changeset
507 }