comparison src/share/vm/oops/objArrayKlass.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 4e6abf09f540
children c18cbe5936b8
comparison
equal deleted inserted replaced
1289:d47555d7aca8 1311:2a1472c30599
312 a, p, low, high, do_oop) \ 312 a, p, low, high, do_oop) \
313 } 313 }
314 314
315 void objArrayKlass::oop_follow_contents(oop obj) { 315 void objArrayKlass::oop_follow_contents(oop obj) {
316 assert (obj->is_array(), "obj must be array"); 316 assert (obj->is_array(), "obj must be array");
317 objArrayOop a = objArrayOop(obj); 317 objArrayOop(obj)->follow_header();
318 a->follow_header(); 318 if (UseCompressedOops) {
319 ObjArrayKlass_OOP_ITERATE( \ 319 objarray_follow_contents<narrowOop>(obj, 0);
320 a, p, \ 320 } else {
321 /* we call mark_and_follow here to avoid excessive marking stack usage */ \ 321 objarray_follow_contents<oop>(obj, 0);
322 MarkSweep::mark_and_follow(p)) 322 }
323 } 323 }
324 324
325 #ifndef SERIALGC 325 #ifndef SERIALGC
326 void objArrayKlass::oop_follow_contents(ParCompactionManager* cm, 326 void objArrayKlass::oop_follow_contents(ParCompactionManager* cm,
327 oop obj) { 327 oop obj) {
328 assert (obj->is_array(), "obj must be array"); 328 assert(obj->is_array(), "obj must be array");
329 objArrayOop a = objArrayOop(obj); 329 objArrayOop(obj)->follow_header(cm);
330 a->follow_header(cm); 330 if (UseCompressedOops) {
331 ObjArrayKlass_OOP_ITERATE( \ 331 objarray_follow_contents<narrowOop>(cm, obj, 0);
332 a, p, \ 332 } else {
333 /* we call mark_and_follow here to avoid excessive marking stack usage */ \ 333 objarray_follow_contents<oop>(cm, obj, 0);
334 PSParallelCompact::mark_and_follow(cm, p)) 334 }
335 } 335 }
336 #endif // SERIALGC 336 #endif // SERIALGC
337 337
338 #define ObjArrayKlass_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \ 338 #define ObjArrayKlass_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \
339 \ 339 \