Mercurial > hg > graal-compiler
diff src/share/vm/gc_implementation/shared/markSweep.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 | c385bf94cfb8 |
line wrap: on
line diff
--- a/src/share/vm/gc_implementation/shared/markSweep.cpp Wed Mar 03 08:10:41 2010 -0800 +++ b/src/share/vm/gc_implementation/shared/markSweep.cpp Wed Mar 03 14:48:26 2010 -0800 @@ -25,8 +25,9 @@ #include "incls/_precompiled.incl" #include "incls/_markSweep.cpp.incl" -GrowableArray<oop>* MarkSweep::_marking_stack = NULL; -GrowableArray<Klass*>* MarkSweep::_revisit_klass_stack = NULL; +GrowableArray<oop>* MarkSweep::_marking_stack = NULL; +GrowableArray<ObjArrayTask>* MarkSweep::_objarray_stack = NULL; +GrowableArray<Klass*>* MarkSweep::_revisit_klass_stack = NULL; GrowableArray<DataLayout*>* MarkSweep::_revisit_mdo_stack = NULL; GrowableArray<oop>* MarkSweep::_preserved_oop_stack = NULL; @@ -104,11 +105,18 @@ void MarkSweep::MarkAndPushClosure::do_oop(narrowOop* p) { mark_and_push(p); } void MarkSweep::follow_stack() { - while (!_marking_stack->is_empty()) { - oop obj = _marking_stack->pop(); - assert (obj->is_gc_marked(), "p must be marked"); - obj->follow_contents(); - } + do { + while (!_marking_stack->is_empty()) { + oop obj = _marking_stack->pop(); + assert (obj->is_gc_marked(), "p must be marked"); + obj->follow_contents(); + } + while (!_objarray_stack->is_empty()) { + ObjArrayTask task = _objarray_stack->pop(); + objArrayKlass* const k = (objArrayKlass*)task.obj()->blueprint(); + k->oop_follow_contents(task.obj(), task.index()); + } + } while (!_marking_stack->is_empty() || !_objarray_stack->is_empty()); } MarkSweep::FollowStackClosure MarkSweep::follow_stack_closure;