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,