Mercurial > hg > graal-jvmci-8
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 // |