annotate src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp @ 10185:d50cc62e94ff

8012715: G1: GraphKit accesses PtrQueue::_index as int but is size_t Summary: In graphKit INT operations were generated to access PtrQueue::_index which has type size_t. This is 64 bit on 64-bit machines. No problems occur on little endian machines as long as the index fits into 32 bit, but on big endian machines the upper part is read, which is zero. This leads to unnecessary branches to the slow path in the runtime. Reviewed-by: twisti, johnc Contributed-by: Martin Doerr <martin.doerr@sap.com>
author johnc
date Wed, 24 Apr 2013 14:48:43 -0700
parents 7b835924c31c
children b06ac540229e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
8035
f64ffbf81af5 8006432: Ratio flags should be unsigned
jwilhelm
parents: 6725
diff changeset
2 * Copyright (c) 2001, 2013, 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: 1387
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1387
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: 1387
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: 1888
diff changeset
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_CONCURRENTMARKSWEEPGENERATION_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
26 #define SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_CONCURRENTMARKSWEEPGENERATION_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
28 #include "gc_implementation/shared/gSpaceCounters.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
29 #include "gc_implementation/shared/gcStats.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
30 #include "gc_implementation/shared/generationCounters.hpp"
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
31 #include "memory/freeBlockDictionary.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
32 #include "memory/generation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
33 #include "runtime/mutexLocker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
34 #include "runtime/virtualspace.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
35 #include "services/memoryService.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
36 #include "utilities/bitMap.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
37 #include "utilities/stack.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
38 #include "utilities/taskqueue.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
39 #include "utilities/yieldingWorkgroup.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
40
0
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // ConcurrentMarkSweepGeneration is in support of a concurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // mark-sweep old generation in the Detlefs-Printezis--Boehm-Demers-Schenker
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // style. We assume, for now, that this generation is always the
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
44 // seniormost generation and for simplicity
0
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // in the first implementation, that this generation is a single compactible
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // space. Neither of these restrictions appears essential, and will be
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // relaxed in the future when more time is available to implement the
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // greater generality (and there's a need for it).
a61af66fc99e Initial load
duke
parents:
diff changeset
49 //
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // Concurrent mode failures are currently handled by
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // means of a sliding mark-compact.
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53 class CMSAdaptiveSizePolicy;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 class CMSConcMarkingTask;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 class CMSGCAdaptivePolicyCounters;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 class ConcurrentMarkSweepGeneration;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 class ConcurrentMarkSweepPolicy;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 class ConcurrentMarkSweepThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 class CompactibleFreeListSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
60 class FreeChunk;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 class PromotionInfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 class ScanMarkedObjectsAgainCarefullyClosure;
9072
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8035
diff changeset
63 class TenuredGeneration;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // A generic CMS bit map. It's the basis for both the CMS marking bit map
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // as well as for the mod union table (in each case only a subset of the
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // methods are used). This is essentially a wrapper around the BitMap class,
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // with one bit per (1<<_shifter) HeapWords. (i.e. for the marking bit map,
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // we have _shifter == 0. and for the mod union table we have
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // shifter == CardTableModRefBS::card_shift - LogHeapWordSize.)
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // XXX 64-bit issues in BitMap?
a61af66fc99e Initial load
duke
parents:
diff changeset
72 class CMSBitMap VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
73 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 HeapWord* _bmStartWord; // base address of range covered by map
a61af66fc99e Initial load
duke
parents:
diff changeset
76 size_t _bmWordSize; // map size (in #HeapWords covered)
a61af66fc99e Initial load
duke
parents:
diff changeset
77 const int _shifter; // shifts to convert HeapWord to bit position
a61af66fc99e Initial load
duke
parents:
diff changeset
78 VirtualSpace _virtual_space; // underlying the bit map
a61af66fc99e Initial load
duke
parents:
diff changeset
79 BitMap _bm; // the bit map itself
a61af66fc99e Initial load
duke
parents:
diff changeset
80 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
81 Mutex* const _lock; // mutex protecting _bm;
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
85 CMSBitMap(int shifter, int mutex_rank, const char* mutex_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // allocates the actual storage for the map
a61af66fc99e Initial load
duke
parents:
diff changeset
88 bool allocate(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // field getter
a61af66fc99e Initial load
duke
parents:
diff changeset
90 Mutex* lock() const { return _lock; }
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // locking verifier convenience function
a61af66fc99e Initial load
duke
parents:
diff changeset
92 void assert_locked() const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // inquiries
a61af66fc99e Initial load
duke
parents:
diff changeset
95 HeapWord* startWord() const { return _bmStartWord; }
a61af66fc99e Initial load
duke
parents:
diff changeset
96 size_t sizeInWords() const { return _bmWordSize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
97 size_t sizeInBits() const { return _bm.size(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // the following is one past the last word in space
a61af66fc99e Initial load
duke
parents:
diff changeset
99 HeapWord* endWord() const { return _bmStartWord + _bmWordSize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // reading marks
a61af66fc99e Initial load
duke
parents:
diff changeset
102 bool isMarked(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 bool par_isMarked(HeapWord* addr) const; // do not lock checks
a61af66fc99e Initial load
duke
parents:
diff changeset
104 bool isUnmarked(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 bool isAllClear() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // writing marks
a61af66fc99e Initial load
duke
parents:
diff changeset
108 void mark(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // For marking by parallel GC threads;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // returns true if we did, false if another thread did
a61af66fc99e Initial load
duke
parents:
diff changeset
111 bool par_mark(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 void mark_range(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
114 void par_mark_range(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
115 void mark_large_range(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
116 void par_mark_large_range(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
117 void par_clear(HeapWord* addr); // For unmarking by parallel GC threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
118 void clear_range(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
119 void par_clear_range(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
120 void clear_large_range(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
121 void par_clear_large_range(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
122 void clear_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
123 void clear_all_incrementally(); // Not yet implemented!!
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 NOT_PRODUCT(
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // checks the memory region for validity
a61af66fc99e Initial load
duke
parents:
diff changeset
127 void region_invariant(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
128 )
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // iteration
a61af66fc99e Initial load
duke
parents:
diff changeset
131 void iterate(BitMapClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
132 _bm.iterate(cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
134 void iterate(BitMapClosure* cl, HeapWord* left, HeapWord* right);
a61af66fc99e Initial load
duke
parents:
diff changeset
135 void dirty_range_iterate_clear(MemRegionClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
136 void dirty_range_iterate_clear(MemRegion mr, MemRegionClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // auxiliary support for iteration
a61af66fc99e Initial load
duke
parents:
diff changeset
139 HeapWord* getNextMarkedWordAddress(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
140 HeapWord* getNextMarkedWordAddress(HeapWord* start_addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
141 HeapWord* end_addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
142 HeapWord* getNextUnmarkedWordAddress(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 HeapWord* getNextUnmarkedWordAddress(HeapWord* start_addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
144 HeapWord* end_addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
145 MemRegion getAndClearMarkedRegion(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
146 MemRegion getAndClearMarkedRegion(HeapWord* start_addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
147 HeapWord* end_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // conversion utilities
a61af66fc99e Initial load
duke
parents:
diff changeset
150 HeapWord* offsetToHeapWord(size_t offset) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 size_t heapWordToOffset(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 size_t heapWordDiffToOffsetDiff(size_t diff) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
153
9076
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 9072
diff changeset
154 void print_on_error(outputStream* st, const char* prefix) const;
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 9072
diff changeset
155
0
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // is this address range covered by the bit-map?
a61af66fc99e Initial load
duke
parents:
diff changeset
158 NOT_PRODUCT(
a61af66fc99e Initial load
duke
parents:
diff changeset
159 bool covers(MemRegion mr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
160 bool covers(HeapWord* start, size_t size = 0) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
161 )
a61af66fc99e Initial load
duke
parents:
diff changeset
162 void verifyNoOneBitsInRange(HeapWord* left, HeapWord* right) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
163 };
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // Represents a marking stack used by the CMS collector.
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // Ideally this should be GrowableArray<> just like MSC's marking stack(s).
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6064
diff changeset
167 class CMSMarkStack: public CHeapObj<mtGC> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
168 //
a61af66fc99e Initial load
duke
parents:
diff changeset
169 friend class CMSCollector; // to get at expasion stats further below
a61af66fc99e Initial load
duke
parents:
diff changeset
170 //
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 VirtualSpace _virtual_space; // space for the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
173 oop* _base; // bottom of stack
a61af66fc99e Initial load
duke
parents:
diff changeset
174 size_t _index; // one more than last occupied index
a61af66fc99e Initial load
duke
parents:
diff changeset
175 size_t _capacity; // max #elements
a61af66fc99e Initial load
duke
parents:
diff changeset
176 Mutex _par_lock; // an advisory lock used in case of parallel access
a61af66fc99e Initial load
duke
parents:
diff changeset
177 NOT_PRODUCT(size_t _max_depth;) // max depth plumbed during run
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
180 size_t _hit_limit; // we hit max stack size limit
a61af66fc99e Initial load
duke
parents:
diff changeset
181 size_t _failed_double; // we failed expansion before hitting limit
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
184 CMSMarkStack():
a61af66fc99e Initial load
duke
parents:
diff changeset
185 _par_lock(Mutex::event, "CMSMarkStack._par_lock", true),
a61af66fc99e Initial load
duke
parents:
diff changeset
186 _hit_limit(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
187 _failed_double(0) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189 bool allocate(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 size_t capacity() const { return _capacity; }
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 oop pop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 if (!isEmpty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
195 return _base[--_index] ;
a61af66fc99e Initial load
duke
parents:
diff changeset
196 }
a61af66fc99e Initial load
duke
parents:
diff changeset
197 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 bool push(oop ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
201 if (isFull()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
203 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
204 _base[_index++] = ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
205 NOT_PRODUCT(_max_depth = MAX2(_max_depth, _index));
a61af66fc99e Initial load
duke
parents:
diff changeset
206 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 bool isEmpty() const { return _index == 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
211 bool isFull() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
212 assert(_index <= _capacity, "buffer overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
213 return _index == _capacity;
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 size_t length() { return _index; }
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // "Parallel versions" of some of the above
a61af66fc99e Initial load
duke
parents:
diff changeset
219 oop par_pop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // lock and pop
a61af66fc99e Initial load
duke
parents:
diff changeset
221 MutexLockerEx x(&_par_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
222 return pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 bool par_push(oop ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // lock and push
a61af66fc99e Initial load
duke
parents:
diff changeset
227 MutexLockerEx x(&_par_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
228 return push(ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // Forcibly reset the stack, losing all of its contents.
a61af66fc99e Initial load
duke
parents:
diff changeset
232 void reset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
233 _index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
234 }
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // Expand the stack, typically in response to an overflow condition
a61af66fc99e Initial load
duke
parents:
diff changeset
237 void expand();
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // Compute the least valued stack element.
a61af66fc99e Initial load
duke
parents:
diff changeset
240 oop least_value(HeapWord* low) {
a61af66fc99e Initial load
duke
parents:
diff changeset
241 oop least = (oop)low;
a61af66fc99e Initial load
duke
parents:
diff changeset
242 for (size_t i = 0; i < _index; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
243 least = MIN2(least, _base[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
245 return least;
a61af66fc99e Initial load
duke
parents:
diff changeset
246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
247
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // Exposed here to allow stack expansion in || case
a61af66fc99e Initial load
duke
parents:
diff changeset
249 Mutex* par_lock() { return &_par_lock; }
a61af66fc99e Initial load
duke
parents:
diff changeset
250 };
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252 class CardTableRS;
a61af66fc99e Initial load
duke
parents:
diff changeset
253 class CMSParGCThreadState;
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255 class ModUnionClosure: public MemRegionClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
256 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
257 CMSBitMap* _t;
a61af66fc99e Initial load
duke
parents:
diff changeset
258 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
259 ModUnionClosure(CMSBitMap* t): _t(t) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
260 void do_MemRegion(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
261 };
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 class ModUnionClosurePar: public ModUnionClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
264 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
265 ModUnionClosurePar(CMSBitMap* t): ModUnionClosure(t) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
266 void do_MemRegion(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
267 };
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // Survivor Chunk Array in support of parallelization of
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // Survivor Space rescan.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6064
diff changeset
271 class ChunkArray: public CHeapObj<mtGC> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
272 size_t _index;
a61af66fc99e Initial load
duke
parents:
diff changeset
273 size_t _capacity;
1753
bba76f745fe6 6910183: CMS: assert(_index < capacity(),"_index out of bounds")
ysr
parents: 1716
diff changeset
274 size_t _overflows;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
275 HeapWord** _array; // storage for array
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 public:
1753
bba76f745fe6 6910183: CMS: assert(_index < capacity(),"_index out of bounds")
ysr
parents: 1716
diff changeset
278 ChunkArray() : _index(0), _capacity(0), _overflows(0), _array(NULL) {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
279 ChunkArray(HeapWord** a, size_t c):
1753
bba76f745fe6 6910183: CMS: assert(_index < capacity(),"_index out of bounds")
ysr
parents: 1716
diff changeset
280 _index(0), _capacity(c), _overflows(0), _array(a) {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
281
a61af66fc99e Initial load
duke
parents:
diff changeset
282 HeapWord** array() { return _array; }
a61af66fc99e Initial load
duke
parents:
diff changeset
283 void set_array(HeapWord** a) { _array = a; }
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 size_t capacity() { return _capacity; }
a61af66fc99e Initial load
duke
parents:
diff changeset
286 void set_capacity(size_t c) { _capacity = c; }
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 size_t end() {
1753
bba76f745fe6 6910183: CMS: assert(_index < capacity(),"_index out of bounds")
ysr
parents: 1716
diff changeset
289 assert(_index <= capacity(),
bba76f745fe6 6910183: CMS: assert(_index < capacity(),"_index out of bounds")
ysr
parents: 1716
diff changeset
290 err_msg("_index (" SIZE_FORMAT ") > _capacity (" SIZE_FORMAT "): out of bounds",
bba76f745fe6 6910183: CMS: assert(_index < capacity(),"_index out of bounds")
ysr
parents: 1716
diff changeset
291 _index, _capacity));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
292 return _index;
a61af66fc99e Initial load
duke
parents:
diff changeset
293 } // exclusive
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 HeapWord* nth(size_t n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
296 assert(n < end(), "Out of bounds access");
a61af66fc99e Initial load
duke
parents:
diff changeset
297 return _array[n];
a61af66fc99e Initial load
duke
parents:
diff changeset
298 }
a61af66fc99e Initial load
duke
parents:
diff changeset
299
a61af66fc99e Initial load
duke
parents:
diff changeset
300 void reset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
301 _index = 0;
1753
bba76f745fe6 6910183: CMS: assert(_index < capacity(),"_index out of bounds")
ysr
parents: 1716
diff changeset
302 if (_overflows > 0 && PrintCMSStatistics > 1) {
bba76f745fe6 6910183: CMS: assert(_index < capacity(),"_index out of bounds")
ysr
parents: 1716
diff changeset
303 warning("CMS: ChunkArray[" SIZE_FORMAT "] overflowed " SIZE_FORMAT " times",
bba76f745fe6 6910183: CMS: assert(_index < capacity(),"_index out of bounds")
ysr
parents: 1716
diff changeset
304 _capacity, _overflows);
bba76f745fe6 6910183: CMS: assert(_index < capacity(),"_index out of bounds")
ysr
parents: 1716
diff changeset
305 }
bba76f745fe6 6910183: CMS: assert(_index < capacity(),"_index out of bounds")
ysr
parents: 1716
diff changeset
306 _overflows = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 void record_sample(HeapWord* p, size_t sz) {
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // For now we do not do anything with the size
a61af66fc99e Initial load
duke
parents:
diff changeset
311 if (_index < _capacity) {
a61af66fc99e Initial load
duke
parents:
diff changeset
312 _array[_index++] = p;
1753
bba76f745fe6 6910183: CMS: assert(_index < capacity(),"_index out of bounds")
ysr
parents: 1716
diff changeset
313 } else {
bba76f745fe6 6910183: CMS: assert(_index < capacity(),"_index out of bounds")
ysr
parents: 1716
diff changeset
314 ++_overflows;
bba76f745fe6 6910183: CMS: assert(_index < capacity(),"_index out of bounds")
ysr
parents: 1716
diff changeset
315 assert(_index == _capacity,
bba76f745fe6 6910183: CMS: assert(_index < capacity(),"_index out of bounds")
ysr
parents: 1716
diff changeset
316 err_msg("_index (" SIZE_FORMAT ") > _capacity (" SIZE_FORMAT
bba76f745fe6 6910183: CMS: assert(_index < capacity(),"_index out of bounds")
ysr
parents: 1716
diff changeset
317 "): out of bounds at overflow#" SIZE_FORMAT,
bba76f745fe6 6910183: CMS: assert(_index < capacity(),"_index out of bounds")
ysr
parents: 1716
diff changeset
318 _index, _capacity, _overflows));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
320 }
a61af66fc99e Initial load
duke
parents:
diff changeset
321 };
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323 //
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // Timing, allocation and promotion statistics for gc scheduling and incremental
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // mode pacing. Most statistics are exponential averages.
a61af66fc99e Initial load
duke
parents:
diff changeset
326 //
a61af66fc99e Initial load
duke
parents:
diff changeset
327 class CMSStats VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
328 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
329 ConcurrentMarkSweepGeneration* const _cms_gen; // The cms (old) gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
330
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // The following are exponential averages with factor alpha:
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // avg = (100 - alpha) * avg + alpha * cur_sample
a61af66fc99e Initial load
duke
parents:
diff changeset
333 //
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // The durations measure: end_time[n] - start_time[n]
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // The periods measure: start_time[n] - start_time[n-1]
a61af66fc99e Initial load
duke
parents:
diff changeset
336 //
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // The cms period and duration include only concurrent collections; time spent
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // in foreground cms collections due to System.gc() or because of a failure to
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // keep up are not included.
a61af66fc99e Initial load
duke
parents:
diff changeset
340 //
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // There are 3 alphas to "bootstrap" the statistics. The _saved_alpha is the
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // real value, but is used only after the first period. A value of 100 is
a61af66fc99e Initial load
duke
parents:
diff changeset
343 // used for the first sample so it gets the entire weight.
a61af66fc99e Initial load
duke
parents:
diff changeset
344 unsigned int _saved_alpha; // 0-100
a61af66fc99e Initial load
duke
parents:
diff changeset
345 unsigned int _gc0_alpha;
a61af66fc99e Initial load
duke
parents:
diff changeset
346 unsigned int _cms_alpha;
a61af66fc99e Initial load
duke
parents:
diff changeset
347
a61af66fc99e Initial load
duke
parents:
diff changeset
348 double _gc0_duration;
a61af66fc99e Initial load
duke
parents:
diff changeset
349 double _gc0_period;
a61af66fc99e Initial load
duke
parents:
diff changeset
350 size_t _gc0_promoted; // bytes promoted per gc0
a61af66fc99e Initial load
duke
parents:
diff changeset
351 double _cms_duration;
a61af66fc99e Initial load
duke
parents:
diff changeset
352 double _cms_duration_pre_sweep; // time from initiation to start of sweep
a61af66fc99e Initial load
duke
parents:
diff changeset
353 double _cms_duration_per_mb;
a61af66fc99e Initial load
duke
parents:
diff changeset
354 double _cms_period;
a61af66fc99e Initial load
duke
parents:
diff changeset
355 size_t _cms_allocated; // bytes of direct allocation per gc0 period
a61af66fc99e Initial load
duke
parents:
diff changeset
356
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // Timers.
a61af66fc99e Initial load
duke
parents:
diff changeset
358 elapsedTimer _cms_timer;
a61af66fc99e Initial load
duke
parents:
diff changeset
359 TimeStamp _gc0_begin_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
360 TimeStamp _cms_begin_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
361 TimeStamp _cms_end_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
362
a61af66fc99e Initial load
duke
parents:
diff changeset
363 // Snapshots of the amount used in the CMS generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
364 size_t _cms_used_at_gc0_begin;
a61af66fc99e Initial load
duke
parents:
diff changeset
365 size_t _cms_used_at_gc0_end;
a61af66fc99e Initial load
duke
parents:
diff changeset
366 size_t _cms_used_at_cms_begin;
a61af66fc99e Initial load
duke
parents:
diff changeset
367
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // Used to prevent the duty cycle from being reduced in the middle of a cms
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // cycle.
a61af66fc99e Initial load
duke
parents:
diff changeset
370 bool _allow_duty_cycle_reduction;
a61af66fc99e Initial load
duke
parents:
diff changeset
371
a61af66fc99e Initial load
duke
parents:
diff changeset
372 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
373 _GC0_VALID = 0x1,
a61af66fc99e Initial load
duke
parents:
diff changeset
374 _CMS_VALID = 0x2,
a61af66fc99e Initial load
duke
parents:
diff changeset
375 _ALL_VALID = _GC0_VALID | _CMS_VALID
a61af66fc99e Initial load
duke
parents:
diff changeset
376 };
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 unsigned int _valid_bits;
a61af66fc99e Initial load
duke
parents:
diff changeset
379
a61af66fc99e Initial load
duke
parents:
diff changeset
380 unsigned int _icms_duty_cycle; // icms duty cycle (0-100).
a61af66fc99e Initial load
duke
parents:
diff changeset
381
a61af66fc99e Initial load
duke
parents:
diff changeset
382 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 // Return a duty cycle that avoids wild oscillations, by limiting the amount
a61af66fc99e Initial load
duke
parents:
diff changeset
385 // of change between old_duty_cycle and new_duty_cycle (the latter is treated
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // as a recommended value).
a61af66fc99e Initial load
duke
parents:
diff changeset
387 static unsigned int icms_damped_duty_cycle(unsigned int old_duty_cycle,
a61af66fc99e Initial load
duke
parents:
diff changeset
388 unsigned int new_duty_cycle);
a61af66fc99e Initial load
duke
parents:
diff changeset
389 unsigned int icms_update_duty_cycle_impl();
a61af66fc99e Initial load
duke
parents:
diff changeset
390
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
391 // In support of adjusting of cms trigger ratios based on history
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
392 // of concurrent mode failure.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
393 double cms_free_adjustment_factor(size_t free) const;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
394 void adjust_cms_free_adjustment_factor(bool fail, size_t free);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
395
0
a61af66fc99e Initial load
duke
parents:
diff changeset
396 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
397 CMSStats(ConcurrentMarkSweepGeneration* cms_gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
398 unsigned int alpha = CMSExpAvgFactor);
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // Whether or not the statistics contain valid data; higher level statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // cannot be called until this returns true (they require at least one young
a61af66fc99e Initial load
duke
parents:
diff changeset
402 // gen and one cms cycle to have completed).
a61af66fc99e Initial load
duke
parents:
diff changeset
403 bool valid() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
404
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // Record statistics.
a61af66fc99e Initial load
duke
parents:
diff changeset
406 void record_gc0_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
407 void record_gc0_end(size_t cms_gen_bytes_used);
a61af66fc99e Initial load
duke
parents:
diff changeset
408 void record_cms_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
409 void record_cms_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // Allow management of the cms timer, which must be stopped/started around
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // yield points.
a61af66fc99e Initial load
duke
parents:
diff changeset
413 elapsedTimer& cms_timer() { return _cms_timer; }
a61af66fc99e Initial load
duke
parents:
diff changeset
414 void start_cms_timer() { _cms_timer.start(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
415 void stop_cms_timer() { _cms_timer.stop(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
416
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // Basic statistics; units are seconds or bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
418 double gc0_period() const { return _gc0_period; }
a61af66fc99e Initial load
duke
parents:
diff changeset
419 double gc0_duration() const { return _gc0_duration; }
a61af66fc99e Initial load
duke
parents:
diff changeset
420 size_t gc0_promoted() const { return _gc0_promoted; }
a61af66fc99e Initial load
duke
parents:
diff changeset
421 double cms_period() const { return _cms_period; }
a61af66fc99e Initial load
duke
parents:
diff changeset
422 double cms_duration() const { return _cms_duration; }
a61af66fc99e Initial load
duke
parents:
diff changeset
423 double cms_duration_per_mb() const { return _cms_duration_per_mb; }
a61af66fc99e Initial load
duke
parents:
diff changeset
424 size_t cms_allocated() const { return _cms_allocated; }
a61af66fc99e Initial load
duke
parents:
diff changeset
425
a61af66fc99e Initial load
duke
parents:
diff changeset
426 size_t cms_used_at_gc0_end() const { return _cms_used_at_gc0_end;}
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // Seconds since the last background cms cycle began or ended.
a61af66fc99e Initial load
duke
parents:
diff changeset
429 double cms_time_since_begin() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
430 double cms_time_since_end() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
431
a61af66fc99e Initial load
duke
parents:
diff changeset
432 // Higher level statistics--caller must check that valid() returns true before
a61af66fc99e Initial load
duke
parents:
diff changeset
433 // calling.
a61af66fc99e Initial load
duke
parents:
diff changeset
434
a61af66fc99e Initial load
duke
parents:
diff changeset
435 // Returns bytes promoted per second of wall clock time.
a61af66fc99e Initial load
duke
parents:
diff changeset
436 double promotion_rate() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
437
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // Returns bytes directly allocated per second of wall clock time.
a61af66fc99e Initial load
duke
parents:
diff changeset
439 double cms_allocation_rate() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // Rate at which space in the cms generation is being consumed (sum of the
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // above two).
a61af66fc99e Initial load
duke
parents:
diff changeset
443 double cms_consumption_rate() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
444
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // Returns an estimate of the number of seconds until the cms generation will
a61af66fc99e Initial load
duke
parents:
diff changeset
446 // fill up, assuming no collection work is done.
a61af66fc99e Initial load
duke
parents:
diff changeset
447 double time_until_cms_gen_full() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
448
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // Returns an estimate of the number of seconds remaining until
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // the cms generation collection should start.
a61af66fc99e Initial load
duke
parents:
diff changeset
451 double time_until_cms_start() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
452
a61af66fc99e Initial load
duke
parents:
diff changeset
453 // End of higher level statistics.
a61af66fc99e Initial load
duke
parents:
diff changeset
454
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // Returns the cms incremental mode duty cycle, as a percentage (0-100).
a61af66fc99e Initial load
duke
parents:
diff changeset
456 unsigned int icms_duty_cycle() const { return _icms_duty_cycle; }
a61af66fc99e Initial load
duke
parents:
diff changeset
457
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // Update the duty cycle and return the new value.
a61af66fc99e Initial load
duke
parents:
diff changeset
459 unsigned int icms_update_duty_cycle();
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461 // Debugging.
a61af66fc99e Initial load
duke
parents:
diff changeset
462 void print_on(outputStream* st) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
463 void print() const { print_on(gclog_or_tty); }
a61af66fc99e Initial load
duke
parents:
diff changeset
464 };
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466 // A closure related to weak references processing which
a61af66fc99e Initial load
duke
parents:
diff changeset
467 // we embed in the CMSCollector, since we need to pass
a61af66fc99e Initial load
duke
parents:
diff changeset
468 // it to the reference processor for secondary filtering
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // of references based on reachability of referent;
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // see role of _is_alive_non_header closure in the
a61af66fc99e Initial load
duke
parents:
diff changeset
471 // ReferenceProcessor class.
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // For objects in the CMS generation, this closure checks
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // if the object is "live" (reachable). Used in weak
a61af66fc99e Initial load
duke
parents:
diff changeset
474 // reference processing.
a61af66fc99e Initial load
duke
parents:
diff changeset
475 class CMSIsAliveClosure: public BoolObjectClosure {
143
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
476 const MemRegion _span;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
477 const CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
478
a61af66fc99e Initial load
duke
parents:
diff changeset
479 friend class CMSCollector;
a61af66fc99e Initial load
duke
parents:
diff changeset
480 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
481 CMSIsAliveClosure(MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
482 CMSBitMap* bit_map):
a61af66fc99e Initial load
duke
parents:
diff changeset
483 _span(span),
143
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
484 _bit_map(bit_map) {
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
485 assert(!span.is_empty(), "Empty span could spell trouble");
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
486 }
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
487
0
a61af66fc99e Initial load
duke
parents:
diff changeset
488 void do_object(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
489 assert(false, "not to be invoked");
a61af66fc99e Initial load
duke
parents:
diff changeset
490 }
143
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
491
0
a61af66fc99e Initial load
duke
parents:
diff changeset
492 bool do_object_b(oop obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
493 };
a61af66fc99e Initial load
duke
parents:
diff changeset
494
a61af66fc99e Initial load
duke
parents:
diff changeset
495
a61af66fc99e Initial load
duke
parents:
diff changeset
496 // Implements AbstractRefProcTaskExecutor for CMS.
a61af66fc99e Initial load
duke
parents:
diff changeset
497 class CMSRefProcTaskExecutor: public AbstractRefProcTaskExecutor {
a61af66fc99e Initial load
duke
parents:
diff changeset
498 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
499
a61af66fc99e Initial load
duke
parents:
diff changeset
500 CMSRefProcTaskExecutor(CMSCollector& collector)
a61af66fc99e Initial load
duke
parents:
diff changeset
501 : _collector(collector)
a61af66fc99e Initial load
duke
parents:
diff changeset
502 { }
a61af66fc99e Initial load
duke
parents:
diff changeset
503
a61af66fc99e Initial load
duke
parents:
diff changeset
504 // Executes a task using worker threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
505 virtual void execute(ProcessTask& task);
a61af66fc99e Initial load
duke
parents:
diff changeset
506 virtual void execute(EnqueueTask& task);
a61af66fc99e Initial load
duke
parents:
diff changeset
507 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
508 CMSCollector& _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
509 };
a61af66fc99e Initial load
duke
parents:
diff changeset
510
a61af66fc99e Initial load
duke
parents:
diff changeset
511
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6064
diff changeset
512 class CMSCollector: public CHeapObj<mtGC> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
513 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
514 friend class ConcurrentMarkSweepThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
515 friend class ConcurrentMarkSweepGeneration;
a61af66fc99e Initial load
duke
parents:
diff changeset
516 friend class CompactibleFreeListSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
517 friend class CMSParRemarkTask;
a61af66fc99e Initial load
duke
parents:
diff changeset
518 friend class CMSConcMarkingTask;
a61af66fc99e Initial load
duke
parents:
diff changeset
519 friend class CMSRefProcTaskProxy;
a61af66fc99e Initial load
duke
parents:
diff changeset
520 friend class CMSRefProcTaskExecutor;
a61af66fc99e Initial load
duke
parents:
diff changeset
521 friend class ScanMarkedObjectsAgainCarefullyClosure; // for sampling eden
a61af66fc99e Initial load
duke
parents:
diff changeset
522 friend class SurvivorSpacePrecleanClosure; // --- ditto -------
a61af66fc99e Initial load
duke
parents:
diff changeset
523 friend class PushOrMarkClosure; // to access _restart_addr
a61af66fc99e Initial load
duke
parents:
diff changeset
524 friend class Par_PushOrMarkClosure; // to access _restart_addr
a61af66fc99e Initial load
duke
parents:
diff changeset
525 friend class MarkFromRootsClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
526 // ... and for clearing cards
a61af66fc99e Initial load
duke
parents:
diff changeset
527 friend class Par_MarkFromRootsClosure; // to access _restart_addr
a61af66fc99e Initial load
duke
parents:
diff changeset
528 // ... and for clearing cards
a61af66fc99e Initial load
duke
parents:
diff changeset
529 friend class Par_ConcMarkingClosure; // to access _restart_addr etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
530 friend class MarkFromRootsVerifyClosure; // to access _restart_addr
a61af66fc99e Initial load
duke
parents:
diff changeset
531 friend class PushAndMarkVerifyClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
532 friend class MarkRefsIntoAndScanClosure; // to access _overflow_list
a61af66fc99e Initial load
duke
parents:
diff changeset
533 friend class PushAndMarkClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
534 friend class Par_PushAndMarkClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
535 friend class CMSKeepAliveClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
536 friend class CMSDrainMarkingStackClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
537 friend class CMSInnerParMarkAndPushClosure; // -- ditto --
a61af66fc99e Initial load
duke
parents:
diff changeset
538 NOT_PRODUCT(friend class ScanMarkedObjectsAgainClosure;) // assertion on _overflow_list
a61af66fc99e Initial load
duke
parents:
diff changeset
539 friend class ReleaseForegroundGC; // to access _foregroundGCShouldWait
a61af66fc99e Initial load
duke
parents:
diff changeset
540 friend class VM_CMS_Operation;
a61af66fc99e Initial load
duke
parents:
diff changeset
541 friend class VM_CMS_Initial_Mark;
a61af66fc99e Initial load
duke
parents:
diff changeset
542 friend class VM_CMS_Final_Remark;
1703
f6f3eef8a521 6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents: 1552
diff changeset
543 friend class TraceCMSMemoryManagerStats;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
544
a61af66fc99e Initial load
duke
parents:
diff changeset
545 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
546 jlong _time_of_last_gc;
a61af66fc99e Initial load
duke
parents:
diff changeset
547 void update_time_of_last_gc(jlong now) {
a61af66fc99e Initial load
duke
parents:
diff changeset
548 _time_of_last_gc = now;
a61af66fc99e Initial load
duke
parents:
diff changeset
549 }
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551 OopTaskQueueSet* _task_queues;
a61af66fc99e Initial load
duke
parents:
diff changeset
552
a61af66fc99e Initial load
duke
parents:
diff changeset
553 // Overflow list of grey objects, threaded through mark-word
a61af66fc99e Initial load
duke
parents:
diff changeset
554 // Manipulated with CAS in the parallel/multi-threaded case.
a61af66fc99e Initial load
duke
parents:
diff changeset
555 oop _overflow_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // The following array-pair keeps track of mark words
a61af66fc99e Initial load
duke
parents:
diff changeset
557 // displaced for accomodating overflow list above.
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // This code will likely be revisited under RFE#4922830.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6064
diff changeset
559 Stack<oop, mtGC> _preserved_oop_stack;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6064
diff changeset
560 Stack<markOop, mtGC> _preserved_mark_stack;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
561
a61af66fc99e Initial load
duke
parents:
diff changeset
562 int* _hash_seed;
a61af66fc99e Initial load
duke
parents:
diff changeset
563
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // In support of multi-threaded concurrent phases
a61af66fc99e Initial load
duke
parents:
diff changeset
565 YieldingFlexibleWorkGang* _conc_workers;
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // Performance Counters
a61af66fc99e Initial load
duke
parents:
diff changeset
568 CollectorCounters* _gc_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
569
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // Initialization Errors
a61af66fc99e Initial load
duke
parents:
diff changeset
571 bool _completed_initialization;
a61af66fc99e Initial load
duke
parents:
diff changeset
572
a61af66fc99e Initial load
duke
parents:
diff changeset
573 // In support of ExplicitGCInvokesConcurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
574 static bool _full_gc_requested;
a61af66fc99e Initial load
duke
parents:
diff changeset
575 unsigned int _collection_count_start;
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
576
0
a61af66fc99e Initial load
duke
parents:
diff changeset
577 // Should we unload classes this concurrent cycle?
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
578 bool _should_unload_classes;
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
579 unsigned int _concurrent_cycles_since_last_unload;
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
580 unsigned int concurrent_cycles_since_last_unload() const {
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
581 return _concurrent_cycles_since_last_unload;
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
582 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // Did we (allow) unload classes in the previous concurrent cycle?
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
584 bool unloaded_classes_last_cycle() const {
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
585 return concurrent_cycles_since_last_unload() == 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
586 }
798
fe1574da39fc 6848641: CMSCollector::_roots_scanning_options should be initialized
ysr
parents: 579
diff changeset
587 // Root scanning options for perm gen
fe1574da39fc 6848641: CMSCollector::_roots_scanning_options should be initialized
ysr
parents: 579
diff changeset
588 int _roots_scanning_options;
fe1574da39fc 6848641: CMSCollector::_roots_scanning_options should be initialized
ysr
parents: 579
diff changeset
589 int roots_scanning_options() const { return _roots_scanning_options; }
fe1574da39fc 6848641: CMSCollector::_roots_scanning_options should be initialized
ysr
parents: 579
diff changeset
590 void add_root_scanning_option(int o) { _roots_scanning_options |= o; }
fe1574da39fc 6848641: CMSCollector::_roots_scanning_options should be initialized
ysr
parents: 579
diff changeset
591 void remove_root_scanning_option(int o) { _roots_scanning_options &= ~o; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
592
a61af66fc99e Initial load
duke
parents:
diff changeset
593 // Verification support
a61af66fc99e Initial load
duke
parents:
diff changeset
594 CMSBitMap _verification_mark_bm;
a61af66fc99e Initial load
duke
parents:
diff changeset
595 void verify_after_remark_work_1();
a61af66fc99e Initial load
duke
parents:
diff changeset
596 void verify_after_remark_work_2();
a61af66fc99e Initial load
duke
parents:
diff changeset
597
a61af66fc99e Initial load
duke
parents:
diff changeset
598 // true if any verification flag is on.
a61af66fc99e Initial load
duke
parents:
diff changeset
599 bool _verifying;
a61af66fc99e Initial load
duke
parents:
diff changeset
600 bool verifying() const { return _verifying; }
a61af66fc99e Initial load
duke
parents:
diff changeset
601 void set_verifying(bool v) { _verifying = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
602
a61af66fc99e Initial load
duke
parents:
diff changeset
603 // Collector policy
a61af66fc99e Initial load
duke
parents:
diff changeset
604 ConcurrentMarkSweepPolicy* _collector_policy;
a61af66fc99e Initial load
duke
parents:
diff changeset
605 ConcurrentMarkSweepPolicy* collector_policy() { return _collector_policy; }
a61af66fc99e Initial load
duke
parents:
diff changeset
606
a61af66fc99e Initial load
duke
parents:
diff changeset
607 // XXX Move these to CMSStats ??? FIX ME !!!
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
608 elapsedTimer _inter_sweep_timer; // time between sweeps
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
609 elapsedTimer _intra_sweep_timer; // time _in_ sweeps
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
610 // padded decaying average estimates of the above
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
611 AdaptivePaddedAverage _inter_sweep_estimate;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
612 AdaptivePaddedAverage _intra_sweep_estimate;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
613
a61af66fc99e Initial load
duke
parents:
diff changeset
614 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
615 ConcurrentMarkSweepGeneration* _cmsGen; // old gen (CMS)
a61af66fc99e Initial load
duke
parents:
diff changeset
616 MemRegion _span; // span covering above two
a61af66fc99e Initial load
duke
parents:
diff changeset
617 CardTableRS* _ct; // card table
a61af66fc99e Initial load
duke
parents:
diff changeset
618
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // CMS marking support structures
a61af66fc99e Initial load
duke
parents:
diff changeset
620 CMSBitMap _markBitMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
621 CMSBitMap _modUnionTable;
a61af66fc99e Initial load
duke
parents:
diff changeset
622 CMSMarkStack _markStack;
a61af66fc99e Initial load
duke
parents:
diff changeset
623
a61af66fc99e Initial load
duke
parents:
diff changeset
624 HeapWord* _restart_addr; // in support of marking stack overflow
a61af66fc99e Initial load
duke
parents:
diff changeset
625 void lower_restart_addr(HeapWord* low);
a61af66fc99e Initial load
duke
parents:
diff changeset
626
a61af66fc99e Initial load
duke
parents:
diff changeset
627 // Counters in support of marking stack / work queue overflow handling:
a61af66fc99e Initial load
duke
parents:
diff changeset
628 // a non-zero value indicates certain types of overflow events during
a61af66fc99e Initial load
duke
parents:
diff changeset
629 // the current CMS cycle and could lead to stack resizing efforts at
a61af66fc99e Initial load
duke
parents:
diff changeset
630 // an opportune future time.
a61af66fc99e Initial load
duke
parents:
diff changeset
631 size_t _ser_pmc_preclean_ovflw;
a61af66fc99e Initial load
duke
parents:
diff changeset
632 size_t _ser_pmc_remark_ovflw;
a61af66fc99e Initial load
duke
parents:
diff changeset
633 size_t _par_pmc_remark_ovflw;
452
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
634 size_t _ser_kac_preclean_ovflw;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
635 size_t _ser_kac_ovflw;
a61af66fc99e Initial load
duke
parents:
diff changeset
636 size_t _par_kac_ovflw;
534
5cfd8d19e546 6786503: Overflow list performance can be improved
ysr
parents: 517
diff changeset
637 NOT_PRODUCT(ssize_t _num_par_pushes;)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
638
a61af66fc99e Initial load
duke
parents:
diff changeset
639 // ("Weak") Reference processing support
a61af66fc99e Initial load
duke
parents:
diff changeset
640 ReferenceProcessor* _ref_processor;
a61af66fc99e Initial load
duke
parents:
diff changeset
641 CMSIsAliveClosure _is_alive_closure;
143
b5489bb705c9 6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled
ysr
parents: 113
diff changeset
642 // keep this textually after _markBitMap and _span; c'tor dependency
0
a61af66fc99e Initial load
duke
parents:
diff changeset
643
a61af66fc99e Initial load
duke
parents:
diff changeset
644 ConcurrentMarkSweepThread* _cmsThread; // the thread doing the work
a61af66fc99e Initial load
duke
parents:
diff changeset
645 ModUnionClosure _modUnionClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
646 ModUnionClosurePar _modUnionClosurePar;
a61af66fc99e Initial load
duke
parents:
diff changeset
647
a61af66fc99e Initial load
duke
parents:
diff changeset
648 // CMS abstract state machine
a61af66fc99e Initial load
duke
parents:
diff changeset
649 // initial_state: Idling
a61af66fc99e Initial load
duke
parents:
diff changeset
650 // next_state(Idling) = {Marking}
a61af66fc99e Initial load
duke
parents:
diff changeset
651 // next_state(Marking) = {Precleaning, Sweeping}
a61af66fc99e Initial load
duke
parents:
diff changeset
652 // next_state(Precleaning) = {AbortablePreclean, FinalMarking}
a61af66fc99e Initial load
duke
parents:
diff changeset
653 // next_state(AbortablePreclean) = {FinalMarking}
a61af66fc99e Initial load
duke
parents:
diff changeset
654 // next_state(FinalMarking) = {Sweeping}
a61af66fc99e Initial load
duke
parents:
diff changeset
655 // next_state(Sweeping) = {Resizing}
a61af66fc99e Initial load
duke
parents:
diff changeset
656 // next_state(Resizing) = {Resetting}
a61af66fc99e Initial load
duke
parents:
diff changeset
657 // next_state(Resetting) = {Idling}
a61af66fc99e Initial load
duke
parents:
diff changeset
658 // The numeric values below are chosen so that:
a61af66fc99e Initial load
duke
parents:
diff changeset
659 // . _collectorState <= Idling == post-sweep && pre-mark
a61af66fc99e Initial load
duke
parents:
diff changeset
660 // . _collectorState in (Idling, Sweeping) == {initial,final}marking ||
a61af66fc99e Initial load
duke
parents:
diff changeset
661 // precleaning || abortablePrecleanb
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
662 public:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
663 enum CollectorState {
a61af66fc99e Initial load
duke
parents:
diff changeset
664 Resizing = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
665 Resetting = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
666 Idling = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
667 InitialMarking = 3,
a61af66fc99e Initial load
duke
parents:
diff changeset
668 Marking = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
669 Precleaning = 5,
a61af66fc99e Initial load
duke
parents:
diff changeset
670 AbortablePreclean = 6,
a61af66fc99e Initial load
duke
parents:
diff changeset
671 FinalMarking = 7,
a61af66fc99e Initial load
duke
parents:
diff changeset
672 Sweeping = 8
a61af66fc99e Initial load
duke
parents:
diff changeset
673 };
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
674 protected:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
675 static CollectorState _collectorState;
a61af66fc99e Initial load
duke
parents:
diff changeset
676
a61af66fc99e Initial load
duke
parents:
diff changeset
677 // State related to prologue/epilogue invocation for my generations
a61af66fc99e Initial load
duke
parents:
diff changeset
678 bool _between_prologue_and_epilogue;
a61af66fc99e Initial load
duke
parents:
diff changeset
679
a61af66fc99e Initial load
duke
parents:
diff changeset
680 // Signalling/State related to coordination between fore- and backgroud GC
a61af66fc99e Initial load
duke
parents:
diff changeset
681 // Note: When the baton has been passed from background GC to foreground GC,
a61af66fc99e Initial load
duke
parents:
diff changeset
682 // _foregroundGCIsActive is true and _foregroundGCShouldWait is false.
a61af66fc99e Initial load
duke
parents:
diff changeset
683 static bool _foregroundGCIsActive; // true iff foreground collector is active or
a61af66fc99e Initial load
duke
parents:
diff changeset
684 // wants to go active
a61af66fc99e Initial load
duke
parents:
diff changeset
685 static bool _foregroundGCShouldWait; // true iff background GC is active and has not
a61af66fc99e Initial load
duke
parents:
diff changeset
686 // yet passed the baton to the foreground GC
a61af66fc99e Initial load
duke
parents:
diff changeset
687
a61af66fc99e Initial load
duke
parents:
diff changeset
688 // Support for CMSScheduleRemark (abortable preclean)
a61af66fc99e Initial load
duke
parents:
diff changeset
689 bool _abort_preclean;
a61af66fc99e Initial load
duke
parents:
diff changeset
690 bool _start_sampling;
a61af66fc99e Initial load
duke
parents:
diff changeset
691
a61af66fc99e Initial load
duke
parents:
diff changeset
692 int _numYields;
a61af66fc99e Initial load
duke
parents:
diff changeset
693 size_t _numDirtyCards;
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
694 size_t _sweep_count;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
695 // number of full gc's since the last concurrent gc.
a61af66fc99e Initial load
duke
parents:
diff changeset
696 uint _full_gcs_since_conc_gc;
a61af66fc99e Initial load
duke
parents:
diff changeset
697
a61af66fc99e Initial load
duke
parents:
diff changeset
698 // occupancy used for bootstrapping stats
a61af66fc99e Initial load
duke
parents:
diff changeset
699 double _bootstrap_occupancy;
a61af66fc99e Initial load
duke
parents:
diff changeset
700
a61af66fc99e Initial load
duke
parents:
diff changeset
701 // timer
a61af66fc99e Initial load
duke
parents:
diff changeset
702 elapsedTimer _timer;
a61af66fc99e Initial load
duke
parents:
diff changeset
703
a61af66fc99e Initial load
duke
parents:
diff changeset
704 // Timing, allocation and promotion statistics, used for scheduling.
a61af66fc99e Initial load
duke
parents:
diff changeset
705 CMSStats _stats;
a61af66fc99e Initial load
duke
parents:
diff changeset
706
a61af66fc99e Initial load
duke
parents:
diff changeset
707 // Allocation limits installed in the young gen, used only in
a61af66fc99e Initial load
duke
parents:
diff changeset
708 // CMSIncrementalMode. When an allocation in the young gen would cross one of
a61af66fc99e Initial load
duke
parents:
diff changeset
709 // these limits, the cms generation is notified and the cms thread is started
a61af66fc99e Initial load
duke
parents:
diff changeset
710 // or stopped, respectively.
a61af66fc99e Initial load
duke
parents:
diff changeset
711 HeapWord* _icms_start_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
712 HeapWord* _icms_stop_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
713
a61af66fc99e Initial load
duke
parents:
diff changeset
714 enum CMS_op_type {
a61af66fc99e Initial load
duke
parents:
diff changeset
715 CMS_op_checkpointRootsInitial,
a61af66fc99e Initial load
duke
parents:
diff changeset
716 CMS_op_checkpointRootsFinal
a61af66fc99e Initial load
duke
parents:
diff changeset
717 };
a61af66fc99e Initial load
duke
parents:
diff changeset
718
6064
9d679effd28c 7166894: Add gc cause to GC logging for all collectors
brutisso
parents: 6026
diff changeset
719 void do_CMS_operation(CMS_op_type op, GCCause::Cause gc_cause);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
720 bool stop_world_and_do(CMS_op_type op);
a61af66fc99e Initial load
duke
parents:
diff changeset
721
a61af66fc99e Initial load
duke
parents:
diff changeset
722 OopTaskQueueSet* task_queues() { return _task_queues; }
a61af66fc99e Initial load
duke
parents:
diff changeset
723 int* hash_seed(int i) { return &_hash_seed[i]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
724 YieldingFlexibleWorkGang* conc_workers() { return _conc_workers; }
a61af66fc99e Initial load
duke
parents:
diff changeset
725
a61af66fc99e Initial load
duke
parents:
diff changeset
726 // Support for parallelizing Eden rescan in CMS remark phase
a61af66fc99e Initial load
duke
parents:
diff changeset
727 void sample_eden(); // ... sample Eden space top
a61af66fc99e Initial load
duke
parents:
diff changeset
728
a61af66fc99e Initial load
duke
parents:
diff changeset
729 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
730 // Support for parallelizing young gen rescan in CMS remark phase
a61af66fc99e Initial load
duke
parents:
diff changeset
731 Generation* _young_gen; // the younger gen
a61af66fc99e Initial load
duke
parents:
diff changeset
732 HeapWord** _top_addr; // ... Top of Eden
a61af66fc99e Initial load
duke
parents:
diff changeset
733 HeapWord** _end_addr; // ... End of Eden
a61af66fc99e Initial load
duke
parents:
diff changeset
734 HeapWord** _eden_chunk_array; // ... Eden partitioning array
a61af66fc99e Initial load
duke
parents:
diff changeset
735 size_t _eden_chunk_index; // ... top (exclusive) of array
a61af66fc99e Initial load
duke
parents:
diff changeset
736 size_t _eden_chunk_capacity; // ... max entries in array
a61af66fc99e Initial load
duke
parents:
diff changeset
737
a61af66fc99e Initial load
duke
parents:
diff changeset
738 // Support for parallelizing survivor space rescan
a61af66fc99e Initial load
duke
parents:
diff changeset
739 HeapWord** _survivor_chunk_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
740 size_t _survivor_chunk_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
741 size_t _survivor_chunk_capacity;
a61af66fc99e Initial load
duke
parents:
diff changeset
742 size_t* _cursor;
a61af66fc99e Initial load
duke
parents:
diff changeset
743 ChunkArray* _survivor_plab_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
744
a61af66fc99e Initial load
duke
parents:
diff changeset
745 // Support for marking stack overflow handling
a61af66fc99e Initial load
duke
parents:
diff changeset
746 bool take_from_overflow_list(size_t num, CMSMarkStack* to_stack);
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1753
diff changeset
747 bool par_take_from_overflow_list(size_t num,
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1753
diff changeset
748 OopTaskQueue* to_work_q,
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1753
diff changeset
749 int no_of_gc_threads);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
750 void push_on_overflow_list(oop p);
a61af66fc99e Initial load
duke
parents:
diff changeset
751 void par_push_on_overflow_list(oop p);
a61af66fc99e Initial load
duke
parents:
diff changeset
752 // the following is, obviously, not, in general, "MT-stable"
a61af66fc99e Initial load
duke
parents:
diff changeset
753 bool overflow_list_is_empty() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
754
a61af66fc99e Initial load
duke
parents:
diff changeset
755 void preserve_mark_if_necessary(oop p);
a61af66fc99e Initial load
duke
parents:
diff changeset
756 void par_preserve_mark_if_necessary(oop p);
a61af66fc99e Initial load
duke
parents:
diff changeset
757 void preserve_mark_work(oop p, markOop m);
a61af66fc99e Initial load
duke
parents:
diff changeset
758 void restore_preserved_marks_if_any();
a61af66fc99e Initial load
duke
parents:
diff changeset
759 NOT_PRODUCT(bool no_preserved_marks() const;)
a61af66fc99e Initial load
duke
parents:
diff changeset
760 // in support of testing overflow code
a61af66fc99e Initial load
duke
parents:
diff changeset
761 NOT_PRODUCT(int _overflow_counter;)
a61af66fc99e Initial load
duke
parents:
diff changeset
762 NOT_PRODUCT(bool simulate_overflow();) // sequential
a61af66fc99e Initial load
duke
parents:
diff changeset
763 NOT_PRODUCT(bool par_simulate_overflow();) // MT version
a61af66fc99e Initial load
duke
parents:
diff changeset
764
a61af66fc99e Initial load
duke
parents:
diff changeset
765 // CMS work methods
a61af66fc99e Initial load
duke
parents:
diff changeset
766 void checkpointRootsInitialWork(bool asynch); // initial checkpoint work
a61af66fc99e Initial load
duke
parents:
diff changeset
767
a61af66fc99e Initial load
duke
parents:
diff changeset
768 // a return value of false indicates failure due to stack overflow
a61af66fc99e Initial load
duke
parents:
diff changeset
769 bool markFromRootsWork(bool asynch); // concurrent marking work
a61af66fc99e Initial load
duke
parents:
diff changeset
770
a61af66fc99e Initial load
duke
parents:
diff changeset
771 public: // FIX ME!!! only for testing
a61af66fc99e Initial load
duke
parents:
diff changeset
772 bool do_marking_st(bool asynch); // single-threaded marking
a61af66fc99e Initial load
duke
parents:
diff changeset
773 bool do_marking_mt(bool asynch); // multi-threaded marking
a61af66fc99e Initial load
duke
parents:
diff changeset
774
a61af66fc99e Initial load
duke
parents:
diff changeset
775 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
776
a61af66fc99e Initial load
duke
parents:
diff changeset
777 // concurrent precleaning work
a61af66fc99e Initial load
duke
parents:
diff changeset
778 size_t preclean_mod_union_table(ConcurrentMarkSweepGeneration* gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
779 ScanMarkedObjectsAgainCarefullyClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
780 size_t preclean_card_table(ConcurrentMarkSweepGeneration* gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
781 ScanMarkedObjectsAgainCarefullyClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
782 // Does precleaning work, returning a quantity indicative of
a61af66fc99e Initial load
duke
parents:
diff changeset
783 // the amount of "useful work" done.
a61af66fc99e Initial load
duke
parents:
diff changeset
784 size_t preclean_work(bool clean_refs, bool clean_survivors);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
785 void preclean_klasses(MarkRefsIntoAndScanClosure* cl, Mutex* freelistLock);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
786 void abortable_preclean(); // Preclean while looking for possible abort
a61af66fc99e Initial load
duke
parents:
diff changeset
787 void initialize_sequential_subtasks_for_young_gen_rescan(int i);
a61af66fc99e Initial load
duke
parents:
diff changeset
788 // Helper function for above; merge-sorts the per-thread plab samples
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1753
diff changeset
789 void merge_survivor_plab_arrays(ContiguousSpace* surv, int no_of_gc_threads);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
790 // Resets (i.e. clears) the per-thread plab sample vectors
a61af66fc99e Initial load
duke
parents:
diff changeset
791 void reset_survivor_plab_arrays();
a61af66fc99e Initial load
duke
parents:
diff changeset
792
a61af66fc99e Initial load
duke
parents:
diff changeset
793 // final (second) checkpoint work
a61af66fc99e Initial load
duke
parents:
diff changeset
794 void checkpointRootsFinalWork(bool asynch, bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
795 bool init_mark_was_synchronous);
a61af66fc99e Initial load
duke
parents:
diff changeset
796 // work routine for parallel version of remark
a61af66fc99e Initial load
duke
parents:
diff changeset
797 void do_remark_parallel();
a61af66fc99e Initial load
duke
parents:
diff changeset
798 // work routine for non-parallel version of remark
a61af66fc99e Initial load
duke
parents:
diff changeset
799 void do_remark_non_parallel();
a61af66fc99e Initial load
duke
parents:
diff changeset
800 // reference processing work routine (during second checkpoint)
a61af66fc99e Initial load
duke
parents:
diff changeset
801 void refProcessingWork(bool asynch, bool clear_all_soft_refs);
a61af66fc99e Initial load
duke
parents:
diff changeset
802
a61af66fc99e Initial load
duke
parents:
diff changeset
803 // concurrent sweeping work
a61af66fc99e Initial load
duke
parents:
diff changeset
804 void sweepWork(ConcurrentMarkSweepGeneration* gen, bool asynch);
a61af66fc99e Initial load
duke
parents:
diff changeset
805
a61af66fc99e Initial load
duke
parents:
diff changeset
806 // (concurrent) resetting of support data structures
a61af66fc99e Initial load
duke
parents:
diff changeset
807 void reset(bool asynch);
a61af66fc99e Initial load
duke
parents:
diff changeset
808
a61af66fc99e Initial load
duke
parents:
diff changeset
809 // Clear _expansion_cause fields of constituent generations
a61af66fc99e Initial load
duke
parents:
diff changeset
810 void clear_expansion_cause();
a61af66fc99e Initial load
duke
parents:
diff changeset
811
a61af66fc99e Initial load
duke
parents:
diff changeset
812 // An auxilliary method used to record the ends of
a61af66fc99e Initial load
duke
parents:
diff changeset
813 // used regions of each generation to limit the extent of sweep
a61af66fc99e Initial load
duke
parents:
diff changeset
814 void save_sweep_limits();
a61af66fc99e Initial load
duke
parents:
diff changeset
815
a61af66fc99e Initial load
duke
parents:
diff changeset
816 // A work method used by foreground collection to determine
a61af66fc99e Initial load
duke
parents:
diff changeset
817 // what type of collection (compacting or not, continuing or fresh)
a61af66fc99e Initial load
duke
parents:
diff changeset
818 // it should do.
a61af66fc99e Initial load
duke
parents:
diff changeset
819 void decide_foreground_collection_type(bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
820 bool* should_compact, bool* should_start_over);
a61af66fc99e Initial load
duke
parents:
diff changeset
821
a61af66fc99e Initial load
duke
parents:
diff changeset
822 // A work method used by the foreground collector to do
a61af66fc99e Initial load
duke
parents:
diff changeset
823 // a mark-sweep-compact.
a61af66fc99e Initial load
duke
parents:
diff changeset
824 void do_compaction_work(bool clear_all_soft_refs);
a61af66fc99e Initial load
duke
parents:
diff changeset
825
a61af66fc99e Initial load
duke
parents:
diff changeset
826 // A work method used by the foreground collector to do
a61af66fc99e Initial load
duke
parents:
diff changeset
827 // a mark-sweep, after taking over from a possibly on-going
a61af66fc99e Initial load
duke
parents:
diff changeset
828 // concurrent mark-sweep collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
829 void do_mark_sweep_work(bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
830 CollectorState first_state, bool should_start_over);
a61af66fc99e Initial load
duke
parents:
diff changeset
831
a61af66fc99e Initial load
duke
parents:
diff changeset
832 // If the backgrould GC is active, acquire control from the background
a61af66fc99e Initial load
duke
parents:
diff changeset
833 // GC and do the collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
834 void acquire_control_and_collect(bool full, bool clear_all_soft_refs);
a61af66fc99e Initial load
duke
parents:
diff changeset
835
a61af66fc99e Initial load
duke
parents:
diff changeset
836 // For synchronizing passing of control from background to foreground
a61af66fc99e Initial load
duke
parents:
diff changeset
837 // GC. waitForForegroundGC() is called by the background
a61af66fc99e Initial load
duke
parents:
diff changeset
838 // collector. It if had to wait for a foreground collection,
a61af66fc99e Initial load
duke
parents:
diff changeset
839 // it returns true and the background collection should assume
a61af66fc99e Initial load
duke
parents:
diff changeset
840 // that the collection was finished by the foreground
a61af66fc99e Initial load
duke
parents:
diff changeset
841 // collector.
a61af66fc99e Initial load
duke
parents:
diff changeset
842 bool waitForForegroundGC();
a61af66fc99e Initial load
duke
parents:
diff changeset
843
a61af66fc99e Initial load
duke
parents:
diff changeset
844 // Incremental mode triggering: recompute the icms duty cycle and set the
a61af66fc99e Initial load
duke
parents:
diff changeset
845 // allocation limits in the young gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
846 void icms_update_allocation_limits();
a61af66fc99e Initial load
duke
parents:
diff changeset
847
a61af66fc99e Initial load
duke
parents:
diff changeset
848 size_t block_size_using_printezis_bits(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
849 size_t block_size_if_printezis_bits(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
850 HeapWord* next_card_start_after_block(HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
851
a61af66fc99e Initial load
duke
parents:
diff changeset
852 void setup_cms_unloading_and_verification_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
853 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
854 CMSCollector(ConcurrentMarkSweepGeneration* cmsGen,
a61af66fc99e Initial load
duke
parents:
diff changeset
855 CardTableRS* ct,
a61af66fc99e Initial load
duke
parents:
diff changeset
856 ConcurrentMarkSweepPolicy* cp);
a61af66fc99e Initial load
duke
parents:
diff changeset
857 ConcurrentMarkSweepThread* cmsThread() { return _cmsThread; }
a61af66fc99e Initial load
duke
parents:
diff changeset
858
a61af66fc99e Initial load
duke
parents:
diff changeset
859 ReferenceProcessor* ref_processor() { return _ref_processor; }
a61af66fc99e Initial load
duke
parents:
diff changeset
860 void ref_processor_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
861
a61af66fc99e Initial load
duke
parents:
diff changeset
862 Mutex* bitMapLock() const { return _markBitMap.lock(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
863 static CollectorState abstract_state() { return _collectorState; }
a61af66fc99e Initial load
duke
parents:
diff changeset
864
a61af66fc99e Initial load
duke
parents:
diff changeset
865 bool should_abort_preclean() const; // Whether preclean should be aborted.
a61af66fc99e Initial load
duke
parents:
diff changeset
866 size_t get_eden_used() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
867 size_t get_eden_capacity() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
868
a61af66fc99e Initial load
duke
parents:
diff changeset
869 ConcurrentMarkSweepGeneration* cmsGen() { return _cmsGen; }
a61af66fc99e Initial load
duke
parents:
diff changeset
870
a61af66fc99e Initial load
duke
parents:
diff changeset
871 // locking checks
a61af66fc99e Initial load
duke
parents:
diff changeset
872 NOT_PRODUCT(static bool have_cms_token();)
a61af66fc99e Initial load
duke
parents:
diff changeset
873
a61af66fc99e Initial load
duke
parents:
diff changeset
874 // XXXPERM bool should_collect(bool full, size_t size, bool tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
875 bool shouldConcurrentCollect();
a61af66fc99e Initial load
duke
parents:
diff changeset
876
a61af66fc99e Initial load
duke
parents:
diff changeset
877 void collect(bool full,
a61af66fc99e Initial load
duke
parents:
diff changeset
878 bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
879 size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
880 bool tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
881 void collect_in_background(bool clear_all_soft_refs);
a61af66fc99e Initial load
duke
parents:
diff changeset
882 void collect_in_foreground(bool clear_all_soft_refs);
a61af66fc99e Initial load
duke
parents:
diff changeset
883
a61af66fc99e Initial load
duke
parents:
diff changeset
884 // In support of ExplicitGCInvokesConcurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
885 static void request_full_gc(unsigned int full_gc_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
886 // Should we unload classes in a particular concurrent cycle?
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
887 bool should_unload_classes() const {
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
888 return _should_unload_classes;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
889 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
890 void update_should_unload_classes();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
891
a61af66fc99e Initial load
duke
parents:
diff changeset
892 void direct_allocated(HeapWord* start, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
893
a61af66fc99e Initial load
duke
parents:
diff changeset
894 // Object is dead if not marked and current phase is sweeping.
a61af66fc99e Initial load
duke
parents:
diff changeset
895 bool is_dead_obj(oop obj) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
896
a61af66fc99e Initial load
duke
parents:
diff changeset
897 // After a promotion (of "start"), do any necessary marking.
a61af66fc99e Initial load
duke
parents:
diff changeset
898 // If "par", then it's being done by a parallel GC thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
899 // The last two args indicate if we need precise marking
a61af66fc99e Initial load
duke
parents:
diff changeset
900 // and if so the size of the object so it can be dirtied
a61af66fc99e Initial load
duke
parents:
diff changeset
901 // in its entirety.
a61af66fc99e Initial load
duke
parents:
diff changeset
902 void promoted(bool par, HeapWord* start,
a61af66fc99e Initial load
duke
parents:
diff changeset
903 bool is_obj_array, size_t obj_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
904
a61af66fc99e Initial load
duke
parents:
diff changeset
905 HeapWord* allocation_limit_reached(Space* space, HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
906 size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
907
a61af66fc99e Initial load
duke
parents:
diff changeset
908 void getFreelistLocks() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
909 void releaseFreelistLocks() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
910 bool haveFreelistLocks() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
911
9072
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8035
diff changeset
912 // Adjust size of underlying generation
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8035
diff changeset
913 void compute_new_size();
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8035
diff changeset
914
0
a61af66fc99e Initial load
duke
parents:
diff changeset
915 // GC prologue and epilogue
a61af66fc99e Initial load
duke
parents:
diff changeset
916 void gc_prologue(bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
917 void gc_epilogue(bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
918
a61af66fc99e Initial load
duke
parents:
diff changeset
919 jlong time_of_last_gc(jlong now) {
a61af66fc99e Initial load
duke
parents:
diff changeset
920 if (_collectorState <= Idling) {
a61af66fc99e Initial load
duke
parents:
diff changeset
921 // gc not in progress
a61af66fc99e Initial load
duke
parents:
diff changeset
922 return _time_of_last_gc;
a61af66fc99e Initial load
duke
parents:
diff changeset
923 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
924 // collection in progress
a61af66fc99e Initial load
duke
parents:
diff changeset
925 return now;
a61af66fc99e Initial load
duke
parents:
diff changeset
926 }
a61af66fc99e Initial load
duke
parents:
diff changeset
927 }
a61af66fc99e Initial load
duke
parents:
diff changeset
928
a61af66fc99e Initial load
duke
parents:
diff changeset
929 // Support for parallel remark of survivor space
a61af66fc99e Initial load
duke
parents:
diff changeset
930 void* get_data_recorder(int thr_num);
a61af66fc99e Initial load
duke
parents:
diff changeset
931
a61af66fc99e Initial load
duke
parents:
diff changeset
932 CMSBitMap* markBitMap() { return &_markBitMap; }
a61af66fc99e Initial load
duke
parents:
diff changeset
933 void directAllocated(HeapWord* start, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
934
a61af66fc99e Initial load
duke
parents:
diff changeset
935 // main CMS steps and related support
a61af66fc99e Initial load
duke
parents:
diff changeset
936 void checkpointRootsInitial(bool asynch);
a61af66fc99e Initial load
duke
parents:
diff changeset
937 bool markFromRoots(bool asynch); // a return value of false indicates failure
a61af66fc99e Initial load
duke
parents:
diff changeset
938 // due to stack overflow
a61af66fc99e Initial load
duke
parents:
diff changeset
939 void preclean();
a61af66fc99e Initial load
duke
parents:
diff changeset
940 void checkpointRootsFinal(bool asynch, bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
941 bool init_mark_was_synchronous);
a61af66fc99e Initial load
duke
parents:
diff changeset
942 void sweep(bool asynch);
a61af66fc99e Initial load
duke
parents:
diff changeset
943
a61af66fc99e Initial load
duke
parents:
diff changeset
944 // Check that the currently executing thread is the expected
a61af66fc99e Initial load
duke
parents:
diff changeset
945 // one (foreground collector or background collector).
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
946 static void check_correct_thread_executing() PRODUCT_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
947 // XXXPERM void print_statistics() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
948
a61af66fc99e Initial load
duke
parents:
diff changeset
949 bool is_cms_reachable(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
950
a61af66fc99e Initial load
duke
parents:
diff changeset
951 // Performance Counter Support
a61af66fc99e Initial load
duke
parents:
diff changeset
952 CollectorCounters* counters() { return _gc_counters; }
a61af66fc99e Initial load
duke
parents:
diff changeset
953
a61af66fc99e Initial load
duke
parents:
diff changeset
954 // timer stuff
a61af66fc99e Initial load
duke
parents:
diff changeset
955 void startTimer() { assert(!_timer.is_active(), "Error"); _timer.start(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
956 void stopTimer() { assert( _timer.is_active(), "Error"); _timer.stop(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
957 void resetTimer() { assert(!_timer.is_active(), "Error"); _timer.reset(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
958 double timerValue() { assert(!_timer.is_active(), "Error"); return _timer.seconds(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
959
a61af66fc99e Initial load
duke
parents:
diff changeset
960 int yields() { return _numYields; }
a61af66fc99e Initial load
duke
parents:
diff changeset
961 void resetYields() { _numYields = 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
962 void incrementYields() { _numYields++; }
a61af66fc99e Initial load
duke
parents:
diff changeset
963 void resetNumDirtyCards() { _numDirtyCards = 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
964 void incrementNumDirtyCards(size_t num) { _numDirtyCards += num; }
a61af66fc99e Initial load
duke
parents:
diff changeset
965 size_t numDirtyCards() { return _numDirtyCards; }
a61af66fc99e Initial load
duke
parents:
diff changeset
966
a61af66fc99e Initial load
duke
parents:
diff changeset
967 static bool foregroundGCShouldWait() { return _foregroundGCShouldWait; }
a61af66fc99e Initial load
duke
parents:
diff changeset
968 static void set_foregroundGCShouldWait(bool v) { _foregroundGCShouldWait = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
969 static bool foregroundGCIsActive() { return _foregroundGCIsActive; }
a61af66fc99e Initial load
duke
parents:
diff changeset
970 static void set_foregroundGCIsActive(bool v) { _foregroundGCIsActive = v; }
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
971 size_t sweep_count() const { return _sweep_count; }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
972 void increment_sweep_count() { _sweep_count++; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
973
a61af66fc99e Initial load
duke
parents:
diff changeset
974 // Timers/stats for gc scheduling and incremental mode pacing.
a61af66fc99e Initial load
duke
parents:
diff changeset
975 CMSStats& stats() { return _stats; }
a61af66fc99e Initial load
duke
parents:
diff changeset
976
a61af66fc99e Initial load
duke
parents:
diff changeset
977 // Convenience methods that check whether CMSIncrementalMode is enabled and
a61af66fc99e Initial load
duke
parents:
diff changeset
978 // forward to the corresponding methods in ConcurrentMarkSweepThread.
a61af66fc99e Initial load
duke
parents:
diff changeset
979 static void start_icms();
a61af66fc99e Initial load
duke
parents:
diff changeset
980 static void stop_icms(); // Called at the end of the cms cycle.
a61af66fc99e Initial load
duke
parents:
diff changeset
981 static void disable_icms(); // Called before a foreground collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
982 static void enable_icms(); // Called after a foreground collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
983 void icms_wait(); // Called at yield points.
a61af66fc99e Initial load
duke
parents:
diff changeset
984
a61af66fc99e Initial load
duke
parents:
diff changeset
985 // Adaptive size policy
a61af66fc99e Initial load
duke
parents:
diff changeset
986 CMSAdaptiveSizePolicy* size_policy();
a61af66fc99e Initial load
duke
parents:
diff changeset
987 CMSGCAdaptivePolicyCounters* gc_adaptive_policy_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
988
9076
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 9072
diff changeset
989 static void print_on_error(outputStream* st);
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 9072
diff changeset
990
0
a61af66fc99e Initial load
duke
parents:
diff changeset
991 // debugging
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 3827
diff changeset
992 void verify();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
993 bool verify_after_remark();
a61af66fc99e Initial load
duke
parents:
diff changeset
994 void verify_ok_to_terminate() const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
995 void verify_work_stacks_empty() const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
996 void verify_overflow_empty() const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
997
a61af66fc99e Initial load
duke
parents:
diff changeset
998 // convenience methods in support of debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
999 static const size_t skip_header_HeapWords() PRODUCT_RETURN0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 HeapWord* block_start(const void* p) const PRODUCT_RETURN0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1001
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 // accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 CMSMarkStack* verification_mark_stack() { return &_markStack; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 CMSBitMap* verification_mark_bm() { return &_verification_mark_bm; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1005
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 // Initialization errors
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 bool completed_initialization() { return _completed_initialization; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1009
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 class CMSExpansionCause : public AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 enum Cause {
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 _no_expansion,
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 _satisfy_free_ratio,
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 _satisfy_promotion,
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 _satisfy_allocation,
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 _allocate_par_lab,
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 _allocate_par_spooling_space,
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 _adaptive_size_policy
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 // Return a string describing the cause of the expansion.
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 static const char* to_string(CMSExpansionCause::Cause cause);
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1024
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 class ConcurrentMarkSweepGeneration: public CardGeneration {
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 friend class ConcurrentMarkSweepThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 friend class ConcurrentMarkSweep;
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 friend class CMSCollector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 static CMSCollector* _collector; // the collector that collects us
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 CompactibleFreeListSpace* _cmsSpace; // underlying space (only one for now)
a61af66fc99e Initial load
duke
parents:
diff changeset
1033
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 // Performance Counters
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 GenerationCounters* _gen_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 GSpaceCounters* _space_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
1037
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 // Words directly allocated, used by CMSStats.
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 size_t _direct_allocated_words;
a61af66fc99e Initial load
duke
parents:
diff changeset
1040
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 // Non-product stat counters
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 NOT_PRODUCT(
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1703
diff changeset
1043 size_t _numObjectsPromoted;
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1703
diff changeset
1044 size_t _numWordsPromoted;
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1703
diff changeset
1045 size_t _numObjectsAllocated;
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1703
diff changeset
1046 size_t _numWordsAllocated;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1048
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 // Used for sizing decisions
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 bool _incremental_collection_failed;
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 bool incremental_collection_failed() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 return _incremental_collection_failed;
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 void set_incremental_collection_failed() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 _incremental_collection_failed = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 void clear_incremental_collection_failed() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 _incremental_collection_failed = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1060
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1061 // accessors
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1062 void set_expansion_cause(CMSExpansionCause::Cause v) { _expansion_cause = v;}
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1063 CMSExpansionCause::Cause expansion_cause() const { return _expansion_cause; }
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1064
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 // For parallel young-gen GC support.
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 CMSParGCThreadState** _par_gc_thread_states;
a61af66fc99e Initial load
duke
parents:
diff changeset
1068
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 // Reason generation was expanded
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 CMSExpansionCause::Cause _expansion_cause;
a61af66fc99e Initial load
duke
parents:
diff changeset
1071
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 // In support of MinChunkSize being larger than min object size
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 const double _dilatation_factor;
a61af66fc99e Initial load
duke
parents:
diff changeset
1074
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 enum CollectionTypes {
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 Concurrent_collection_type = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 MS_foreground_collection_type = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 MSC_foreground_collection_type = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 Unknown_collection_type = 3
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1081
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 CollectionTypes _debug_collection_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
1083
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1084 // Fraction of current occupancy at which to start a CMS collection which
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1085 // will collect this generation (at least).
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1086 double _initiating_occupancy;
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1087
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 // Shrink generation by specified size (returns false if unable to shrink)
9072
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8035
diff changeset
1090 void shrink_free_list_by(size_t bytes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1091
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 // Update statistics for GC
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 virtual void update_gc_stats(int level, bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1094
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 // Maximum available space in the generation (including uncommitted)
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 // space.
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 size_t max_available() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1098
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1099 // getter and initializer for _initiating_occupancy field.
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1100 double initiating_occupancy() const { return _initiating_occupancy; }
8035
f64ffbf81af5 8006432: Ratio flags should be unsigned
jwilhelm
parents: 6725
diff changeset
1101 void init_initiating_occupancy(intx io, uintx tr);
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1102
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 ConcurrentMarkSweepGeneration(ReservedSpace rs, size_t initial_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 int level, CardTableRS* ct,
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 bool use_adaptive_freelists,
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
1107 FreeBlockDictionary<FreeChunk>::DictionaryChoice);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1108
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 CMSCollector* collector() const { return _collector; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 static void set_collector(CMSCollector* collector) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 assert(_collector == NULL, "already set");
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 _collector = collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 CompactibleFreeListSpace* cmsSpace() const { return _cmsSpace; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1116
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 Mutex* freelistLock() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1118
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 virtual Generation::Name kind() { return Generation::ConcurrentMarkSweep; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1120
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 // Adaptive size policy
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 CMSAdaptiveSizePolicy* size_policy();
a61af66fc99e Initial load
duke
parents:
diff changeset
1123
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 bool refs_discovery_is_atomic() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 bool refs_discovery_is_mt() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 // Note: CMS does MT-discovery during the parallel-remark
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 // phases. Use ReferenceProcessorMTMutator to make refs
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 // discovery MT-safe during such phases or other parallel
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 // discovery phases in the future. This may all go away
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 // if/when we decide that refs discovery is sufficiently
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 // rare that the cost of the CAS's involved is in the
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 // noise. That's a measurement that should be done, and
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 // the code simplified if that turns out to be the case.
2369
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 2132
diff changeset
1134 return ConcGCThreads > 1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1136
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 // Override
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 virtual void ref_processor_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
1139
271
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 196
diff changeset
1140 // Grow generation by specified size (returns false if unable to grow)
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 196
diff changeset
1141 bool grow_by(size_t bytes);
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 196
diff changeset
1142 // Grow generation to reserved size.
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 196
diff changeset
1143 bool grow_to_reserved();
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 196
diff changeset
1144
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 void clear_expansion_cause() { _expansion_cause = CMSExpansionCause::_no_expansion; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1146
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 // Space enquiries
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 size_t capacity() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 size_t used() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 size_t free() const;
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1151 double occupancy() const { return ((double)used())/((double)capacity()); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 size_t contiguous_available() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 size_t unsafe_max_alloc_nogc() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1154
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 // over-rides
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 MemRegion used_region() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 MemRegion used_region_at_save_marks() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1158
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 // Does a "full" (forced) collection invoked on this generation collect
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 // all younger generations as well? Note that the second conjunct is a
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 // hack to allow the collection of the younger gen first if the flag is
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 // set. This is better than using th policy's should_collect_gen0_first()
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 // since that causes us to do an extra unnecessary pair of restart-&-stop-world.
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 virtual bool full_collects_younger_generations() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 return UseCMSCompactAtFullCollection && !CollectGen0First;
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1167
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 void space_iterate(SpaceClosure* blk, bool usedOnly = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1169
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 // Support for compaction
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 CompactibleSpace* first_compaction_space() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 // Adjust quantites in the generation affected by
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 // the compaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 void reset_after_compaction();
a61af66fc99e Initial load
duke
parents:
diff changeset
1175
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 // Allocation support
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 HeapWord* allocate(size_t size, bool tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 HeapWord* have_lock_and_allocate(size_t size, bool tlab);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1179 oop promote(oop obj, size_t obj_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 HeapWord* par_allocate(size_t size, bool tlab) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 return allocate(size, tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1183
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 // Incremental mode triggering.
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 HeapWord* allocation_limit_reached(Space* space, HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 size_t word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1187
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 // Used by CMSStats to track direct allocation. The value is sampled and
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 // reset after each young gen collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 size_t direct_allocated_words() const { return _direct_allocated_words; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 void reset_direct_allocated_words() { _direct_allocated_words = 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1192
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 // Overrides for parallel promotion.
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 virtual oop par_promote(int thread_num,
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 oop obj, markOop m, size_t word_sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 // This one should not be called for CMS.
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 virtual void par_promote_alloc_undo(int thread_num,
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 HeapWord* obj, size_t word_sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 virtual void par_promote_alloc_done(int thread_num);
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 virtual void par_oop_since_save_marks_iterate_done(int thread_num);
a61af66fc99e Initial load
duke
parents:
diff changeset
1201
1888
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1836
diff changeset
1202 virtual bool promotion_attempt_is_safe(size_t promotion_in_bytes) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1203
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
1204 // Inform this (non-young) generation that a promotion failure was
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
1205 // encountered during a collection of a younger generation that
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
1206 // promotes into this generation.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
1207 virtual void promotion_failure_occurred();
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 935
diff changeset
1208
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 bool should_collect(bool full, size_t size, bool tlab);
94
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1210 virtual bool should_concurrent_collect() const;
0834225a7916 6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction
ysr
parents: 0
diff changeset
1211 virtual bool is_too_full() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 void collect(bool full,
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 bool tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
1216
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 HeapWord* expand_and_allocate(size_t word_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 bool tlab,
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 bool parallel = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1220
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 // GC prologue and epilogue
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 void gc_prologue(bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 void gc_prologue_work(bool full, bool registerClosure,
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 ModUnionClosure* modUnionClosure);
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 void gc_epilogue(bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 void gc_epilogue_work(bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
1227
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 // Time since last GC of this generation
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 jlong time_of_last_gc(jlong now) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 return collector()->time_of_last_gc(now);
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 void update_time_of_last_gc(jlong now) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 collector()-> update_time_of_last_gc(now);
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1235
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 // Allocation failure
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 void expand(size_t bytes, size_t expand_bytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 CMSExpansionCause::Cause cause);
271
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 196
diff changeset
1239 virtual bool expand(size_t bytes, size_t expand_bytes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 void shrink(size_t bytes);
9072
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8035
diff changeset
1241 void shrink_by(size_t bytes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 HeapWord* expand_and_par_lab_allocate(CMSParGCThreadState* ps, size_t word_sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 bool expand_and_ensure_spooling_space(PromotionInfo* promo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1244
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 // Iteration support and related enquiries
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 void save_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 bool no_allocs_since_save_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 void object_iterate_since_last_GC(ObjectClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 void younger_refs_iterate(OopsInGenClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
1250
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 // Iteration support specific to CMS generations
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 void save_sweep_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
1253
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 // More iteration support
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1255 virtual void oop_iterate(MemRegion mr, ExtendedOopClosure* cl);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1256 virtual void oop_iterate(ExtendedOopClosure* cl);
517
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 452
diff changeset
1257 virtual void safe_object_iterate(ObjectClosure* cl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 virtual void object_iterate(ObjectClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
1259
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 // Need to declare the full complement of closures, whether we'll
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 // override them or not, or get message from the compiler:
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 // oop_since_save_marks_iterate_nv hides virtual function...
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 #define CMS_SINCE_SAVE_MARKS_DECL(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 void oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 ALL_SINCE_SAVE_MARKS_CLOSURES(CMS_SINCE_SAVE_MARKS_DECL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1266
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 // Smart allocation XXX -- move to CFLSpace?
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 void setNearLargestChunk();
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 bool isNearLargestChunk(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1270
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 // Get the chunk at the end of the space. Delagates to
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 // the space.
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 FreeChunk* find_chunk_at_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
1274
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 void post_compact();
a61af66fc99e Initial load
duke
parents:
diff changeset
1276
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 void prepare_for_verify();
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 3827
diff changeset
1279 void verify();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 void print_statistics() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1281
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 // Performance Counters support
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 virtual void update_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 virtual void update_counters(size_t used);
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 void initialize_performance_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 CollectorCounters* counters() { return collector()->counters(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1287
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 // Support for parallel remark of survivor space
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 void* get_data_recorder(int thr_num) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 //Delegate to collector
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 return collector()->get_data_recorder(thr_num);
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1293
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 // Printing
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 const char* name() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 virtual const char* short_name() const { return "CMS"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 void print() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 void printOccupancy(const char* s);
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 bool must_be_youngest() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 bool must_be_oldest() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1301
9072
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8035
diff changeset
1302 // Resize the generation after a compacting GC. The
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8035
diff changeset
1303 // generation can be treated as a contiguous space
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8035
diff changeset
1304 // after the compaction.
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8035
diff changeset
1305 virtual void compute_new_size();
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8035
diff changeset
1306 // Resize the generation after a non-compacting
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8035
diff changeset
1307 // collection.
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8035
diff changeset
1308 void compute_new_size_free_list();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1309
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 CollectionTypes debug_collection_type() { return _debug_collection_type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 void rotate_debug_collection_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1313
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 class ASConcurrentMarkSweepGeneration : public ConcurrentMarkSweepGeneration {
a61af66fc99e Initial load
duke
parents:
diff changeset
1315
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 // Return the size policy from the heap's collector
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 // policy casted to CMSAdaptiveSizePolicy*.
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 CMSAdaptiveSizePolicy* cms_size_policy() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1319
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 // Resize the generation based on the adaptive size
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 // policy.
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 void resize(size_t cur_promo, size_t desired_promo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1323
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 // Return the GC counters from the collector policy
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 CMSGCAdaptivePolicyCounters* gc_adaptive_policy_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1326
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 virtual void shrink_by(size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
1328
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 ASConcurrentMarkSweepGeneration(ReservedSpace rs, size_t initial_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 int level, CardTableRS* ct,
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 bool use_adaptive_freelists,
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 6008
diff changeset
1333 FreeBlockDictionary<FreeChunk>::DictionaryChoice
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 dictionaryChoice) :
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 ConcurrentMarkSweepGeneration(rs, initial_byte_size, level, ct,
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 use_adaptive_freelists, dictionaryChoice) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1337
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 virtual const char* short_name() const { return "ASCMS"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 virtual Generation::Name kind() { return Generation::ASConcurrentMarkSweep; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1340
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 virtual void update_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 virtual void update_counters(size_t used);
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1344
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 // Closures of various sorts used by CMS to accomplish its work
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1348
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 // This closure is used to check that a certain set of oops is empty.
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 class FalseClosure: public OopClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 public:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1352 void do_oop(oop* p) { guarantee(false, "Should be an empty set"); }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1353 void do_oop(narrowOop* p) { guarantee(false, "Should be an empty set"); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1355
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 // This closure is used to do concurrent marking from the roots
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 // following the first checkpoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 class MarkFromRootsClosure: public BitMapClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 CMSBitMap* _bitMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 CMSBitMap* _mut;
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 CMSMarkStack* _markStack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 bool _yield;
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 int _skipBits;
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 HeapWord* _finger;
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 HeapWord* _threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 DEBUG_ONLY(bool _verifying;)
a61af66fc99e Initial load
duke
parents:
diff changeset
1369
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 MarkFromRootsClosure(CMSCollector* collector, MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 CMSBitMap* bitMap,
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 CMSMarkStack* markStack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 bool should_yield, bool verifying = false);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 143
diff changeset
1375 bool do_bit(size_t offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 void reset(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 inline void do_yield_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
1378
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 void scanOopsInOop(HeapWord* ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 void do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1383
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 // This closure is used to do concurrent multi-threaded
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 // marking from the roots following the first checkpoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 // XXX This should really be a subclass of The serial version
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 // above, but i have not had the time to refactor things cleanly.
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 // That willbe done for Dolphin.
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 class Par_MarkFromRootsClosure: public BitMapClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 MemRegion _whole_span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 CMSBitMap* _mut;
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 OopTaskQueue* _work_queue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 CMSMarkStack* _overflow_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 bool _yield;
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 int _skip_bits;
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 HeapWord* _finger;
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 HeapWord* _threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 CMSConcMarkingTask* _task;
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 Par_MarkFromRootsClosure(CMSConcMarkingTask* task, CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 OopTaskQueue* work_queue,
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 CMSMarkStack* overflow_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 bool should_yield);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 143
diff changeset
1409 bool do_bit(size_t offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 inline void do_yield_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
1411
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 void scan_oops_in_oop(HeapWord* ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 void do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 bool get_work_from_overflow_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1417
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 // The following closures are used to do certain kinds of verification of
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 // CMS marking.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1420 class PushAndMarkVerifyClosure: public CMSOopClosure {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 CMSBitMap* _verification_bm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 CMSBitMap* _cms_bm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 CMSMarkStack* _mark_stack;
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1426 protected:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1427 void do_oop(oop p);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1428 template <class T> inline void do_oop_work(T *p) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1429 oop obj = oopDesc::load_decode_heap_oop(p);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1430 do_oop(obj);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1431 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 PushAndMarkVerifyClosure(CMSCollector* cms_collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 CMSBitMap* verification_bm,
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 CMSBitMap* cms_bm,
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 CMSMarkStack* mark_stack);
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 void do_oop(oop* p);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 94
diff changeset
1439 void do_oop(narrowOop* p);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1440
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 // Deal with a stack overflow condition
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 void handle_stack_overflow(HeapWord* lost);
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1444
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 class MarkFromRootsVerifyClosure: public BitMapClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 CMSBitMap* _verification_bm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 CMSBitMap* _cms_bm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 CMSMarkStack* _mark_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 HeapWord* _finger;
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 PushAndMarkVerifyClosure _pam_verify_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 MarkFromRootsVerifyClosure(CMSCollector* collector, MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 CMSBitMap* verification_bm,
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 CMSBitMap* cms_bm,
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 CMSMarkStack* mark_stack);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 143
diff changeset
1458 bool do_bit(size_t offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 void reset(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1461
a61af66fc99e Initial load
duke
parents:
diff changeset
1462
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 // This closure is used to check that a certain set of bits is
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 // "empty" (i.e. the bit vector doesn't have any 1-bits).
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 class FalseBitMapClosure: public BitMapClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 public:
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 143
diff changeset
1467 bool do_bit(size_t offset) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 guarantee(false, "Should not have a 1 bit");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 143
diff changeset
1469 return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1472
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 // This closure is used during the second checkpointing phase
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 // to rescan the marked objects on the dirty cards in the mod
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 // union table and the card table proper. It's invoked via
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 // MarkFromDirtyCardsClosure below. It uses either
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 // [Par_]MarkRefsIntoAndScanClosure (Par_ in the parallel case)
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 // declared in genOopClosures.hpp to accomplish some of its work.
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 // In the parallel case the bitMap is shared, so access to
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 // it needs to be suitably synchronized for updates by embedded
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 // closures that update it; however, this closure itself only
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 // reads the bit_map and because it is idempotent, is immune to
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 // reading stale values.
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 class ScanMarkedObjectsAgainClosure: public UpwardsObjectClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 union {
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 CMSMarkStack* _mark_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 OopTaskQueue* _work_queue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 bool _parallel;
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 union {
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 MarkRefsIntoAndScanClosure* _scan_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 Par_MarkRefsIntoAndScanClosure* _par_scan_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1499
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 ScanMarkedObjectsAgainClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 ReferenceProcessor* rp,
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 CMSMarkStack* mark_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 MarkRefsIntoAndScanClosure* cl):
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 _span(span),
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 _mark_stack(mark_stack),
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 _parallel(false),
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 _bit_map(bit_map),
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 _scan_closure(cl) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1515
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 ScanMarkedObjectsAgainClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 ReferenceProcessor* rp,
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 OopTaskQueue* work_queue,
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 Par_MarkRefsIntoAndScanClosure* cl):
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 _span(span),
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 _work_queue(work_queue),
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 _parallel(true),
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 _bit_map(bit_map),
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 _par_scan_closure(cl) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1530
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 void do_object(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 guarantee(false, "Call do_object_b(oop, MemRegion) instead");
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 bool do_object_b(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 guarantee(false, "Call do_object_b(oop, MemRegion) form instead");
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 bool do_object_bm(oop p, MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1540
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 // This closure is used during the second checkpointing phase
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 // to rescan the marked objects on the dirty cards in the mod
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 // union table and the card table proper. It invokes
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 // ScanMarkedObjectsAgainClosure above to accomplish much of its work.
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 // In the parallel case, the bit map is shared and requires
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 // synchronized access.
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 class MarkFromDirtyCardsClosure: public MemRegionClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 CompactibleFreeListSpace* _space;
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 ScanMarkedObjectsAgainClosure _scan_cl;
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 size_t _num_dirty_cards;
a61af66fc99e Initial load
duke
parents:
diff changeset
1551
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 MarkFromDirtyCardsClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 CompactibleFreeListSpace* space,
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 CMSMarkStack* mark_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 MarkRefsIntoAndScanClosure* cl):
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 _space(space),
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 _num_dirty_cards(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 _scan_cl(collector, span, collector->ref_processor(), bit_map,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1562 mark_stack, cl) { }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1563
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 MarkFromDirtyCardsClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 CompactibleFreeListSpace* space,
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 OopTaskQueue* work_queue,
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 Par_MarkRefsIntoAndScanClosure* cl):
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 _space(space),
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 _num_dirty_cards(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 _scan_cl(collector, span, collector->ref_processor(), bit_map,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1573 work_queue, cl) { }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1574
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 void do_MemRegion(MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 void set_space(CompactibleFreeListSpace* space) { _space = space; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 size_t num_dirty_cards() { return _num_dirty_cards; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1579
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 // This closure is used in the non-product build to check
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 // that there are no MemRegions with a certain property.
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 class FalseMemRegionClosure: public MemRegionClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 void do_MemRegion(MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 guarantee(!mr.is_empty(), "Shouldn't be empty");
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 guarantee(false, "Should never be here");
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1588
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 // This closure is used during the precleaning phase
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 // to "carefully" rescan marked objects on dirty cards.
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 // It uses MarkRefsIntoAndScanClosure declared in genOopClosures.hpp
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 // to accomplish some of its work.
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 class ScanMarkedObjectsAgainCarefullyClosure: public ObjectClosureCareful {
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 bool _yield;
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 Mutex* _freelistLock;
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 CMSBitMap* _bitMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 CMSMarkStack* _markStack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 MarkRefsIntoAndScanClosure* _scanningClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
1601
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 ScanMarkedObjectsAgainCarefullyClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 CMSBitMap* bitMap,
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 CMSMarkStack* markStack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 MarkRefsIntoAndScanClosure* cl,
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 bool should_yield):
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 _span(span),
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 _yield(should_yield),
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 _bitMap(bitMap),
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 _markStack(markStack),
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 _scanningClosure(cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1616
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 void do_object(oop p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 guarantee(false, "call do_object_careful instead");
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1620
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 size_t do_object_careful(oop p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 guarantee(false, "Unexpected caller");
a61af66fc99e Initial load
duke
parents:
diff changeset
1623 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1624 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1625
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 size_t do_object_careful_m(oop p, MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1627
a61af66fc99e Initial load
duke
parents:
diff changeset
1628 void setFreelistLock(Mutex* m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1629 _freelistLock = m;
a61af66fc99e Initial load
duke
parents:
diff changeset
1630 _scanningClosure->set_freelistLock(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1631 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1632
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1634 inline bool do_yield_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
1635
a61af66fc99e Initial load
duke
parents:
diff changeset
1636 void do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
1637 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1638
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 class SurvivorSpacePrecleanClosure: public ObjectClosureCareful {
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1641 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1642 bool _yield;
a61af66fc99e Initial load
duke
parents:
diff changeset
1643 CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1644 CMSMarkStack* _mark_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 PushAndMarkClosure* _scanning_closure;
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 unsigned int _before_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
1647
a61af66fc99e Initial load
duke
parents:
diff changeset
1648 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 SurvivorSpacePrecleanClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 CMSMarkStack* mark_stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 PushAndMarkClosure* cl,
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 unsigned int before_count,
a61af66fc99e Initial load
duke
parents:
diff changeset
1655 bool should_yield):
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 _span(span),
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 _yield(should_yield),
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 _bit_map(bit_map),
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 _mark_stack(mark_stack),
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 _scanning_closure(cl),
a61af66fc99e Initial load
duke
parents:
diff changeset
1662 _before_count(before_count)
a61af66fc99e Initial load
duke
parents:
diff changeset
1663 { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1664
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 void do_object(oop p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 guarantee(false, "call do_object_careful instead");
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1668
a61af66fc99e Initial load
duke
parents:
diff changeset
1669 size_t do_object_careful(oop p);
a61af66fc99e Initial load
duke
parents:
diff changeset
1670
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 size_t do_object_careful_m(oop p, MemRegion mr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 guarantee(false, "Unexpected caller");
a61af66fc99e Initial load
duke
parents:
diff changeset
1673 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1674 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1675
a61af66fc99e Initial load
duke
parents:
diff changeset
1676 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1677 inline void do_yield_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 void do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1680
a61af66fc99e Initial load
duke
parents:
diff changeset
1681 // This closure is used to accomplish the sweeping work
a61af66fc99e Initial load
duke
parents:
diff changeset
1682 // after the second checkpoint but before the concurrent reset
a61af66fc99e Initial load
duke
parents:
diff changeset
1683 // phase.
a61af66fc99e Initial load
duke
parents:
diff changeset
1684 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 // Terminology
a61af66fc99e Initial load
duke
parents:
diff changeset
1686 // left hand chunk (LHC) - block of one or more chunks currently being
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 // coalesced. The LHC is available for coalescing with a new chunk.
a61af66fc99e Initial load
duke
parents:
diff changeset
1688 // right hand chunk (RHC) - block that is currently being swept that is
a61af66fc99e Initial load
duke
parents:
diff changeset
1689 // free or garbage that can be coalesced with the LHC.
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 // _inFreeRange is true if there is currently a LHC
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 // _lastFreeRangeCoalesced is true if the LHC consists of more than one chunk.
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 // _freeRangeInFreeLists is true if the LHC is in the free lists.
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 // _freeFinger is the address of the current LHC
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 class SweepClosure: public BlkClosureCareful {
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 CMSCollector* _collector; // collector doing the work
a61af66fc99e Initial load
duke
parents:
diff changeset
1696 ConcurrentMarkSweepGeneration* _g; // Generation being swept
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 CompactibleFreeListSpace* _sp; // Space being swept
3746
537a4053b0f9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 3356
diff changeset
1698 HeapWord* _limit;// the address at or above which the sweep should stop
537a4053b0f9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 3356
diff changeset
1699 // because we do not expect newly garbage blocks
537a4053b0f9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 3356
diff changeset
1700 // eligible for sweeping past that address.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 Mutex* _freelistLock; // Free list lock (in space)
a61af66fc99e Initial load
duke
parents:
diff changeset
1702 CMSBitMap* _bitMap; // Marking bit map (in
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 // generation)
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 bool _inFreeRange; // Indicates if we are in the
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 // midst of a free run
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 bool _freeRangeInFreeLists;
a61af66fc99e Initial load
duke
parents:
diff changeset
1707 // Often, we have just found
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 // a free chunk and started
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 // a new free range; we do not
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 // eagerly remove this chunk from
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 // the free lists unless there is
a61af66fc99e Initial load
duke
parents:
diff changeset
1712 // a possibility of coalescing.
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 // When true, this flag indicates
a61af66fc99e Initial load
duke
parents:
diff changeset
1714 // that the _freeFinger below
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 // points to a potentially free chunk
a61af66fc99e Initial load
duke
parents:
diff changeset
1716 // that may still be in the free lists
a61af66fc99e Initial load
duke
parents:
diff changeset
1717 bool _lastFreeRangeCoalesced;
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 // free range contains chunks
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 // coalesced
a61af66fc99e Initial load
duke
parents:
diff changeset
1720 bool _yield;
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 // Whether sweeping should be
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 // done with yields. For instance
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 // when done by the foreground
a61af66fc99e Initial load
duke
parents:
diff changeset
1724 // collector we shouldn't yield.
a61af66fc99e Initial load
duke
parents:
diff changeset
1725 HeapWord* _freeFinger; // When _inFreeRange is set, the
a61af66fc99e Initial load
duke
parents:
diff changeset
1726 // pointer to the "left hand
a61af66fc99e Initial load
duke
parents:
diff changeset
1727 // chunk"
a61af66fc99e Initial load
duke
parents:
diff changeset
1728 size_t _freeRangeSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
1729 // When _inFreeRange is set, this
a61af66fc99e Initial load
duke
parents:
diff changeset
1730 // indicates the accumulated size
a61af66fc99e Initial load
duke
parents:
diff changeset
1731 // of the "left hand chunk"
a61af66fc99e Initial load
duke
parents:
diff changeset
1732 NOT_PRODUCT(
a61af66fc99e Initial load
duke
parents:
diff changeset
1733 size_t _numObjectsFreed;
a61af66fc99e Initial load
duke
parents:
diff changeset
1734 size_t _numWordsFreed;
a61af66fc99e Initial load
duke
parents:
diff changeset
1735 size_t _numObjectsLive;
a61af66fc99e Initial load
duke
parents:
diff changeset
1736 size_t _numWordsLive;
a61af66fc99e Initial load
duke
parents:
diff changeset
1737 size_t _numObjectsAlreadyFree;
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 size_t _numWordsAlreadyFree;
a61af66fc99e Initial load
duke
parents:
diff changeset
1739 FreeChunk* _last_fc;
a61af66fc99e Initial load
duke
parents:
diff changeset
1740 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1741 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1742 // Code that is common to a free chunk or garbage when
a61af66fc99e Initial load
duke
parents:
diff changeset
1743 // encountered during sweeping.
2132
4947ee68d19c 7008136: CMS: assert((HeapWord*)nextChunk <= _limit) failed: sweep invariant
ysr
parents: 1972
diff changeset
1744 void do_post_free_or_garbage_chunk(FreeChunk *fc, size_t chunkSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1745 // Process a free chunk during sweeping.
2132
4947ee68d19c 7008136: CMS: assert((HeapWord*)nextChunk <= _limit) failed: sweep invariant
ysr
parents: 1972
diff changeset
1746 void do_already_free_chunk(FreeChunk *fc);
3746
537a4053b0f9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 3356
diff changeset
1747 // Work method called when processing an already free or a
537a4053b0f9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 3356
diff changeset
1748 // freshly garbage chunk to do a lookahead and possibly a
537a4053b0f9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 3356
diff changeset
1749 // premptive flush if crossing over _limit.
537a4053b0f9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 3356
diff changeset
1750 void lookahead_and_flush(FreeChunk* fc, size_t chunkSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1751 // Process a garbage chunk during sweeping.
2132
4947ee68d19c 7008136: CMS: assert((HeapWord*)nextChunk <= _limit) failed: sweep invariant
ysr
parents: 1972
diff changeset
1752 size_t do_garbage_chunk(FreeChunk *fc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1753 // Process a live chunk during sweeping.
2132
4947ee68d19c 7008136: CMS: assert((HeapWord*)nextChunk <= _limit) failed: sweep invariant
ysr
parents: 1972
diff changeset
1754 size_t do_live_chunk(FreeChunk* fc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1755
a61af66fc99e Initial load
duke
parents:
diff changeset
1756 // Accessors.
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 HeapWord* freeFinger() const { return _freeFinger; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1758 void set_freeFinger(HeapWord* v) { _freeFinger = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1759 bool inFreeRange() const { return _inFreeRange; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 void set_inFreeRange(bool v) { _inFreeRange = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1761 bool lastFreeRangeCoalesced() const { return _lastFreeRangeCoalesced; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1762 void set_lastFreeRangeCoalesced(bool v) { _lastFreeRangeCoalesced = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 bool freeRangeInFreeLists() const { return _freeRangeInFreeLists; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 void set_freeRangeInFreeLists(bool v) { _freeRangeInFreeLists = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1765
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 // Initialize a free range.
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 void initialize_free_range(HeapWord* freeFinger, bool freeRangeInFreeLists);
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 // Return this chunk to the free lists.
2132
4947ee68d19c 7008136: CMS: assert((HeapWord*)nextChunk <= _limit) failed: sweep invariant
ysr
parents: 1972
diff changeset
1769 void flush_cur_free_chunk(HeapWord* chunk, size_t size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1770
a61af66fc99e Initial load
duke
parents:
diff changeset
1771 // Check if we should yield and do so when necessary.
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 inline void do_yield_check(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1773
a61af66fc99e Initial load
duke
parents:
diff changeset
1774 // Yield
a61af66fc99e Initial load
duke
parents:
diff changeset
1775 void do_yield_work(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1776
a61af66fc99e Initial load
duke
parents:
diff changeset
1777 // Debugging/Printing
3746
537a4053b0f9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 3356
diff changeset
1778 void print_free_block_coalesced(FreeChunk* fc) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1779
a61af66fc99e Initial load
duke
parents:
diff changeset
1780 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 SweepClosure(CMSCollector* collector, ConcurrentMarkSweepGeneration* g,
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 CMSBitMap* bitMap, bool should_yield);
3746
537a4053b0f9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 3356
diff changeset
1783 ~SweepClosure() PRODUCT_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1784
a61af66fc99e Initial load
duke
parents:
diff changeset
1785 size_t do_blk_careful(HeapWord* addr);
3746
537a4053b0f9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 3356
diff changeset
1786 void print() const { print_on(tty); }
537a4053b0f9 7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
ysr
parents: 3356
diff changeset
1787 void print_on(outputStream *st) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1789
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 // Closures related to weak references processing
a61af66fc99e Initial load
duke
parents:
diff changeset
1791
a61af66fc99e Initial load
duke
parents:
diff changeset
1792 // During CMS' weak reference processing, this is a
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 // work-routine/closure used to complete transitive
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 // marking of objects as live after a certain point
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 // in which an initial set has been completely accumulated.
452
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1796 // This closure is currently used both during the final
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1797 // remark stop-world phase, as well as during the concurrent
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1798 // precleaning of the discovered reference lists.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 class CMSDrainMarkingStackClosure: public VoidClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1801 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1802 CMSMarkStack* _mark_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
1803 CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1804 CMSKeepAliveClosure* _keep_alive;
452
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1805 bool _concurrent_precleaning;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1807 CMSDrainMarkingStackClosure(CMSCollector* collector, MemRegion span,
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 CMSBitMap* bit_map, CMSMarkStack* mark_stack,
452
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1809 CMSKeepAliveClosure* keep_alive,
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1810 bool cpc):
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1812 _span(span),
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 _bit_map(bit_map),
a61af66fc99e Initial load
duke
parents:
diff changeset
1814 _mark_stack(mark_stack),
452
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1815 _keep_alive(keep_alive),
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1816 _concurrent_precleaning(cpc) {
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1817 assert(_concurrent_precleaning == _keep_alive->concurrent_precleaning(),
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1818 "Mismatch");
00b023ae2d78 6722113: CMS: Incorrect overflow handling during precleaning of Reference lists
ysr
parents: 356
diff changeset
1819 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1820
a61af66fc99e Initial load
duke
parents:
diff changeset
1821 void do_void();
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1823
a61af66fc99e Initial load
duke
parents:
diff changeset
1824 // A parallel version of CMSDrainMarkingStackClosure above.
a61af66fc99e Initial load
duke
parents:
diff changeset
1825 class CMSParDrainMarkingStackClosure: public VoidClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1826 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1827 MemRegion _span;
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 OopTaskQueue* _work_queue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1829 CMSBitMap* _bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1830 CMSInnerParMarkAndPushClosure _mark_and_push;
a61af66fc99e Initial load
duke
parents:
diff changeset
1831
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 CMSParDrainMarkingStackClosure(CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 MemRegion span, CMSBitMap* bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 OopTaskQueue* work_queue):
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 _span(span),
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 _bit_map(bit_map),
a61af66fc99e Initial load
duke
parents:
diff changeset
1839 _work_queue(work_queue),
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1840 _mark_and_push(collector, span, bit_map, work_queue) { }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1841
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 void trim_queue(uint max);
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 void do_void();
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1846
a61af66fc99e Initial load
duke
parents:
diff changeset
1847 // Allow yielding or short-circuiting of reference list
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 // prelceaning work.
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 class CMSPrecleanRefsYieldClosure: public YieldClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1851 void do_yield_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
1852 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1853 CMSPrecleanRefsYieldClosure(CMSCollector* collector):
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 _collector(collector) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1855 virtual bool should_return();
a61af66fc99e Initial load
duke
parents:
diff changeset
1856 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1857
a61af66fc99e Initial load
duke
parents:
diff changeset
1858
a61af66fc99e Initial load
duke
parents:
diff changeset
1859 // Convenience class that locks free list locks for given CMS collector
a61af66fc99e Initial load
duke
parents:
diff changeset
1860 class FreelistLocker: public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
1861 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1862 CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1864 FreelistLocker(CMSCollector* collector):
a61af66fc99e Initial load
duke
parents:
diff changeset
1865 _collector(collector) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1866 _collector->getFreelistLocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1867 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1868
a61af66fc99e Initial load
duke
parents:
diff changeset
1869 ~FreelistLocker() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1870 _collector->releaseFreelistLocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1872 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1873
a61af66fc99e Initial load
duke
parents:
diff changeset
1874 // Mark all dead objects in a given space.
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 class MarkDeadObjectsClosure: public BlkClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
1876 const CMSCollector* _collector;
a61af66fc99e Initial load
duke
parents:
diff changeset
1877 const CompactibleFreeListSpace* _sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1878 CMSBitMap* _live_bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1879 CMSBitMap* _dead_bit_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1881 MarkDeadObjectsClosure(const CMSCollector* collector,
a61af66fc99e Initial load
duke
parents:
diff changeset
1882 const CompactibleFreeListSpace* sp,
a61af66fc99e Initial load
duke
parents:
diff changeset
1883 CMSBitMap *live_bit_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
1884 CMSBitMap *dead_bit_map) :
a61af66fc99e Initial load
duke
parents:
diff changeset
1885 _collector(collector),
a61af66fc99e Initial load
duke
parents:
diff changeset
1886 _sp(sp),
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 _live_bit_map(live_bit_map),
a61af66fc99e Initial load
duke
parents:
diff changeset
1888 _dead_bit_map(dead_bit_map) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1889 size_t do_blk(HeapWord* addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1890 };
1703
f6f3eef8a521 6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents: 1552
diff changeset
1891
f6f3eef8a521 6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents: 1552
diff changeset
1892 class TraceCMSMemoryManagerStats : public TraceMemoryManagerStats {
f6f3eef8a521 6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents: 1552
diff changeset
1893
f6f3eef8a521 6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents: 1552
diff changeset
1894 public:
3356
78542e2b5e35 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents: 2369
diff changeset
1895 TraceCMSMemoryManagerStats(CMSCollector::CollectorState phase, GCCause::Cause cause);
1703
f6f3eef8a521 6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents: 1552
diff changeset
1896 };
f6f3eef8a521 6581734: CMS Old Gen's collection usage is zero after GC which is incorrect
kevinw
parents: 1552
diff changeset
1897
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
1898
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
1899 #endif // SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_CONCURRENTMARKSWEEPGENERATION_HPP