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));
|