comparison src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp @ 113:ba764ed4b6f2

6420645: Create a vm that uses compressed oops for up to 32gb heapsizes Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author coleenp
date Sun, 13 Apr 2008 17:43:42 -0400
parents a61af66fc99e
children d1605aabd0a1 12eea04c8b06
comparison
equal deleted inserted replaced
110:a49a647afe9a 113:ba764ed4b6f2
26 # include "incls/_cardTableExtension.cpp.incl" 26 # include "incls/_cardTableExtension.cpp.incl"
27 27
28 // Checks an individual oop for missing precise marks. Mark 28 // Checks an individual oop for missing precise marks. Mark
29 // may be either dirty or newgen. 29 // may be either dirty or newgen.
30 class CheckForUnmarkedOops : public OopClosure { 30 class CheckForUnmarkedOops : public OopClosure {
31 PSYoungGen* _young_gen; 31 private:
32 PSYoungGen* _young_gen;
32 CardTableExtension* _card_table; 33 CardTableExtension* _card_table;
33 HeapWord* _unmarked_addr; 34 HeapWord* _unmarked_addr;
34 jbyte* _unmarked_card; 35 jbyte* _unmarked_card;
35 36
36 public: 37 protected:
37 CheckForUnmarkedOops( PSYoungGen* young_gen, CardTableExtension* card_table ) : 38 template <class T> void do_oop_work(T* p) {
38 _young_gen(young_gen), _card_table(card_table), _unmarked_addr(NULL) { } 39 oop obj = oopDesc::load_decode_heap_oop_not_null(p);
39 40 if (_young_gen->is_in_reserved(obj) &&
40 virtual void do_oop(oop* p) {
41 if (_young_gen->is_in_reserved(*p) &&
42 !_card_table->addr_is_marked_imprecise(p)) { 41 !_card_table->addr_is_marked_imprecise(p)) {
43 // Don't overwrite the first missing card mark 42 // Don't overwrite the first missing card mark
44 if (_unmarked_addr == NULL) { 43 if (_unmarked_addr == NULL) {
45 _unmarked_addr = (HeapWord*)p; 44 _unmarked_addr = (HeapWord*)p;
46 _unmarked_card = _card_table->byte_for(p); 45 _unmarked_card = _card_table->byte_for(p);
47 } 46 }
48 } 47 }
49 } 48 }
50 49
50 public:
51 CheckForUnmarkedOops(PSYoungGen* young_gen, CardTableExtension* card_table) :
52 _young_gen(young_gen), _card_table(card_table), _unmarked_addr(NULL) { }
53
54 virtual void do_oop(oop* p) { CheckForUnmarkedOops::do_oop_work(p); }
55 virtual void do_oop(narrowOop* p) { CheckForUnmarkedOops::do_oop_work(p); }
56
51 bool has_unmarked_oop() { 57 bool has_unmarked_oop() {
52 return _unmarked_addr != NULL; 58 return _unmarked_addr != NULL;
53 } 59 }
54 }; 60 };
55 61
56 // Checks all objects for the existance of some type of mark, 62 // Checks all objects for the existance of some type of mark,
57 // precise or imprecise, dirty or newgen. 63 // precise or imprecise, dirty or newgen.
58 class CheckForUnmarkedObjects : public ObjectClosure { 64 class CheckForUnmarkedObjects : public ObjectClosure {
59 PSYoungGen* _young_gen; 65 private:
66 PSYoungGen* _young_gen;
60 CardTableExtension* _card_table; 67 CardTableExtension* _card_table;
61 68
62 public: 69 public:
63 CheckForUnmarkedObjects() { 70 CheckForUnmarkedObjects() {
64 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap(); 71 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
73 // Card marks are not precise. The current system can leave us with 80 // Card marks are not precise. The current system can leave us with
74 // a mismash of precise marks and begining of object marks. This means 81 // a mismash of precise marks and begining of object marks. This means
75 // we test for missing precise marks first. If any are found, we don't 82 // we test for missing precise marks first. If any are found, we don't
76 // fail unless the object head is also unmarked. 83 // fail unless the object head is also unmarked.
77 virtual void do_object(oop obj) { 84 virtual void do_object(oop obj) {
78 CheckForUnmarkedOops object_check( _young_gen, _card_table ); 85 CheckForUnmarkedOops object_check(_young_gen, _card_table);
79 obj->oop_iterate(&object_check); 86 obj->oop_iterate(&object_check);
80 if (object_check.has_unmarked_oop()) { 87 if (object_check.has_unmarked_oop()) {
81 assert(_card_table->addr_is_marked_imprecise(obj), "Found unmarked young_gen object"); 88 assert(_card_table->addr_is_marked_imprecise(obj), "Found unmarked young_gen object");
82 } 89 }
83 } 90 }
84 }; 91 };
85 92
86 // Checks for precise marking of oops as newgen. 93 // Checks for precise marking of oops as newgen.
87 class CheckForPreciseMarks : public OopClosure { 94 class CheckForPreciseMarks : public OopClosure {
88 PSYoungGen* _young_gen; 95 private:
96 PSYoungGen* _young_gen;
89 CardTableExtension* _card_table; 97 CardTableExtension* _card_table;
98
99 protected:
100 template <class T> void do_oop_work(T* p) {
101 oop obj = oopDesc::load_decode_heap_oop_not_null(p);
102 if (_young_gen->is_in_reserved(obj)) {
103 assert(_card_table->addr_is_marked_precise(p), "Found unmarked precise oop");
104 _card_table->set_card_newgen(p);
105 }
106 }
90 107
91 public: 108 public:
92 CheckForPreciseMarks( PSYoungGen* young_gen, CardTableExtension* card_table ) : 109 CheckForPreciseMarks( PSYoungGen* young_gen, CardTableExtension* card_table ) :
93 _young_gen(young_gen), _card_table(card_table) { } 110 _young_gen(young_gen), _card_table(card_table) { }
94 111
95 virtual void do_oop(oop* p) { 112 virtual void do_oop(oop* p) { CheckForPreciseMarks::do_oop_work(p); }
96 if (_young_gen->is_in_reserved(*p)) { 113 virtual void do_oop(narrowOop* p) { CheckForPreciseMarks::do_oop_work(p); }
97 assert(_card_table->addr_is_marked_precise(p), "Found unmarked precise oop");
98 _card_table->set_card_newgen(p);
99 }
100 }
101 }; 114 };
102 115
103 // We get passed the space_top value to prevent us from traversing into 116 // We get passed the space_top value to prevent us from traversing into
104 // the old_gen promotion labs, which cannot be safely parsed. 117 // the old_gen promotion labs, which cannot be safely parsed.
105 void CardTableExtension::scavenge_contents(ObjectStartArray* start_array, 118 void CardTableExtension::scavenge_contents(ObjectStartArray* start_array,