comparison src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp @ 20337:1f1d373cd044

8038423: G1: Decommit memory within heap Summary: Allow G1 to decommit memory of arbitrary regions within the heap and their associated auxiliary data structures card table, BOT, hot card cache, and mark bitmaps. Reviewed-by: mgerdin, brutisso, jwilhelm
author tschatzl
date Thu, 21 Aug 2014 11:47:10 +0200
parents e5035defa3c4
children e7d0505c8a30
comparison
equal deleted inserted replaced
20336:6701abbc4441 20337:1f1d373cd044
21 * questions. 21 * questions.
22 * 22 *
23 */ 23 */
24 24
25 #include "precompiled.hpp" 25 #include "precompiled.hpp"
26 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
26 #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp" 27 #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
27 #include "gc_implementation/g1/heapRegion.hpp" 28 #include "gc_implementation/g1/heapRegion.hpp"
28 #include "gc_implementation/g1/satbQueue.hpp" 29 #include "gc_implementation/g1/satbQueue.hpp"
29 #include "runtime/mutexLocker.hpp" 30 #include "runtime/mutexLocker.hpp"
30 #include "runtime/orderAccess.inline.hpp" 31 #include "runtime/orderAccess.inline.hpp"
34 int max_covered_regions) : 35 int max_covered_regions) :
35 CardTableModRefBSForCTRS(whole_heap, max_covered_regions) 36 CardTableModRefBSForCTRS(whole_heap, max_covered_regions)
36 { 37 {
37 _kind = G1SATBCT; 38 _kind = G1SATBCT;
38 } 39 }
39
40 40
41 void G1SATBCardTableModRefBS::enqueue(oop pre_val) { 41 void G1SATBCardTableModRefBS::enqueue(oop pre_val) {
42 // Nulls should have been already filtered. 42 // Nulls should have been already filtered.
43 assert(pre_val->is_oop(true), "Error"); 43 assert(pre_val->is_oop(true), "Error");
44 44
122 void G1SATBCardTableModRefBS::verify_g1_young_region(MemRegion mr) { 122 void G1SATBCardTableModRefBS::verify_g1_young_region(MemRegion mr) {
123 verify_region(mr, g1_young_gen, true); 123 verify_region(mr, g1_young_gen, true);
124 } 124 }
125 #endif 125 #endif
126 126
127 void G1SATBCardTableLoggingModRefBSChangedListener::on_commit(uint start_idx, size_t num_regions) {
128 MemRegion mr(G1CollectedHeap::heap()->bottom_addr_for_region(start_idx), num_regions * HeapRegion::GrainWords);
129 _card_table->clear(mr);
130 }
131
127 G1SATBCardTableLoggingModRefBS:: 132 G1SATBCardTableLoggingModRefBS::
128 G1SATBCardTableLoggingModRefBS(MemRegion whole_heap, 133 G1SATBCardTableLoggingModRefBS(MemRegion whole_heap,
129 int max_covered_regions) : 134 int max_covered_regions) :
130 G1SATBCardTableModRefBS(whole_heap, max_covered_regions), 135 G1SATBCardTableModRefBS(whole_heap, max_covered_regions),
131 _dcqs(JavaThread::dirty_card_queue_set()) 136 _dcqs(JavaThread::dirty_card_queue_set()),
137 _listener()
132 { 138 {
133 _kind = G1SATBCTLogging; 139 _kind = G1SATBCTLogging;
140 _listener.set_card_table(this);
141 }
142
143 void G1SATBCardTableLoggingModRefBS::initialize(G1RegionToSpaceMapper* mapper) {
144 mapper->set_mapping_changed_listener(&_listener);
145
146 _byte_map_size = mapper->reserved().byte_size();
147
148 _guard_index = cards_required(_whole_heap.word_size()) - 1;
149 _last_valid_index = _guard_index - 1;
150
151 HeapWord* low_bound = _whole_heap.start();
152 HeapWord* high_bound = _whole_heap.end();
153
154 _cur_covered_regions = 1;
155 _covered[0] = _whole_heap;
156
157 _byte_map = (jbyte*) mapper->reserved().start();
158 byte_map_base = _byte_map - (uintptr_t(low_bound) >> card_shift);
159 assert(byte_for(low_bound) == &_byte_map[0], "Checking start of map");
160 assert(byte_for(high_bound-1) <= &_byte_map[_last_valid_index], "Checking end of map");
161
162 if (TraceCardTableModRefBS) {
163 gclog_or_tty->print_cr("G1SATBCardTableModRefBS::G1SATBCardTableModRefBS: ");
164 gclog_or_tty->print_cr(" "
165 " &_byte_map[0]: " INTPTR_FORMAT
166 " &_byte_map[_last_valid_index]: " INTPTR_FORMAT,
167 p2i(&_byte_map[0]),
168 p2i(&_byte_map[_last_valid_index]));
169 gclog_or_tty->print_cr(" "
170 " byte_map_base: " INTPTR_FORMAT,
171 p2i(byte_map_base));
172 }
134 } 173 }
135 174
136 void 175 void
137 G1SATBCardTableLoggingModRefBS::write_ref_field_work(void* field, 176 G1SATBCardTableLoggingModRefBS::write_ref_field_work(void* field,
138 oop new_val, 177 oop new_val,