comparison src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp @ 1311:2a1472c30599

4396719: Mark Sweep stack overflow on deeply nested Object arrays Summary: Use an explicit stack for object arrays and process them in chunks. Reviewed-by: iveresov, apetrusenko
author jcoomes
date Wed, 03 Mar 2010 14:48:26 -0800
parents a1423fe86a18
children c18cbe5936b8
comparison
equal deleted inserted replaced
1289:d47555d7aca8 1311:2a1472c30599
46 46
47 if (_vm_thread != NULL) 47 if (_vm_thread != NULL)
48 _vm_thread->oops_do(&mark_and_push_closure, &mark_and_push_in_blobs); 48 _vm_thread->oops_do(&mark_and_push_closure, &mark_and_push_in_blobs);
49 49
50 // Do the real work 50 // Do the real work
51 cm->drain_marking_stacks(&mark_and_push_closure); 51 cm->follow_marking_stacks();
52 } 52 }
53 53
54 54
55 void MarkFromRootsTask::do_it(GCTaskManager* manager, uint which) { 55 void MarkFromRootsTask::do_it(GCTaskManager* manager, uint which) {
56 assert(Universe::heap()->is_gc_active(), "called outside gc"); 56 assert(Universe::heap()->is_gc_active(), "called outside gc");
116 default: 116 default:
117 fatal("Unknown root type"); 117 fatal("Unknown root type");
118 } 118 }
119 119
120 // Do the real work 120 // Do the real work
121 cm->drain_marking_stacks(&mark_and_push_closure); 121 cm->follow_marking_stacks();
122 // cm->deallocate_stacks(); 122 // cm->deallocate_stacks();
123 } 123 }
124 124
125 125
126 // 126 //
194 ParCompactionManager* cm = 194 ParCompactionManager* cm =
195 ParCompactionManager::gc_thread_compaction_manager(which); 195 ParCompactionManager::gc_thread_compaction_manager(which);
196 PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm); 196 PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm);
197 197
198 oop obj = NULL; 198 oop obj = NULL;
199 ObjArrayTask task;
199 int random_seed = 17; 200 int random_seed = 17;
200 while(true) { 201 do {
201 if (ParCompactionManager::steal(which, &random_seed, obj)) { 202 while (ParCompactionManager::steal_objarray(which, &random_seed, task)) {
203 objArrayKlass* const k = (objArrayKlass*)task.obj()->blueprint();
204 k->oop_follow_contents(cm, task.obj(), task.index());
205 cm->follow_marking_stacks();
206 }
207 while (ParCompactionManager::steal(which, &random_seed, obj)) {
202 obj->follow_contents(cm); 208 obj->follow_contents(cm);
203 cm->drain_marking_stacks(&mark_and_push_closure); 209 cm->follow_marking_stacks();
204 } else { 210 }
205 if (terminator()->offer_termination()) { 211 } while (!terminator()->offer_termination());
206 break;
207 }
208 }
209 }
210 } 212 }
211 213
212 // 214 //
213 // StealRegionCompactionTask 215 // StealRegionCompactionTask
214 // 216 //