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