79 #ifdef ASSERT |
79 #ifdef ASSERT |
80 bool PSParallelCompact::_dwl_initialized = false; |
80 bool PSParallelCompact::_dwl_initialized = false; |
81 #endif // #ifdef ASSERT |
81 #endif // #ifdef ASSERT |
82 |
82 |
83 #ifdef VALIDATE_MARK_SWEEP |
83 #ifdef VALIDATE_MARK_SWEEP |
84 GrowableArray<oop*>* PSParallelCompact::_root_refs_stack = NULL; |
84 GrowableArray<void*>* PSParallelCompact::_root_refs_stack = NULL; |
85 GrowableArray<oop> * PSParallelCompact::_live_oops = NULL; |
85 GrowableArray<oop> * PSParallelCompact::_live_oops = NULL; |
86 GrowableArray<oop> * PSParallelCompact::_live_oops_moved_to = NULL; |
86 GrowableArray<oop> * PSParallelCompact::_live_oops_moved_to = NULL; |
87 GrowableArray<size_t>* PSParallelCompact::_live_oops_size = NULL; |
87 GrowableArray<size_t>* PSParallelCompact::_live_oops_size = NULL; |
88 size_t PSParallelCompact::_live_oops_index = 0; |
88 size_t PSParallelCompact::_live_oops_index = 0; |
89 size_t PSParallelCompact::_live_oops_index_at_perm = 0; |
89 size_t PSParallelCompact::_live_oops_index_at_perm = 0; |
90 GrowableArray<oop*>* PSParallelCompact::_other_refs_stack = NULL; |
90 GrowableArray<void*>* PSParallelCompact::_other_refs_stack = NULL; |
91 GrowableArray<oop*>* PSParallelCompact::_adjusted_pointers = NULL; |
91 GrowableArray<void*>* PSParallelCompact::_adjusted_pointers = NULL; |
92 bool PSParallelCompact::_pointer_tracking = false; |
92 bool PSParallelCompact::_pointer_tracking = false; |
93 bool PSParallelCompact::_root_tracking = true; |
93 bool PSParallelCompact::_root_tracking = true; |
94 |
94 |
95 GrowableArray<HeapWord*>* PSParallelCompact::_cur_gc_live_oops = NULL; |
95 GrowableArray<HeapWord*>* PSParallelCompact::_cur_gc_live_oops = NULL; |
96 GrowableArray<HeapWord*>* PSParallelCompact::_cur_gc_live_oops_moved_to = NULL; |
96 GrowableArray<HeapWord*>* PSParallelCompact::_cur_gc_live_oops_moved_to = NULL; |
809 CollectorCounters* PSParallelCompact::_counters = NULL; |
809 CollectorCounters* PSParallelCompact::_counters = NULL; |
810 ParMarkBitMap PSParallelCompact::_mark_bitmap; |
810 ParMarkBitMap PSParallelCompact::_mark_bitmap; |
811 ParallelCompactData PSParallelCompact::_summary_data; |
811 ParallelCompactData PSParallelCompact::_summary_data; |
812 |
812 |
813 PSParallelCompact::IsAliveClosure PSParallelCompact::_is_alive_closure; |
813 PSParallelCompact::IsAliveClosure PSParallelCompact::_is_alive_closure; |
|
814 |
|
815 void PSParallelCompact::IsAliveClosure::do_object(oop p) { ShouldNotReachHere(); } |
|
816 bool PSParallelCompact::IsAliveClosure::do_object_b(oop p) { return mark_bitmap()->is_marked(p); } |
|
817 |
|
818 void PSParallelCompact::KeepAliveClosure::do_oop(oop* p) { PSParallelCompact::KeepAliveClosure::do_oop_work(p); } |
|
819 void PSParallelCompact::KeepAliveClosure::do_oop(narrowOop* p) { PSParallelCompact::KeepAliveClosure::do_oop_work(p); } |
|
820 |
814 PSParallelCompact::AdjustPointerClosure PSParallelCompact::_adjust_root_pointer_closure(true); |
821 PSParallelCompact::AdjustPointerClosure PSParallelCompact::_adjust_root_pointer_closure(true); |
815 PSParallelCompact::AdjustPointerClosure PSParallelCompact::_adjust_pointer_closure(false); |
822 PSParallelCompact::AdjustPointerClosure PSParallelCompact::_adjust_pointer_closure(false); |
816 |
823 |
817 void PSParallelCompact::KeepAliveClosure::do_oop(oop* p) { |
824 void PSParallelCompact::AdjustPointerClosure::do_oop(oop* p) { adjust_pointer(p, _is_root); } |
818 #ifdef VALIDATE_MARK_SWEEP |
825 void PSParallelCompact::AdjustPointerClosure::do_oop(narrowOop* p) { adjust_pointer(p, _is_root); } |
819 if (ValidateMarkSweep) { |
826 |
820 if (!Universe::heap()->is_in_reserved(p)) { |
827 void PSParallelCompact::FollowStackClosure::do_void() { follow_stack(_compaction_manager); } |
821 _root_refs_stack->push(p); |
828 |
822 } else { |
829 void PSParallelCompact::MarkAndPushClosure::do_oop(oop* p) { mark_and_push(_compaction_manager, p); } |
823 _other_refs_stack->push(p); |
830 void PSParallelCompact::MarkAndPushClosure::do_oop(narrowOop* p) { mark_and_push(_compaction_manager, p); } |
824 } |
|
825 } |
|
826 #endif |
|
827 mark_and_push(_compaction_manager, p); |
|
828 } |
|
829 |
|
830 void PSParallelCompact::mark_and_follow(ParCompactionManager* cm, |
|
831 oop* p) { |
|
832 assert(Universe::heap()->is_in_reserved(p), |
|
833 "we should only be traversing objects here"); |
|
834 oop m = *p; |
|
835 if (m != NULL && mark_bitmap()->is_unmarked(m)) { |
|
836 if (mark_obj(m)) { |
|
837 m->follow_contents(cm); // Follow contents of the marked object |
|
838 } |
|
839 } |
|
840 } |
|
841 |
|
842 // Anything associated with this variable is temporary. |
|
843 |
|
844 void PSParallelCompact::mark_and_push_internal(ParCompactionManager* cm, |
|
845 oop* p) { |
|
846 // Push marked object, contents will be followed later |
|
847 oop m = *p; |
|
848 if (mark_obj(m)) { |
|
849 // This thread marked the object and |
|
850 // owns the subsequent processing of it. |
|
851 cm->save_for_scanning(m); |
|
852 } |
|
853 } |
|
854 |
831 |
855 void PSParallelCompact::post_initialize() { |
832 void PSParallelCompact::post_initialize() { |
856 ParallelScavengeHeap* heap = gc_heap(); |
833 ParallelScavengeHeap* heap = gc_heap(); |
857 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity"); |
834 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity"); |
858 |
835 |
2749 old_gen->start_array()->reset(); |
2726 old_gen->start_array()->reset(); |
2750 old_gen->move_and_update(cm); |
2727 old_gen->move_and_update(cm); |
2751 young_gen->move_and_update(cm); |
2728 young_gen->move_and_update(cm); |
2752 } |
2729 } |
2753 |
2730 |
2754 void PSParallelCompact::follow_root(ParCompactionManager* cm, oop* p) { |
|
2755 assert(!Universe::heap()->is_in_reserved(p), |
|
2756 "roots shouldn't be things within the heap"); |
|
2757 #ifdef VALIDATE_MARK_SWEEP |
|
2758 if (ValidateMarkSweep) { |
|
2759 guarantee(!_root_refs_stack->contains(p), "should only be in here once"); |
|
2760 _root_refs_stack->push(p); |
|
2761 } |
|
2762 #endif |
|
2763 oop m = *p; |
|
2764 if (m != NULL && mark_bitmap()->is_unmarked(m)) { |
|
2765 if (mark_obj(m)) { |
|
2766 m->follow_contents(cm); // Follow contents of the marked object |
|
2767 } |
|
2768 } |
|
2769 follow_stack(cm); |
|
2770 } |
|
2771 |
2731 |
2772 void PSParallelCompact::follow_stack(ParCompactionManager* cm) { |
2732 void PSParallelCompact::follow_stack(ParCompactionManager* cm) { |
2773 while(!cm->overflow_stack()->is_empty()) { |
2733 while(!cm->overflow_stack()->is_empty()) { |
2774 oop obj = cm->overflow_stack()->pop(); |
2734 oop obj = cm->overflow_stack()->pop(); |
2775 obj->follow_contents(cm); |
2735 obj->follow_contents(cm); |
2819 } else { |
2779 } else { |
2820 ptrdiff_t index = _root_refs_stack->find(p); |
2780 ptrdiff_t index = _root_refs_stack->find(p); |
2821 if (index != -1) { |
2781 if (index != -1) { |
2822 int l = _root_refs_stack->length(); |
2782 int l = _root_refs_stack->length(); |
2823 if (l > 0 && l - 1 != index) { |
2783 if (l > 0 && l - 1 != index) { |
2824 oop* last = _root_refs_stack->pop(); |
2784 void* last = _root_refs_stack->pop(); |
2825 assert(last != p, "should be different"); |
2785 assert(last != p, "should be different"); |
2826 _root_refs_stack->at_put(index, last); |
2786 _root_refs_stack->at_put(index, last); |
2827 } else { |
2787 } else { |
2828 _root_refs_stack->remove(p); |
2788 _root_refs_stack->remove(p); |
2829 } |
2789 } |
2830 } |
2790 } |
2831 } |
2791 } |
2832 } |
2792 } |
2833 |
2793 |
2834 |
2794 |
2835 void PSParallelCompact::check_adjust_pointer(oop* p) { |
2795 void PSParallelCompact::check_adjust_pointer(void* p) { |
2836 _adjusted_pointers->push(p); |
2796 _adjusted_pointers->push(p); |
2837 } |
2797 } |
2838 |
2798 |
2839 |
2799 |
2840 class AdjusterTracker: public OopClosure { |
2800 class AdjusterTracker: public OopClosure { |
2841 public: |
2801 public: |
2842 AdjusterTracker() {}; |
2802 AdjusterTracker() {}; |
2843 void do_oop(oop* o) { PSParallelCompact::check_adjust_pointer(o); } |
2803 void do_oop(oop* o) { PSParallelCompact::check_adjust_pointer(o); } |
|
2804 void do_oop(narrowOop* o) { PSParallelCompact::check_adjust_pointer(o); } |
2844 }; |
2805 }; |
2845 |
2806 |
2846 |
2807 |
2847 void PSParallelCompact::track_interior_pointers(oop obj) { |
2808 void PSParallelCompact::track_interior_pointers(oop obj) { |
2848 if (ValidateMarkSweep) { |
2809 if (ValidateMarkSweep) { |
2945 } |
2906 } |
2946 |
2907 |
2947 tty->print_cr("Address " PTR_FORMAT " not found in live oop information from last GC", q); |
2908 tty->print_cr("Address " PTR_FORMAT " not found in live oop information from last GC", q); |
2948 } |
2909 } |
2949 #endif //VALIDATE_MARK_SWEEP |
2910 #endif //VALIDATE_MARK_SWEEP |
2950 |
|
2951 void PSParallelCompact::adjust_pointer(oop* p, bool isroot) { |
|
2952 oop obj = *p; |
|
2953 VALIDATE_MARK_SWEEP_ONLY(oop saved_new_pointer = NULL); |
|
2954 if (obj != NULL) { |
|
2955 oop new_pointer = (oop) summary_data().calc_new_pointer(obj); |
|
2956 assert(new_pointer != NULL || // is forwarding ptr? |
|
2957 obj->is_shared(), // never forwarded? |
|
2958 "should have a new location"); |
|
2959 // Just always do the update unconditionally? |
|
2960 if (new_pointer != NULL) { |
|
2961 *p = new_pointer; |
|
2962 assert(Universe::heap()->is_in_reserved(new_pointer), |
|
2963 "should be in object space"); |
|
2964 VALIDATE_MARK_SWEEP_ONLY(saved_new_pointer = new_pointer); |
|
2965 } |
|
2966 } |
|
2967 VALIDATE_MARK_SWEEP_ONLY(track_adjusted_pointer(p, saved_new_pointer, isroot)); |
|
2968 } |
|
2969 |
2911 |
2970 // Update interior oops in the ranges of chunks [beg_chunk, end_chunk). |
2912 // Update interior oops in the ranges of chunks [beg_chunk, end_chunk). |
2971 void |
2913 void |
2972 PSParallelCompact::update_and_deadwood_in_dense_prefix(ParCompactionManager* cm, |
2914 PSParallelCompact::update_and_deadwood_in_dense_prefix(ParCompactionManager* cm, |
2973 SpaceId space_id, |
2915 SpaceId space_id, |