< prev index next >

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

Print this page

 859   _gc_timer->register_gc_end();
 860 
 861   _gc_tracer->report_gc_end(_gc_timer->gc_end(), _gc_timer->time_partitions());
 862 }
 863 
 864 void DefNewGeneration::init_assuming_no_promotion_failure() {
 865   _promotion_failed = false;
 866   _promotion_failed_info.reset();
 867   from()->set_next_compaction_space(nullptr);
 868 }
 869 
 870 void DefNewGeneration::remove_forwarding_pointers() {
 871   assert(_promotion_failed, "precondition");
 872 
 873   // Will enter Full GC soon due to failed promotion. Must reset the mark word
 874   // of objs in young-gen so that no objs are marked (forwarded) when Full GC
 875   // starts. (The mark word is overloaded: `is_marked()` == `is_forwarded()`.)
 876   struct ResetForwardedMarkWord : ObjectClosure {
 877     void do_object(oop obj) override {
 878       if (obj->is_forwarded()) {
 879         obj->init_mark();
 880       }
 881     }
 882   } cl;
 883   eden()->object_iterate(&cl);
 884   from()->object_iterate(&cl);
 885 
 886   restore_preserved_marks();
 887 }
 888 
 889 void DefNewGeneration::restore_preserved_marks() {
 890   _preserved_marks_set.restore(nullptr);
 891 }
 892 
 893 void DefNewGeneration::handle_promotion_failure(oop old) {
 894   log_debug(gc, promotion)("Promotion failure size = " SIZE_FORMAT ") ", old->size());
 895 
 896   _promotion_failed = true;
 897   _promotion_failed_info.register_copy_failure(old->size());
 898   _preserved_marks_set.get()->push_if_necessary(old, old->mark());
 899 
 900   ContinuationGCSupport::transform_stack_chunk(old);
 901 
 902   // forward to self
 903   old->forward_to(old);
 904 
 905   _promo_failure_scan_stack.push(old);
 906 
 907   if (!_promo_failure_drain_in_progress) {
 908     // prevent recursion in copy_to_survivor_space()
 909     _promo_failure_drain_in_progress = true;
 910     drain_promo_failure_scan_stack();
 911     _promo_failure_drain_in_progress = false;
 912   }
 913 }
 914 
 915 oop DefNewGeneration::copy_to_survivor_space(oop old) {
 916   assert(is_in_reserved(old) && !old->is_forwarded(),
 917          "shouldn't be scavenging this oop");
 918   size_t s = old->size();
 919   oop obj = nullptr;
 920 
 921   // Try allocating obj in to-space (unless too old)
 922   if (old->age() < tenuring_threshold()) {
 923     obj = cast_to_oop(to()->allocate(s));

 859   _gc_timer->register_gc_end();
 860 
 861   _gc_tracer->report_gc_end(_gc_timer->gc_end(), _gc_timer->time_partitions());
 862 }
 863 
 864 void DefNewGeneration::init_assuming_no_promotion_failure() {
 865   _promotion_failed = false;
 866   _promotion_failed_info.reset();
 867   from()->set_next_compaction_space(nullptr);
 868 }
 869 
 870 void DefNewGeneration::remove_forwarding_pointers() {
 871   assert(_promotion_failed, "precondition");
 872 
 873   // Will enter Full GC soon due to failed promotion. Must reset the mark word
 874   // of objs in young-gen so that no objs are marked (forwarded) when Full GC
 875   // starts. (The mark word is overloaded: `is_marked()` == `is_forwarded()`.)
 876   struct ResetForwardedMarkWord : ObjectClosure {
 877     void do_object(oop obj) override {
 878       if (obj->is_forwarded()) {
 879         obj->forward_safe_init_mark();
 880       }
 881     }
 882   } cl;
 883   eden()->object_iterate(&cl);
 884   from()->object_iterate(&cl);
 885 
 886   restore_preserved_marks();
 887 }
 888 
 889 void DefNewGeneration::restore_preserved_marks() {
 890   _preserved_marks_set.restore(nullptr);
 891 }
 892 
 893 void DefNewGeneration::handle_promotion_failure(oop old) {
 894   log_debug(gc, promotion)("Promotion failure size = " SIZE_FORMAT ") ", old->size());
 895 
 896   _promotion_failed = true;
 897   _promotion_failed_info.register_copy_failure(old->size());
 898   _preserved_marks_set.get()->push_if_necessary(old, old->mark());
 899 
 900   ContinuationGCSupport::transform_stack_chunk(old);
 901 
 902   // forward to self
 903   old->forward_to_self();
 904 
 905   _promo_failure_scan_stack.push(old);
 906 
 907   if (!_promo_failure_drain_in_progress) {
 908     // prevent recursion in copy_to_survivor_space()
 909     _promo_failure_drain_in_progress = true;
 910     drain_promo_failure_scan_stack();
 911     _promo_failure_drain_in_progress = false;
 912   }
 913 }
 914 
 915 oop DefNewGeneration::copy_to_survivor_space(oop old) {
 916   assert(is_in_reserved(old) && !old->is_forwarded(),
 917          "shouldn't be scavenging this oop");
 918   size_t s = old->size();
 919   oop obj = nullptr;
 920 
 921   // Try allocating obj in to-space (unless too old)
 922   if (old->age() < tenuring_threshold()) {
 923     obj = cast_to_oop(to()->allocate(s));
< prev index next >