Mercurial > hg > truffle
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 \ |