comparison src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp @ 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 aed758eda82a
children 7b835924c31c
comparison
equal deleted inserted replaced
7447:1de1b145f6bc 7448:b735136e0d82
1004 PSOldGen* old_gen); 1004 PSOldGen* old_gen);
1005 1005
1006 // Reset time since last full gc 1006 // Reset time since last full gc
1007 static void reset_millis_since_last_gc(); 1007 static void reset_millis_since_last_gc();
1008 1008
1009 protected:
1010 #ifdef VALIDATE_MARK_SWEEP
1011 static GrowableArray<void*>* _root_refs_stack;
1012 static GrowableArray<oop> * _live_oops;
1013 static GrowableArray<oop> * _live_oops_moved_to;
1014 static GrowableArray<size_t>* _live_oops_size;
1015 static size_t _live_oops_index;
1016 static size_t _live_oops_index_at_perm;
1017 static GrowableArray<void*>* _other_refs_stack;
1018 static GrowableArray<void*>* _adjusted_pointers;
1019 static bool _pointer_tracking;
1020 static bool _root_tracking;
1021
1022 // The following arrays are saved since the time of the last GC and
1023 // assist in tracking down problems where someone has done an errant
1024 // store into the heap, usually to an oop that wasn't properly
1025 // handleized across a GC. If we crash or otherwise fail before the
1026 // next GC, we can query these arrays to find out the object we had
1027 // intended to do the store to (assuming it is still alive) and the
1028 // offset within that object. Covered under RecordMarkSweepCompaction.
1029 static GrowableArray<HeapWord*> * _cur_gc_live_oops;
1030 static GrowableArray<HeapWord*> * _cur_gc_live_oops_moved_to;
1031 static GrowableArray<size_t>* _cur_gc_live_oops_size;
1032 static GrowableArray<HeapWord*> * _last_gc_live_oops;
1033 static GrowableArray<HeapWord*> * _last_gc_live_oops_moved_to;
1034 static GrowableArray<size_t>* _last_gc_live_oops_size;
1035 #endif
1036
1037 public: 1009 public:
1038 class MarkAndPushClosure: public OopClosure { 1010 class MarkAndPushClosure: public OopClosure {
1039 private: 1011 private:
1040 ParCompactionManager* _compaction_manager; 1012 ParCompactionManager* _compaction_manager;
1041 public: 1013 public:
1188 // Return the SpaceId for the given address. 1160 // Return the SpaceId for the given address.
1189 static SpaceId space_id(HeapWord* addr); 1161 static SpaceId space_id(HeapWord* addr);
1190 1162
1191 // Time since last full gc (in milliseconds). 1163 // Time since last full gc (in milliseconds).
1192 static jlong millis_since_last_gc(); 1164 static jlong millis_since_last_gc();
1193
1194 #ifdef VALIDATE_MARK_SWEEP
1195 static void track_adjusted_pointer(void* p, bool isroot);
1196 static void check_adjust_pointer(void* p);
1197 static void track_interior_pointers(oop obj);
1198 static void check_interior_pointers();
1199
1200 static void reset_live_oop_tracking();
1201 static void register_live_oop(oop p, size_t size);
1202 static void validate_live_oop(oop p, size_t size);
1203 static void live_oop_moved_to(HeapWord* q, size_t size, HeapWord* compaction_top);
1204 static void compaction_complete();
1205
1206 // Querying operation of RecordMarkSweepCompaction results.
1207 // Finds and prints the current base oop and offset for a word
1208 // within an oop that was live during the last GC. Helpful for
1209 // tracking down heap stomps.
1210 static void print_new_location_of_heap_address(HeapWord* q);
1211 #endif // #ifdef VALIDATE_MARK_SWEEP
1212 1165
1213 #ifndef PRODUCT 1166 #ifndef PRODUCT
1214 // Debugging support. 1167 // Debugging support.
1215 static const char* space_names[last_space_id]; 1168 static const char* space_names[last_space_id];
1216 static void print_region_ranges(); 1169 static void print_region_ranges();
1248 1201
1249 template <class T> 1202 template <class T>
1250 inline void PSParallelCompact::follow_root(ParCompactionManager* cm, T* p) { 1203 inline void PSParallelCompact::follow_root(ParCompactionManager* cm, T* p) {
1251 assert(!Universe::heap()->is_in_reserved(p), 1204 assert(!Universe::heap()->is_in_reserved(p),
1252 "roots shouldn't be things within the heap"); 1205 "roots shouldn't be things within the heap");
1253 #ifdef VALIDATE_MARK_SWEEP 1206
1254 if (ValidateMarkSweep) {
1255 guarantee(!_root_refs_stack->contains(p), "should only be in here once");
1256 _root_refs_stack->push(p);
1257 }
1258 #endif
1259 T heap_oop = oopDesc::load_heap_oop(p); 1207 T heap_oop = oopDesc::load_heap_oop(p);
1260 if (!oopDesc::is_null(heap_oop)) { 1208 if (!oopDesc::is_null(heap_oop)) {
1261 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); 1209 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
1262 if (mark_bitmap()->is_unmarked(obj)) { 1210 if (mark_bitmap()->is_unmarked(obj)) {
1263 if (mark_obj(obj)) { 1211 if (mark_obj(obj)) {
1292 assert(Universe::heap()->is_in_reserved(new_obj), 1240 assert(Universe::heap()->is_in_reserved(new_obj),
1293 "should be in object space"); 1241 "should be in object space");
1294 oopDesc::encode_store_heap_oop_not_null(p, new_obj); 1242 oopDesc::encode_store_heap_oop_not_null(p, new_obj);
1295 } 1243 }
1296 } 1244 }
1297 VALIDATE_MARK_SWEEP_ONLY(track_adjusted_pointer(p, isroot));
1298 } 1245 }
1299 1246
1300 template <class T> 1247 template <class T>
1301 inline void PSParallelCompact::KeepAliveClosure::do_oop_work(T* p) { 1248 inline void PSParallelCompact::KeepAliveClosure::do_oop_work(T* p) {
1302 #ifdef VALIDATE_MARK_SWEEP
1303 if (ValidateMarkSweep) {
1304 if (!Universe::heap()->is_in_reserved(p)) {
1305 _root_refs_stack->push(p);
1306 } else {
1307 _other_refs_stack->push(p);
1308 }
1309 }
1310 #endif
1311 mark_and_push(_compaction_manager, p); 1249 mark_and_push(_compaction_manager, p);
1312 } 1250 }
1313 1251
1314 inline bool PSParallelCompact::print_phases() { 1252 inline bool PSParallelCompact::print_phases() {
1315 return _print_phases; 1253 return _print_phases;