< prev index next >

src/hotspot/share/gc/serial/defNewGeneration.cpp

Print this page

644   _gc_timer->register_gc_end();
645 
646   _gc_tracer->report_gc_end(_gc_timer->gc_end(), _gc_timer->time_partitions());
647 
648   return !_promotion_failed;
649 }
650 
651 void DefNewGeneration::init_assuming_no_promotion_failure() {
652   _promotion_failed = false;
653   _promotion_failed_info.reset();
654 }
655 
656 void DefNewGeneration::remove_forwarding_pointers() {
657   assert(_promotion_failed, "precondition");
658 
659   // Will enter Full GC soon due to failed promotion. Must reset the mark word
660   // of objs in young-gen so that no objs are marked (forwarded) when Full GC
661   // starts. (The mark word is overloaded: `is_marked()` == `is_forwarded()`.)
662   struct ResetForwardedMarkWord : ObjectClosure {
663     void do_object(oop obj) override {
664       if (obj->is_self_forwarded()) {
665         obj->unset_self_forwarded();
666       } else if (obj->is_forwarded()) {
667         // To restore the klass-bits in the header.
668         // Needed for object iteration to work properly.
669         obj->set_mark(obj->forwardee()->prototype_mark());
670       }
671     }
672   } cl;
673   eden()->object_iterate(&cl);
674   from()->object_iterate(&cl);
675 }
676 
677 void DefNewGeneration::handle_promotion_failure(oop old) {
678   log_debug(gc, promotion)("Promotion failure size = %zu) ", old->size());
679 
680   _promotion_failed = true;
681   _promotion_failed_info.register_copy_failure(old->size());
682 
683   ContinuationGCSupport::transform_stack_chunk(old);
684 
685   // forward to self
686   old->forward_to_self();
687 
688   _promo_failure_scan_stack.push(old);
689 
690   if (!_promo_failure_drain_in_progress) {
691     // prevent recursion in copy_to_survivor_space()
692     _promo_failure_drain_in_progress = true;
693     drain_promo_failure_scan_stack();
694     _promo_failure_drain_in_progress = false;
695   }
696 }
697 
698 oop DefNewGeneration::copy_to_survivor_space(oop old) {
699   assert(is_in_reserved(old) && !old->is_forwarded(),
700          "shouldn't be scavenging this oop");
701   Klass* klass = old->klass();
702   size_t s = old->size_given_klass(klass);



703   oop obj = nullptr;
704 
705   // Try allocating obj in to-space (unless too old)
706   if (old->age() < tenuring_threshold()) {
707     obj = cast_to_oop(to()->allocate(s));
708   }
709 
710   bool new_obj_is_tenured = false;
711   // Otherwise try allocating obj tenured
712   if (obj == nullptr) {
713     obj = _old_gen->allocate_for_promotion(old, s);
714     if (obj == nullptr) {
715       handle_promotion_failure(old);
716       return old;
717     }
718 
719     new_obj_is_tenured = true;
720   }
721 
722   // Prefetch beyond obj
723   const intx interval = PrefetchCopyIntervalInBytes;
724   Prefetch::write(obj, interval);
725 
726   // Copy obj
727   Copy::aligned_disjoint_words(cast_from_oop<HeapWord*>(old), cast_from_oop<HeapWord*>(obj), s);
728 
729   ContinuationGCSupport::transform_stack_chunk(obj, klass);
730 
731   if (!new_obj_is_tenured) {
732     // Increment age if obj still in new generation
733     obj->incr_age();
734     age_table()->add(obj, s);
735   }
736 


737   // Done, insert forward pointer to obj in this header
738   old->forward_to(obj);
739 
740   if (SerialStringDedup::is_candidate_from_evacuation(obj, klass, new_obj_is_tenured)) {
741     // Record old; request adds a new weak reference, which reference
742     // processing expects to refer to a from-space object.
743     _string_dedup_requests.add(old);
744   }
745   return obj;
746 }
747 
748 void DefNewGeneration::drain_promo_failure_scan_stack() {
749   PromoteFailureClosure cl{this};
750   while (!_promo_failure_scan_stack.is_empty()) {
751      oop obj = _promo_failure_scan_stack.pop();
752      obj->oop_iterate(&cl);
753   }
754 }
755 
756 void DefNewGeneration::contribute_scratch(void*& scratch, size_t& num_words) {

644   _gc_timer->register_gc_end();
645 
646   _gc_tracer->report_gc_end(_gc_timer->gc_end(), _gc_timer->time_partitions());
647 
648   return !_promotion_failed;
649 }
650 
651 void DefNewGeneration::init_assuming_no_promotion_failure() {
652   _promotion_failed = false;
653   _promotion_failed_info.reset();
654 }
655 
656 void DefNewGeneration::remove_forwarding_pointers() {
657   assert(_promotion_failed, "precondition");
658 
659   // Will enter Full GC soon due to failed promotion. Must reset the mark word
660   // of objs in young-gen so that no objs are marked (forwarded) when Full GC
661   // starts. (The mark word is overloaded: `is_marked()` == `is_forwarded()`.)
662   struct ResetForwardedMarkWord : ObjectClosure {
663     void do_object(oop obj) override {
664       obj->reset_forwarded();






665     }
666   } cl;
667   eden()->object_iterate(&cl);
668   from()->object_iterate(&cl);
669 }
670 
671 void DefNewGeneration::handle_promotion_failure(oop old) {
672   log_debug(gc, promotion)("Promotion failure size = %zu) ", old->size());
673 
674   _promotion_failed = true;
675   _promotion_failed_info.register_copy_failure(old->size());
676 
677   ContinuationGCSupport::transform_stack_chunk(old);
678 
679   // forward to self
680   old->forward_to_self();
681 
682   _promo_failure_scan_stack.push(old);
683 
684   if (!_promo_failure_drain_in_progress) {
685     // prevent recursion in copy_to_survivor_space()
686     _promo_failure_drain_in_progress = true;
687     drain_promo_failure_scan_stack();
688     _promo_failure_drain_in_progress = false;
689   }
690 }
691 
692 oop DefNewGeneration::copy_to_survivor_space(oop old) {
693   assert(is_in_reserved(old) && !old->is_forwarded(),
694          "shouldn't be scavenging this oop");
695   Klass* klass = old->klass();
696   markWord mrk = old->mark();
697   size_t old_size = old->size_given_mark_and_klass(mrk, klass);
698   size_t s = old->copy_size(old_size, mrk);
699 
700   oop obj = nullptr;
701 
702   // Try allocating obj in to-space (unless too old)
703   if (old->age() < tenuring_threshold()) {
704     obj = cast_to_oop(to()->allocate(s));
705   }
706 
707   bool new_obj_is_tenured = false;
708   // Otherwise try allocating obj tenured
709   if (obj == nullptr) {
710     obj = _old_gen->allocate_for_promotion(old, s);
711     if (obj == nullptr) {
712       handle_promotion_failure(old);
713       return old;
714     }
715 
716     new_obj_is_tenured = true;
717   }
718 
719   // Prefetch beyond obj
720   const intx interval = PrefetchCopyIntervalInBytes;
721   Prefetch::write(obj, interval);
722 
723   // Copy obj
724   Copy::aligned_disjoint_words(cast_from_oop<HeapWord*>(old), cast_from_oop<HeapWord*>(obj), old_size);
725 
726   ContinuationGCSupport::transform_stack_chunk(obj, klass);
727 
728   if (!new_obj_is_tenured) {
729     // Increment age if obj still in new generation
730     obj->incr_age();
731     age_table()->add(obj, s);
732   }
733 
734   obj->initialize_hash_if_necessary(old);
735 
736   // Done, insert forward pointer to obj in this header
737   old->forward_to(obj);
738 
739   if (SerialStringDedup::is_candidate_from_evacuation(obj, klass, new_obj_is_tenured)) {
740     // Record old; request adds a new weak reference, which reference
741     // processing expects to refer to a from-space object.
742     _string_dedup_requests.add(old);
743   }
744   return obj;
745 }
746 
747 void DefNewGeneration::drain_promo_failure_scan_stack() {
748   PromoteFailureClosure cl{this};
749   while (!_promo_failure_scan_stack.is_empty()) {
750      oop obj = _promo_failure_scan_stack.pop();
751      obj->oop_iterate(&cl);
752   }
753 }
754 
755 void DefNewGeneration::contribute_scratch(void*& scratch, size_t& num_words) {
< prev index next >