comparison src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp @ 1836:894b1d7c7e01

6423256: GC stacks should use a better data structure 6942771: SEGV in ParScanThreadState::take_from_overflow_stack Reviewed-by: apetrusenko, ysr, pbk
author jcoomes
date Tue, 28 Sep 2010 15:56:15 -0700
parents b2a00dd3117c
children f95d63e2154a
comparison
equal deleted inserted replaced
1835:4805b9f4779e 1836:894b1d7c7e01
44 _start_array = old_gen()->start_array(); 44 _start_array = old_gen()->start_array();
45 45
46 marking_stack()->initialize(); 46 marking_stack()->initialize();
47 _objarray_stack.initialize(); 47 _objarray_stack.initialize();
48 region_stack()->initialize(); 48 region_stack()->initialize();
49
50 // Note that _revisit_klass_stack is allocated out of the
51 // C heap (as opposed to out of ResourceArena).
52 int size =
53 (SystemDictionary::number_of_classes() * 2) * 2 / ParallelGCThreads;
54 _revisit_klass_stack = new (ResourceObj::C_HEAP) GrowableArray<Klass*>(size, true);
55 // From some experiments (#klass/k)^2 for k = 10 seems a better fit, but this will
56 // have to do for now until we are able to investigate a more optimal setting.
57 _revisit_mdo_stack = new (ResourceObj::C_HEAP) GrowableArray<DataLayout*>(size*2, true);
58 }
59
60 ParCompactionManager::~ParCompactionManager() {
61 delete _revisit_klass_stack;
62 delete _revisit_mdo_stack;
63 // _manager_array and _stack_array are statics
64 // shared with all instances of ParCompactionManager
65 // should not be deallocated.
66 } 49 }
67 50
68 void ParCompactionManager::initialize(ParMarkBitMap* mbm) { 51 void ParCompactionManager::initialize(ParMarkBitMap* mbm) {
69 assert(PSParallelCompact::gc_task_manager() != NULL, 52 assert(PSParallelCompact::gc_task_manager() != NULL,
70 "Needed for initialization"); 53 "Needed for initialization");
132 assert(_manager_array != NULL, "Sanity"); 115 assert(_manager_array != NULL, "Sanity");
133 return _manager_array[index]; 116 return _manager_array[index];
134 } 117 }
135 118
136 void ParCompactionManager::reset() { 119 void ParCompactionManager::reset() {
137 for(uint i=0; i<ParallelGCThreads+1; i++) { 120 for(uint i = 0; i < ParallelGCThreads + 1; i++) {
138 manager_array(i)->revisit_klass_stack()->clear(); 121 assert(manager_array(i)->revisit_klass_stack()->is_empty(), "sanity");
139 manager_array(i)->revisit_mdo_stack()->clear(); 122 assert(manager_array(i)->revisit_mdo_stack()->is_empty(), "sanity");
140 } 123 }
141 } 124 }
142 125
143 void ParCompactionManager::follow_marking_stacks() { 126 void ParCompactionManager::follow_marking_stacks() {
144 do { 127 do {
176 while (region_stack()->pop_local(region_index)) { 159 while (region_stack()->pop_local(region_index)) {
177 PSParallelCompact::fill_and_update_region(this, region_index); 160 PSParallelCompact::fill_and_update_region(this, region_index);
178 } 161 }
179 } while (!region_stack()->is_empty()); 162 } while (!region_stack()->is_empty());
180 } 163 }
181
182 #ifdef ASSERT
183 bool ParCompactionManager::stacks_have_been_allocated() {
184 return (revisit_klass_stack()->data_addr() != NULL &&
185 revisit_mdo_stack()->data_addr() != NULL);
186 }
187 #endif