changeset 1611:c385bf94cfb8

6935839: excessive marking stack growth during full gcs Summary: process one item at a time from the objarray stack/queue Reviewed-by: apetrusenko, tonyp
author jcoomes
date Thu, 18 Mar 2010 13:31:51 -0700
parents 3f0549ed0c98
children cc98cc548f51
files src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp src/share/vm/gc_implementation/shared/markSweep.cpp
diffstat 2 files changed, 6 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp	Thu Mar 18 01:48:28 2010 -0700
+++ b/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp	Thu Mar 18 13:31:51 2010 -0700
@@ -217,21 +217,21 @@
 void ParCompactionManager::follow_marking_stacks() {
   do {
     // Drain the overflow stack first, to allow stealing from the marking stack.
+    oop obj;
     while (!overflow_stack()->is_empty()) {
       overflow_stack()->pop()->follow_contents(this);
     }
-    oop obj;
     while (marking_stack()->pop_local(obj)) {
       obj->follow_contents(this);
     }
 
+    // Process ObjArrays one at a time to avoid marking stack bloat.
     ObjArrayTask task;
-    while (!_objarray_overflow_stack->is_empty()) {
+    if (!_objarray_overflow_stack->is_empty()) {
       task = _objarray_overflow_stack->pop();
       objArrayKlass* const k = (objArrayKlass*)task.obj()->blueprint();
       k->oop_follow_contents(this, task.obj(), task.index());
-    }
-    while (_objarray_queue.pop_local(task)) {
+    } else if (_objarray_queue.pop_local(task)) {
       objArrayKlass* const k = (objArrayKlass*)task.obj()->blueprint();
       k->oop_follow_contents(this, task.obj(), task.index());
     }
--- a/src/share/vm/gc_implementation/shared/markSweep.cpp	Thu Mar 18 01:48:28 2010 -0700
+++ b/src/share/vm/gc_implementation/shared/markSweep.cpp	Thu Mar 18 13:31:51 2010 -0700
@@ -111,7 +111,8 @@
       assert (obj->is_gc_marked(), "p must be marked");
       obj->follow_contents();
     }
-    while (!_objarray_stack->is_empty()) {
+    // Process ObjArrays one at a time to avoid marking stack bloat.
+    if (!_objarray_stack->is_empty()) {
       ObjArrayTask task = _objarray_stack->pop();
       objArrayKlass* const k = (objArrayKlass*)task.obj()->blueprint();
       k->oop_follow_contents(task.obj(), task.index());