src/share/vm/memory/defNewGeneration.cpp

changeset 2191
894b1d7c7e01
parent 1907
c18cbe5936b8
child 2243
a7214d79fcf1
     1.1 --- a/src/share/vm/memory/defNewGeneration.cpp	Tue Sep 28 09:51:37 2010 -0700
     1.2 +++ b/src/share/vm/memory/defNewGeneration.cpp	Tue Sep 28 15:56:15 2010 -0700
     1.3 @@ -87,9 +87,7 @@
     1.4      _gch->oop_since_save_marks_iterate(_level, _scan_cur_or_nonheap,
     1.5                                         _scan_older);
     1.6    } while (!_gch->no_allocs_since_save_marks(_level));
     1.7 -  guarantee(_gen->promo_failure_scan_stack() == NULL
     1.8 -            || _gen->promo_failure_scan_stack()->length() == 0,
     1.9 -            "Failed to finish scan");
    1.10 +  guarantee(_gen->promo_failure_scan_is_complete(), "Failed to finish scan");
    1.11  }
    1.12  
    1.13  ScanClosure::ScanClosure(DefNewGeneration* g, bool gc_barrier) :
    1.14 @@ -130,9 +128,6 @@
    1.15                                     int level,
    1.16                                     const char* policy)
    1.17    : Generation(rs, initial_size, level),
    1.18 -    _objs_with_preserved_marks(NULL),
    1.19 -    _preserved_marks_of_objs(NULL),
    1.20 -    _promo_failure_scan_stack(NULL),
    1.21      _promo_failure_drain_in_progress(false),
    1.22      _should_allocate_from_space(false)
    1.23  {
    1.24 @@ -604,12 +599,8 @@
    1.25    } else {
    1.26      assert(HandlePromotionFailure,
    1.27        "Should not be here unless promotion failure handling is on");
    1.28 -    assert(_promo_failure_scan_stack != NULL &&
    1.29 -      _promo_failure_scan_stack->length() == 0, "post condition");
    1.30 -
    1.31 -    // deallocate stack and it's elements
    1.32 -    delete _promo_failure_scan_stack;
    1.33 -    _promo_failure_scan_stack = NULL;
    1.34 +    assert(_promo_failure_scan_stack.is_empty(), "post condition");
    1.35 +    _promo_failure_scan_stack.clear(true); // Clear cached segments.
    1.36  
    1.37      remove_forwarding_pointers();
    1.38      if (PrintGCDetails) {
    1.39 @@ -620,7 +611,7 @@
    1.40      // case there can be live objects in to-space
    1.41      // as a result of a partial evacuation of eden
    1.42      // and from-space.
    1.43 -    swap_spaces();   // For the sake of uniformity wrt ParNewGeneration::collect().
    1.44 +    swap_spaces();   // For uniformity wrt ParNewGeneration.
    1.45      from()->set_next_compaction_space(to());
    1.46      gch->set_incremental_collection_will_fail();
    1.47  
    1.48 @@ -653,34 +644,23 @@
    1.49    RemoveForwardPointerClosure rspc;
    1.50    eden()->object_iterate(&rspc);
    1.51    from()->object_iterate(&rspc);
    1.52 +
    1.53    // Now restore saved marks, if any.
    1.54 -  if (_objs_with_preserved_marks != NULL) {
    1.55 -    assert(_preserved_marks_of_objs != NULL, "Both or none.");
    1.56 -    assert(_objs_with_preserved_marks->length() ==
    1.57 -           _preserved_marks_of_objs->length(), "Both or none.");
    1.58 -    for (int i = 0; i < _objs_with_preserved_marks->length(); i++) {
    1.59 -      oop obj   = _objs_with_preserved_marks->at(i);
    1.60 -      markOop m = _preserved_marks_of_objs->at(i);
    1.61 -      obj->set_mark(m);
    1.62 -    }
    1.63 -    delete _objs_with_preserved_marks;
    1.64 -    delete _preserved_marks_of_objs;
    1.65 -    _objs_with_preserved_marks = NULL;
    1.66 -    _preserved_marks_of_objs = NULL;
    1.67 +  assert(_objs_with_preserved_marks.size() == _preserved_marks_of_objs.size(),
    1.68 +         "should be the same");
    1.69 +  while (!_objs_with_preserved_marks.is_empty()) {
    1.70 +    oop obj   = _objs_with_preserved_marks.pop();
    1.71 +    markOop m = _preserved_marks_of_objs.pop();
    1.72 +    obj->set_mark(m);
    1.73    }
    1.74 +  _objs_with_preserved_marks.clear(true);
    1.75 +  _preserved_marks_of_objs.clear(true);
    1.76  }
    1.77  
    1.78  void DefNewGeneration::preserve_mark_if_necessary(oop obj, markOop m) {
    1.79    if (m->must_be_preserved_for_promotion_failure(obj)) {
    1.80 -    if (_objs_with_preserved_marks == NULL) {
    1.81 -      assert(_preserved_marks_of_objs == NULL, "Both or none.");
    1.82 -      _objs_with_preserved_marks = new (ResourceObj::C_HEAP)
    1.83 -        GrowableArray<oop>(PreserveMarkStackSize, true);
    1.84 -      _preserved_marks_of_objs = new (ResourceObj::C_HEAP)
    1.85 -        GrowableArray<markOop>(PreserveMarkStackSize, true);
    1.86 -    }
    1.87 -    _objs_with_preserved_marks->push(obj);
    1.88 -    _preserved_marks_of_objs->push(m);
    1.89 +    _objs_with_preserved_marks.push(obj);
    1.90 +    _preserved_marks_of_objs.push(m);
    1.91    }
    1.92  }
    1.93  
    1.94 @@ -695,7 +675,7 @@
    1.95    old->forward_to(old);
    1.96    _promotion_failed = true;
    1.97  
    1.98 -  push_on_promo_failure_scan_stack(old);
    1.99 +  _promo_failure_scan_stack.push(old);
   1.100  
   1.101    if (!_promo_failure_drain_in_progress) {
   1.102      // prevent recursion in copy_to_survivor_space()
   1.103 @@ -748,20 +728,9 @@
   1.104    return obj;
   1.105  }
   1.106  
   1.107 -void DefNewGeneration::push_on_promo_failure_scan_stack(oop obj) {
   1.108 -  if (_promo_failure_scan_stack == NULL) {
   1.109 -    _promo_failure_scan_stack = new (ResourceObj::C_HEAP)
   1.110 -                                    GrowableArray<oop>(40, true);
   1.111 -  }
   1.112 -
   1.113 -  _promo_failure_scan_stack->push(obj);
   1.114 -}
   1.115 -
   1.116  void DefNewGeneration::drain_promo_failure_scan_stack() {
   1.117 -  assert(_promo_failure_scan_stack != NULL, "precondition");
   1.118 -
   1.119 -  while (_promo_failure_scan_stack->length() > 0) {
   1.120 -     oop obj = _promo_failure_scan_stack->pop();
   1.121 +  while (!_promo_failure_scan_stack.is_empty()) {
   1.122 +     oop obj = _promo_failure_scan_stack.pop();
   1.123       obj->oop_iterate(_promo_failure_scan_stack_closure);
   1.124    }
   1.125  }

mercurial