< prev index next >

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

Print this page

 790   _gc_timer->register_gc_end();
 791 
 792   _gc_tracer->report_gc_end(_gc_timer->gc_end(), _gc_timer->time_partitions());
 793 }
 794 
 795 void DefNewGeneration::init_assuming_no_promotion_failure() {
 796   _promotion_failed = false;
 797   _promotion_failed_info.reset();
 798   from()->set_next_compaction_space(nullptr);
 799 }
 800 
 801 void DefNewGeneration::remove_forwarding_pointers() {
 802   assert(_promotion_failed, "precondition");
 803 
 804   // Will enter Full GC soon due to failed promotion. Must reset the mark word
 805   // of objs in young-gen so that no objs are marked (forwarded) when Full GC
 806   // starts. (The mark word is overloaded: `is_marked()` == `is_forwarded()`.)
 807   struct ResetForwardedMarkWord : ObjectClosure {
 808     void do_object(oop obj) override {
 809       if (obj->is_forwarded()) {
 810         obj->init_mark();
 811       }
 812     }
 813   } cl;
 814   eden()->object_iterate(&cl);
 815   from()->object_iterate(&cl);
 816 
 817   restore_preserved_marks();
 818 }
 819 
 820 void DefNewGeneration::restore_preserved_marks() {
 821   _preserved_marks_set.restore(nullptr);
 822 }
 823 
 824 void DefNewGeneration::handle_promotion_failure(oop old) {
 825   log_debug(gc, promotion)("Promotion failure size = " SIZE_FORMAT ") ", old->size());
 826 
 827   _promotion_failed = true;
 828   _promotion_failed_info.register_copy_failure(old->size());
 829   _preserved_marks_set.get()->push_if_necessary(old, old->mark());
 830 
 831   ContinuationGCSupport::transform_stack_chunk(old);
 832 
 833   // forward to self
 834   old->forward_to(old);
 835 
 836   _promo_failure_scan_stack.push(old);
 837 
 838   if (!_promo_failure_drain_in_progress) {
 839     // prevent recursion in copy_to_survivor_space()
 840     _promo_failure_drain_in_progress = true;
 841     drain_promo_failure_scan_stack();
 842     _promo_failure_drain_in_progress = false;
 843   }
 844 }
 845 
 846 oop DefNewGeneration::copy_to_survivor_space(oop old) {
 847   assert(is_in_reserved(old) && !old->is_forwarded(),
 848          "shouldn't be scavenging this oop");
 849   size_t s = old->size();
 850   oop obj = nullptr;
 851 
 852   // Try allocating obj in to-space (unless too old)
 853   if (old->age() < tenuring_threshold()) {
 854     obj = cast_to_oop(to()->allocate(s));

 790   _gc_timer->register_gc_end();
 791 
 792   _gc_tracer->report_gc_end(_gc_timer->gc_end(), _gc_timer->time_partitions());
 793 }
 794 
 795 void DefNewGeneration::init_assuming_no_promotion_failure() {
 796   _promotion_failed = false;
 797   _promotion_failed_info.reset();
 798   from()->set_next_compaction_space(nullptr);
 799 }
 800 
 801 void DefNewGeneration::remove_forwarding_pointers() {
 802   assert(_promotion_failed, "precondition");
 803 
 804   // Will enter Full GC soon due to failed promotion. Must reset the mark word
 805   // of objs in young-gen so that no objs are marked (forwarded) when Full GC
 806   // starts. (The mark word is overloaded: `is_marked()` == `is_forwarded()`.)
 807   struct ResetForwardedMarkWord : ObjectClosure {
 808     void do_object(oop obj) override {
 809       if (obj->is_forwarded()) {
 810         obj->forward_safe_init_mark();
 811       }
 812     }
 813   } cl;
 814   eden()->object_iterate(&cl);
 815   from()->object_iterate(&cl);
 816 
 817   restore_preserved_marks();
 818 }
 819 
 820 void DefNewGeneration::restore_preserved_marks() {
 821   _preserved_marks_set.restore(nullptr);
 822 }
 823 
 824 void DefNewGeneration::handle_promotion_failure(oop old) {
 825   log_debug(gc, promotion)("Promotion failure size = " SIZE_FORMAT ") ", old->size());
 826 
 827   _promotion_failed = true;
 828   _promotion_failed_info.register_copy_failure(old->size());
 829   _preserved_marks_set.get()->push_if_necessary(old, old->mark());
 830 
 831   ContinuationGCSupport::transform_stack_chunk(old);
 832 
 833   // forward to self
 834   old->forward_to_self();
 835 
 836   _promo_failure_scan_stack.push(old);
 837 
 838   if (!_promo_failure_drain_in_progress) {
 839     // prevent recursion in copy_to_survivor_space()
 840     _promo_failure_drain_in_progress = true;
 841     drain_promo_failure_scan_stack();
 842     _promo_failure_drain_in_progress = false;
 843   }
 844 }
 845 
 846 oop DefNewGeneration::copy_to_survivor_space(oop old) {
 847   assert(is_in_reserved(old) && !old->is_forwarded(),
 848          "shouldn't be scavenging this oop");
 849   size_t s = old->size();
 850   oop obj = nullptr;
 851 
 852   // Try allocating obj in to-space (unless too old)
 853   if (old->age() < tenuring_threshold()) {
 854     obj = cast_to_oop(to()->allocate(s));
< prev index next >