Mercurial > hg > graal-compiler
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 |