Mercurial > hg > graal-jvmci-8
comparison 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 |
comparison
equal
deleted
inserted
replaced
1289:d47555d7aca8 | 1311:2a1472c30599 |
---|---|
23 */ | 23 */ |
24 | 24 |
25 #include "incls/_precompiled.incl" | 25 #include "incls/_precompiled.incl" |
26 #include "incls/_markSweep.cpp.incl" | 26 #include "incls/_markSweep.cpp.incl" |
27 | 27 |
28 GrowableArray<oop>* MarkSweep::_marking_stack = NULL; | 28 GrowableArray<oop>* MarkSweep::_marking_stack = NULL; |
29 GrowableArray<Klass*>* MarkSweep::_revisit_klass_stack = NULL; | 29 GrowableArray<ObjArrayTask>* MarkSweep::_objarray_stack = NULL; |
30 GrowableArray<Klass*>* MarkSweep::_revisit_klass_stack = NULL; | |
30 GrowableArray<DataLayout*>* MarkSweep::_revisit_mdo_stack = NULL; | 31 GrowableArray<DataLayout*>* MarkSweep::_revisit_mdo_stack = NULL; |
31 | 32 |
32 GrowableArray<oop>* MarkSweep::_preserved_oop_stack = NULL; | 33 GrowableArray<oop>* MarkSweep::_preserved_oop_stack = NULL; |
33 GrowableArray<markOop>* MarkSweep::_preserved_mark_stack= NULL; | 34 GrowableArray<markOop>* MarkSweep::_preserved_mark_stack= NULL; |
34 size_t MarkSweep::_preserved_count = 0; | 35 size_t MarkSweep::_preserved_count = 0; |
102 | 103 |
103 void MarkSweep::MarkAndPushClosure::do_oop(oop* p) { mark_and_push(p); } | 104 void MarkSweep::MarkAndPushClosure::do_oop(oop* p) { mark_and_push(p); } |
104 void MarkSweep::MarkAndPushClosure::do_oop(narrowOop* p) { mark_and_push(p); } | 105 void MarkSweep::MarkAndPushClosure::do_oop(narrowOop* p) { mark_and_push(p); } |
105 | 106 |
106 void MarkSweep::follow_stack() { | 107 void MarkSweep::follow_stack() { |
107 while (!_marking_stack->is_empty()) { | 108 do { |
108 oop obj = _marking_stack->pop(); | 109 while (!_marking_stack->is_empty()) { |
109 assert (obj->is_gc_marked(), "p must be marked"); | 110 oop obj = _marking_stack->pop(); |
110 obj->follow_contents(); | 111 assert (obj->is_gc_marked(), "p must be marked"); |
111 } | 112 obj->follow_contents(); |
113 } | |
114 while (!_objarray_stack->is_empty()) { | |
115 ObjArrayTask task = _objarray_stack->pop(); | |
116 objArrayKlass* const k = (objArrayKlass*)task.obj()->blueprint(); | |
117 k->oop_follow_contents(task.obj(), task.index()); | |
118 } | |
119 } while (!_marking_stack->is_empty() || !_objarray_stack->is_empty()); | |
112 } | 120 } |
113 | 121 |
114 MarkSweep::FollowStackClosure MarkSweep::follow_stack_closure; | 122 MarkSweep::FollowStackClosure MarkSweep::follow_stack_closure; |
115 | 123 |
116 void MarkSweep::FollowStackClosure::do_void() { follow_stack(); } | 124 void MarkSweep::FollowStackClosure::do_void() { follow_stack(); } |