Mercurial > hg > graal-jvmci-8
comparison src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp @ 7448:b735136e0d82
8004132: SerialGC: ValidateMarkSweep broken when running GCOld
Summary: Remove bit-rotten ValidateMarkSweep functionality and flag.
Reviewed-by: johnc, jmasa
Contributed-by: tamao <tao.mao@oracle.com>
author | johnc |
---|---|
date | Wed, 02 Jan 2013 11:32:41 -0800 |
parents | d0aa87f04bd5 |
children | 7b835924c31c |
comparison
equal
deleted
inserted
replaced
7447:1de1b145f6bc | 7448:b735136e0d82 |
---|---|
96 double PSParallelCompact::_dwl_first_term; | 96 double PSParallelCompact::_dwl_first_term; |
97 double PSParallelCompact::_dwl_adjustment; | 97 double PSParallelCompact::_dwl_adjustment; |
98 #ifdef ASSERT | 98 #ifdef ASSERT |
99 bool PSParallelCompact::_dwl_initialized = false; | 99 bool PSParallelCompact::_dwl_initialized = false; |
100 #endif // #ifdef ASSERT | 100 #endif // #ifdef ASSERT |
101 | |
102 #ifdef VALIDATE_MARK_SWEEP | |
103 GrowableArray<void*>* PSParallelCompact::_root_refs_stack = NULL; | |
104 GrowableArray<oop> * PSParallelCompact::_live_oops = NULL; | |
105 GrowableArray<oop> * PSParallelCompact::_live_oops_moved_to = NULL; | |
106 GrowableArray<size_t>* PSParallelCompact::_live_oops_size = NULL; | |
107 size_t PSParallelCompact::_live_oops_index = 0; | |
108 GrowableArray<void*>* PSParallelCompact::_other_refs_stack = NULL; | |
109 GrowableArray<void*>* PSParallelCompact::_adjusted_pointers = NULL; | |
110 bool PSParallelCompact::_pointer_tracking = false; | |
111 bool PSParallelCompact::_root_tracking = true; | |
112 | |
113 GrowableArray<HeapWord*>* PSParallelCompact::_cur_gc_live_oops = NULL; | |
114 GrowableArray<HeapWord*>* PSParallelCompact::_cur_gc_live_oops_moved_to = NULL; | |
115 GrowableArray<size_t> * PSParallelCompact::_cur_gc_live_oops_size = NULL; | |
116 GrowableArray<HeapWord*>* PSParallelCompact::_last_gc_live_oops = NULL; | |
117 GrowableArray<HeapWord*>* PSParallelCompact::_last_gc_live_oops_moved_to = NULL; | |
118 GrowableArray<size_t> * PSParallelCompact::_last_gc_live_oops_size = NULL; | |
119 #endif | |
120 | 101 |
121 void SplitInfo::record(size_t src_region_idx, size_t partial_obj_size, | 102 void SplitInfo::record(size_t src_region_idx, size_t partial_obj_size, |
122 HeapWord* destination) | 103 HeapWord* destination) |
123 { | 104 { |
124 assert(src_region_idx != 0, "invalid src_region_idx"); | 105 assert(src_region_idx != 0, "invalid src_region_idx"); |
2713 print_region_ranges(); | 2694 print_region_ranges(); |
2714 } | 2695 } |
2715 } | 2696 } |
2716 #endif // #ifdef ASSERT | 2697 #endif // #ifdef ASSERT |
2717 | 2698 |
2718 | |
2719 #ifdef VALIDATE_MARK_SWEEP | |
2720 | |
2721 void PSParallelCompact::track_adjusted_pointer(void* p, bool isroot) { | |
2722 if (!ValidateMarkSweep) | |
2723 return; | |
2724 | |
2725 if (!isroot) { | |
2726 if (_pointer_tracking) { | |
2727 guarantee(_adjusted_pointers->contains(p), "should have seen this pointer"); | |
2728 _adjusted_pointers->remove(p); | |
2729 } | |
2730 } else { | |
2731 ptrdiff_t index = _root_refs_stack->find(p); | |
2732 if (index != -1) { | |
2733 int l = _root_refs_stack->length(); | |
2734 if (l > 0 && l - 1 != index) { | |
2735 void* last = _root_refs_stack->pop(); | |
2736 assert(last != p, "should be different"); | |
2737 _root_refs_stack->at_put(index, last); | |
2738 } else { | |
2739 _root_refs_stack->remove(p); | |
2740 } | |
2741 } | |
2742 } | |
2743 } | |
2744 | |
2745 | |
2746 void PSParallelCompact::check_adjust_pointer(void* p) { | |
2747 _adjusted_pointers->push(p); | |
2748 } | |
2749 | |
2750 | |
2751 class AdjusterTracker: public OopClosure { | |
2752 public: | |
2753 AdjusterTracker() {}; | |
2754 void do_oop(oop* o) { PSParallelCompact::check_adjust_pointer(o); } | |
2755 void do_oop(narrowOop* o) { PSParallelCompact::check_adjust_pointer(o); } | |
2756 }; | |
2757 | |
2758 | |
2759 void PSParallelCompact::track_interior_pointers(oop obj) { | |
2760 if (ValidateMarkSweep) { | |
2761 _adjusted_pointers->clear(); | |
2762 _pointer_tracking = true; | |
2763 | |
2764 AdjusterTracker checker; | |
2765 obj->oop_iterate_no_header(&checker); | |
2766 } | |
2767 } | |
2768 | |
2769 | |
2770 void PSParallelCompact::check_interior_pointers() { | |
2771 if (ValidateMarkSweep) { | |
2772 _pointer_tracking = false; | |
2773 guarantee(_adjusted_pointers->length() == 0, "should have processed the same pointers"); | |
2774 } | |
2775 } | |
2776 | |
2777 | |
2778 void PSParallelCompact::reset_live_oop_tracking() { | |
2779 if (ValidateMarkSweep) { | |
2780 guarantee((size_t)_live_oops->length() == _live_oops_index, "should be at end of live oops"); | |
2781 _live_oops_index = 0; | |
2782 } | |
2783 } | |
2784 | |
2785 | |
2786 void PSParallelCompact::register_live_oop(oop p, size_t size) { | |
2787 if (ValidateMarkSweep) { | |
2788 _live_oops->push(p); | |
2789 _live_oops_size->push(size); | |
2790 _live_oops_index++; | |
2791 } | |
2792 } | |
2793 | |
2794 void PSParallelCompact::validate_live_oop(oop p, size_t size) { | |
2795 if (ValidateMarkSweep) { | |
2796 oop obj = _live_oops->at((int)_live_oops_index); | |
2797 guarantee(obj == p, "should be the same object"); | |
2798 guarantee(_live_oops_size->at((int)_live_oops_index) == size, "should be the same size"); | |
2799 _live_oops_index++; | |
2800 } | |
2801 } | |
2802 | |
2803 void PSParallelCompact::live_oop_moved_to(HeapWord* q, size_t size, | |
2804 HeapWord* compaction_top) { | |
2805 assert(oop(q)->forwardee() == NULL || oop(q)->forwardee() == oop(compaction_top), | |
2806 "should be moved to forwarded location"); | |
2807 if (ValidateMarkSweep) { | |
2808 PSParallelCompact::validate_live_oop(oop(q), size); | |
2809 _live_oops_moved_to->push(oop(compaction_top)); | |
2810 } | |
2811 if (RecordMarkSweepCompaction) { | |
2812 _cur_gc_live_oops->push(q); | |
2813 _cur_gc_live_oops_moved_to->push(compaction_top); | |
2814 _cur_gc_live_oops_size->push(size); | |
2815 } | |
2816 } | |
2817 | |
2818 | |
2819 void PSParallelCompact::compaction_complete() { | |
2820 if (RecordMarkSweepCompaction) { | |
2821 GrowableArray<HeapWord*>* _tmp_live_oops = _cur_gc_live_oops; | |
2822 GrowableArray<HeapWord*>* _tmp_live_oops_moved_to = _cur_gc_live_oops_moved_to; | |
2823 GrowableArray<size_t> * _tmp_live_oops_size = _cur_gc_live_oops_size; | |
2824 | |
2825 _cur_gc_live_oops = _last_gc_live_oops; | |
2826 _cur_gc_live_oops_moved_to = _last_gc_live_oops_moved_to; | |
2827 _cur_gc_live_oops_size = _last_gc_live_oops_size; | |
2828 _last_gc_live_oops = _tmp_live_oops; | |
2829 _last_gc_live_oops_moved_to = _tmp_live_oops_moved_to; | |
2830 _last_gc_live_oops_size = _tmp_live_oops_size; | |
2831 } | |
2832 } | |
2833 | |
2834 | |
2835 void PSParallelCompact::print_new_location_of_heap_address(HeapWord* q) { | |
2836 if (!RecordMarkSweepCompaction) { | |
2837 tty->print_cr("Requires RecordMarkSweepCompaction to be enabled"); | |
2838 return; | |
2839 } | |
2840 | |
2841 if (_last_gc_live_oops == NULL) { | |
2842 tty->print_cr("No compaction information gathered yet"); | |
2843 return; | |
2844 } | |
2845 | |
2846 for (int i = 0; i < _last_gc_live_oops->length(); i++) { | |
2847 HeapWord* old_oop = _last_gc_live_oops->at(i); | |
2848 size_t sz = _last_gc_live_oops_size->at(i); | |
2849 if (old_oop <= q && q < (old_oop + sz)) { | |
2850 HeapWord* new_oop = _last_gc_live_oops_moved_to->at(i); | |
2851 size_t offset = (q - old_oop); | |
2852 tty->print_cr("Address " PTR_FORMAT, q); | |
2853 tty->print_cr(" Was in oop " PTR_FORMAT ", size %d, at offset %d", old_oop, sz, offset); | |
2854 tty->print_cr(" Now in oop " PTR_FORMAT ", actual address " PTR_FORMAT, new_oop, new_oop + offset); | |
2855 return; | |
2856 } | |
2857 } | |
2858 | |
2859 tty->print_cr("Address " PTR_FORMAT " not found in live oop information from last GC", q); | |
2860 } | |
2861 #endif //VALIDATE_MARK_SWEEP | |
2862 | |
2863 // Update interior oops in the ranges of regions [beg_region, end_region). | 2699 // Update interior oops in the ranges of regions [beg_region, end_region). |
2864 void | 2700 void |
2865 PSParallelCompact::update_and_deadwood_in_dense_prefix(ParCompactionManager* cm, | 2701 PSParallelCompact::update_and_deadwood_in_dense_prefix(ParCompactionManager* cm, |
2866 SpaceId space_id, | 2702 SpaceId space_id, |
2867 size_t beg_region, | 2703 size_t beg_region, |