annotate src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp @ 1091:6aa7255741f3

6906727: UseCompressedOops: some card-marking fixes related to object arrays Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17). Reviewed-by: kvn, coleenp, jmasa
author ysr
date Thu, 03 Dec 2009 15:01:57 -0800
parents 89e0543e1737
children 2a1472c30599
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
948
89e0543e1737 6884624: Update copyright year
xdono
parents: 941
diff changeset
2 * Copyright 2005-2009 Sun Microsystems, Inc. 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 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 #include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 #include "incls/_psCompactionManager.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 PSOldGen* ParCompactionManager::_old_gen = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
29 ParCompactionManager** ParCompactionManager::_manager_array = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
30 OopTaskQueueSet* ParCompactionManager::_stack_array = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
31 ObjectStartArray* ParCompactionManager::_start_array = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 ParMarkBitMap* ParCompactionManager::_mark_bitmap = NULL;
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
33 RegionTaskQueueSet* ParCompactionManager::_region_array = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
34
a61af66fc99e Initial load
duke
parents:
diff changeset
35 ParCompactionManager::ParCompactionManager() :
a61af66fc99e Initial load
duke
parents:
diff changeset
36 _action(CopyAndUpdate) {
a61af66fc99e Initial load
duke
parents:
diff changeset
37
a61af66fc99e Initial load
duke
parents:
diff changeset
38 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
39 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
40
a61af66fc99e Initial load
duke
parents:
diff changeset
41 _old_gen = heap->old_gen();
a61af66fc99e Initial load
duke
parents:
diff changeset
42 _start_array = old_gen()->start_array();
a61af66fc99e Initial load
duke
parents:
diff changeset
43
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 marking_stack()->initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
46
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // We want the overflow stack to be permanent
a61af66fc99e Initial load
duke
parents:
diff changeset
48 _overflow_stack = new (ResourceObj::C_HEAP) GrowableArray<oop>(10, true);
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
49 #ifdef USE_RegionTaskQueueWithOverflow
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
50 region_stack()->initialize();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
51 #else
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
52 region_stack()->initialize();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // We want the overflow stack to be permanent
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
55 _region_overflow_stack =
0
a61af66fc99e Initial load
duke
parents:
diff changeset
56 new (ResourceObj::C_HEAP) GrowableArray<size_t>(10, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
57 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // Note that _revisit_klass_stack is allocated out of the
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // C heap (as opposed to out of ResourceArena).
a61af66fc99e Initial load
duke
parents:
diff changeset
61 int size =
a61af66fc99e Initial load
duke
parents:
diff changeset
62 (SystemDictionary::number_of_classes() * 2) * 2 / ParallelGCThreads;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 _revisit_klass_stack = new (ResourceObj::C_HEAP) GrowableArray<Klass*>(size, true);
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 470
diff changeset
64 // From some experiments (#klass/k)^2 for k = 10 seems a better fit, but this will
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 470
diff changeset
65 // have to do for now until we are able to investigate a more optimal setting.
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 470
diff changeset
66 _revisit_mdo_stack = new (ResourceObj::C_HEAP) GrowableArray<DataLayout*>(size*2, true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 }
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 ParCompactionManager::~ParCompactionManager() {
a61af66fc99e Initial load
duke
parents:
diff changeset
71 delete _overflow_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 delete _revisit_klass_stack;
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 470
diff changeset
73 delete _revisit_mdo_stack;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // _manager_array and _stack_array are statics
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // shared with all instances of ParCompactionManager
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // should not be deallocated.
a61af66fc99e Initial load
duke
parents:
diff changeset
77 }
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 void ParCompactionManager::initialize(ParMarkBitMap* mbm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
80 assert(PSParallelCompact::gc_task_manager() != NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
81 "Needed for initialization");
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 _mark_bitmap = mbm;
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 uint parallel_gc_threads = PSParallelCompact::gc_task_manager()->workers();
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 assert(_manager_array == NULL, "Attempt to initialize twice");
a61af66fc99e Initial load
duke
parents:
diff changeset
88 _manager_array = NEW_C_HEAP_ARRAY(ParCompactionManager*, parallel_gc_threads+1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
89 guarantee(_manager_array != NULL, "Could not initialize promotion manager");
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 _stack_array = new OopTaskQueueSet(parallel_gc_threads);
a61af66fc99e Initial load
duke
parents:
diff changeset
92 guarantee(_stack_array != NULL, "Count not initialize promotion manager");
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
93 _region_array = new RegionTaskQueueSet(parallel_gc_threads);
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
94 guarantee(_region_array != NULL, "Count not initialize promotion manager");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // Create and register the ParCompactionManager(s) for the worker threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
97 for(uint i=0; i<parallel_gc_threads; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
98 _manager_array[i] = new ParCompactionManager();
a61af66fc99e Initial load
duke
parents:
diff changeset
99 guarantee(_manager_array[i] != NULL, "Could not create ParCompactionManager");
a61af66fc99e Initial load
duke
parents:
diff changeset
100 stack_array()->register_queue(i, _manager_array[i]->marking_stack());
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
101 #ifdef USE_RegionTaskQueueWithOverflow
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
102 region_array()->register_queue(i, _manager_array[i]->region_stack()->task_queue());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
103 #else
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
104 region_array()->register_queue(i, _manager_array[i]->region_stack());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
105 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // The VMThread gets its own ParCompactionManager, which is not available
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // for work stealing.
a61af66fc99e Initial load
duke
parents:
diff changeset
110 _manager_array[parallel_gc_threads] = new ParCompactionManager();
a61af66fc99e Initial load
duke
parents:
diff changeset
111 guarantee(_manager_array[parallel_gc_threads] != NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
112 "Could not create ParCompactionManager");
a61af66fc99e Initial load
duke
parents:
diff changeset
113 assert(PSParallelCompact::gc_task_manager()->workers() != 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
114 "Not initialized?");
a61af66fc99e Initial load
duke
parents:
diff changeset
115 }
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 bool ParCompactionManager::should_update() {
a61af66fc99e Initial load
duke
parents:
diff changeset
118 assert(action() != NotValid, "Action is not set");
a61af66fc99e Initial load
duke
parents:
diff changeset
119 return (action() == ParCompactionManager::Update) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
120 (action() == ParCompactionManager::CopyAndUpdate) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
121 (action() == ParCompactionManager::UpdateAndCopy);
a61af66fc99e Initial load
duke
parents:
diff changeset
122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 bool ParCompactionManager::should_copy() {
a61af66fc99e Initial load
duke
parents:
diff changeset
125 assert(action() != NotValid, "Action is not set");
a61af66fc99e Initial load
duke
parents:
diff changeset
126 return (action() == ParCompactionManager::Copy) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
127 (action() == ParCompactionManager::CopyAndUpdate) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
128 (action() == ParCompactionManager::UpdateAndCopy);
a61af66fc99e Initial load
duke
parents:
diff changeset
129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 bool ParCompactionManager::should_verify_only() {
a61af66fc99e Initial load
duke
parents:
diff changeset
132 assert(action() != NotValid, "Action is not set");
a61af66fc99e Initial load
duke
parents:
diff changeset
133 return action() == ParCompactionManager::VerifyUpdate;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 }
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 bool ParCompactionManager::should_reset_only() {
a61af66fc99e Initial load
duke
parents:
diff changeset
137 assert(action() != NotValid, "Action is not set");
a61af66fc99e Initial load
duke
parents:
diff changeset
138 return action() == ParCompactionManager::ResetObjects;
a61af66fc99e Initial load
duke
parents:
diff changeset
139 }
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // For now save on a stack
a61af66fc99e Initial load
duke
parents:
diff changeset
142 void ParCompactionManager::save_for_scanning(oop m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 stack_push(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
144 }
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 void ParCompactionManager::stack_push(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 if(!marking_stack()->push(obj)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 overflow_stack()->push(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 oop ParCompactionManager::retrieve_for_scanning() {
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // Should not be used in the parallel case
a61af66fc99e Initial load
duke
parents:
diff changeset
156 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
157 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
159
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
160 // Save region on a stack
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
161 void ParCompactionManager::save_for_processing(size_t region_index) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
162 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
163 const ParallelCompactData& sd = PSParallelCompact::summary_data();
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
164 ParallelCompactData::RegionData* const region_ptr = sd.region(region_index);
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
165 assert(region_ptr->claimed(), "must be claimed");
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
166 assert(region_ptr->_pushed++ == 0, "should only be pushed once");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
167 #endif
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
168 region_stack_push(region_index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
170
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
171 void ParCompactionManager::region_stack_push(size_t region_index) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
172
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
173 #ifdef USE_RegionTaskQueueWithOverflow
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
174 region_stack()->save(region_index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
175 #else
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
176 if(!region_stack()->push(region_index)) {
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
177 region_overflow_stack()->push(region_index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
179 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
181
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
182 bool ParCompactionManager::retrieve_for_processing(size_t& region_index) {
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
183 #ifdef USE_RegionTaskQueueWithOverflow
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
184 return region_stack()->retrieve(region_index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
185 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // Should not be used in the parallel case
a61af66fc99e Initial load
duke
parents:
diff changeset
187 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
188 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
189 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 ParCompactionManager*
a61af66fc99e Initial load
duke
parents:
diff changeset
193 ParCompactionManager::gc_thread_compaction_manager(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 assert(index >= 0 && index < (int)ParallelGCThreads, "index out of range");
a61af66fc99e Initial load
duke
parents:
diff changeset
195 assert(_manager_array != NULL, "Sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
196 return _manager_array[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
197 }
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 void ParCompactionManager::reset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
200 for(uint i=0; i<ParallelGCThreads+1; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
201 manager_array(i)->revisit_klass_stack()->clear();
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 470
diff changeset
202 manager_array(i)->revisit_mdo_stack()->clear();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 void ParCompactionManager::drain_marking_stacks(OopClosure* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
208 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
209 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
210 MutableSpace* to_space = heap->young_gen()->to_space();
a61af66fc99e Initial load
duke
parents:
diff changeset
211 MutableSpace* old_space = heap->old_gen()->object_space();
a61af66fc99e Initial load
duke
parents:
diff changeset
212 MutableSpace* perm_space = heap->perm_gen()->object_space();
a61af66fc99e Initial load
duke
parents:
diff changeset
213 #endif /* ASSERT */
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // Drain overflow stack first, so other threads can steal from
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // claimed stack while we work.
a61af66fc99e Initial load
duke
parents:
diff changeset
220 while(!overflow_stack()->is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
221 oop obj = overflow_stack()->pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
222 obj->follow_contents(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 oop obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // obj is a reference!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
227 while (marking_stack()->pop_local(obj)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // It would be nice to assert about the type of objects we might
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // pop, but they can come from anywhere, unfortunately.
a61af66fc99e Initial load
duke
parents:
diff changeset
230 obj->follow_contents(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
232 } while((marking_stack()->size() != 0) || (overflow_stack()->length() != 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
233
a61af66fc99e Initial load
duke
parents:
diff changeset
234 assert(marking_stack()->size() == 0, "Sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
235 assert(overflow_stack()->length() == 0, "Sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
237
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
238 void ParCompactionManager::drain_region_overflow_stack() {
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
239 size_t region_index = (size_t) -1;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
240 while(region_stack()->retrieve_from_overflow(region_index)) {
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
241 PSParallelCompact::fill_and_update_region(this, region_index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
242 }
a61af66fc99e Initial load
duke
parents:
diff changeset
243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
244
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
245 void ParCompactionManager::drain_region_stacks() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
246 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
247 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
248 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
249 MutableSpace* to_space = heap->young_gen()->to_space();
a61af66fc99e Initial load
duke
parents:
diff changeset
250 MutableSpace* old_space = heap->old_gen()->object_space();
a61af66fc99e Initial load
duke
parents:
diff changeset
251 MutableSpace* perm_space = heap->perm_gen()->object_space();
a61af66fc99e Initial load
duke
parents:
diff changeset
252 #endif /* ASSERT */
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 #if 1 // def DO_PARALLEL - the serial code hasn't been updated
a61af66fc99e Initial load
duke
parents:
diff changeset
255 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
256
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
257 #ifdef USE_RegionTaskQueueWithOverflow
0
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // Drain overflow stack first, so other threads can steal from
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // claimed stack while we work.
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
260 size_t region_index = (size_t) -1;
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
261 while(region_stack()->retrieve_from_overflow(region_index)) {
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
262 PSParallelCompact::fill_and_update_region(this, region_index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
264
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
265 while (region_stack()->retrieve_from_stealable_queue(region_index)) {
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
266 PSParallelCompact::fill_and_update_region(this, region_index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
268 } while (!region_stack()->is_empty());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
269 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // Drain overflow stack first, so other threads can steal from
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // claimed stack while we work.
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
272 while(!region_overflow_stack()->is_empty()) {
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
273 size_t region_index = region_overflow_stack()->pop();
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
274 PSParallelCompact::fill_and_update_region(this, region_index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
275 }
a61af66fc99e Initial load
duke
parents:
diff changeset
276
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
277 size_t region_index = -1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // obj is a reference!!!
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
279 while (region_stack()->pop_local(region_index)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
280 // It would be nice to assert about the type of objects we might
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // pop, but they can come from anywhere, unfortunately.
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
282 PSParallelCompact::fill_and_update_region(this, region_index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
283 }
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
284 } while((region_stack()->size() != 0) ||
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
285 (region_overflow_stack()->length() != 0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
286 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
287
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
288 #ifdef USE_RegionTaskQueueWithOverflow
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
289 assert(region_stack()->is_empty(), "Sanity");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
290 #else
375
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
291 assert(region_stack()->size() == 0, "Sanity");
81cd571500b0 6725697: par compact - rename class ChunkData to RegionData
jcoomes
parents: 0
diff changeset
292 assert(region_overflow_stack()->length() == 0, "Sanity");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
293 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
294 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
295 oop obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
296 while (obj = retrieve_for_scanning()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
297 obj->follow_contents(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
298 }
a61af66fc99e Initial load
duke
parents:
diff changeset
299 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
301
a61af66fc99e Initial load
duke
parents:
diff changeset
302 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
303 bool ParCompactionManager::stacks_have_been_allocated() {
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 470
diff changeset
304 return (revisit_klass_stack()->data_addr() != NULL &&
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 470
diff changeset
305 revisit_mdo_stack()->data_addr() != NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
307 #endif