31 |
31 |
32 // It would be better if these types could be kept local to the .cpp file, |
32 // It would be better if these types could be kept local to the .cpp file, |
33 // but they must be here to allow ParScanClosure::do_oop_work to be defined |
33 // but they must be here to allow ParScanClosure::do_oop_work to be defined |
34 // in genOopClosures.inline.hpp. |
34 // in genOopClosures.inline.hpp. |
35 |
35 |
36 |
|
37 typedef OopTaskQueue ObjToScanQueue; |
36 typedef OopTaskQueue ObjToScanQueue; |
38 typedef OopTaskQueueSet ObjToScanQueueSet; |
37 typedef OopTaskQueueSet ObjToScanQueueSet; |
39 |
38 |
40 // Enable this to get push/pop/steal stats. |
39 // Enable this to get push/pop/steal stats. |
41 const int PAR_STATS_ENABLED = 0; |
40 const int PAR_STATS_ENABLED = 0; |
42 |
41 |
43 class ParKeepAliveClosure: public DefNewGeneration::KeepAliveClosure { |
42 class ParKeepAliveClosure: public DefNewGeneration::KeepAliveClosure { |
|
43 private: |
44 ParScanWeakRefClosure* _par_cl; |
44 ParScanWeakRefClosure* _par_cl; |
|
45 protected: |
|
46 template <class T> void do_oop_work(T* p); |
45 public: |
47 public: |
46 ParKeepAliveClosure(ParScanWeakRefClosure* cl); |
48 ParKeepAliveClosure(ParScanWeakRefClosure* cl); |
47 void do_oop(oop* p); |
49 virtual void do_oop(oop* p); |
|
50 virtual void do_oop(narrowOop* p); |
48 }; |
51 }; |
49 |
52 |
50 // The state needed by thread performing parallel young-gen collection. |
53 // The state needed by thread performing parallel young-gen collection. |
51 class ParScanThreadState { |
54 class ParScanThreadState { |
52 friend class ParScanThreadStateSet; |
55 friend class ParScanThreadStateSet; |
|
56 private: |
53 ObjToScanQueue *_work_queue; |
57 ObjToScanQueue *_work_queue; |
54 |
58 |
55 ParGCAllocBuffer _to_space_alloc_buffer; |
59 ParGCAllocBuffer _to_space_alloc_buffer; |
56 |
60 |
57 ParScanWithoutBarrierClosure _to_space_closure; // scan_without_gc_barrier |
61 ParScanWithoutBarrierClosure _to_space_closure; // scan_without_gc_barrier |
109 ParScanThreadState(Space* to_space_, ParNewGeneration* gen_, |
113 ParScanThreadState(Space* to_space_, ParNewGeneration* gen_, |
110 Generation* old_gen_, int thread_num_, |
114 Generation* old_gen_, int thread_num_, |
111 ObjToScanQueueSet* work_queue_set_, size_t desired_plab_sz_, |
115 ObjToScanQueueSet* work_queue_set_, size_t desired_plab_sz_, |
112 ParallelTaskTerminator& term_); |
116 ParallelTaskTerminator& term_); |
113 |
117 |
114 public: |
118 public: |
115 ageTable* age_table() {return &_ageTable;} |
119 ageTable* age_table() {return &_ageTable;} |
116 |
120 |
117 ObjToScanQueue* work_queue() { return _work_queue; } |
121 ObjToScanQueue* work_queue() { return _work_queue; } |
118 |
122 |
119 ParGCAllocBuffer* to_space_alloc_buffer() { |
123 ParGCAllocBuffer* to_space_alloc_buffer() { |
193 double term_time() { return _term_time; } |
197 double term_time() { return _term_time; } |
194 |
198 |
195 double elapsed() { |
199 double elapsed() { |
196 return os::elapsedTime() - _start; |
200 return os::elapsedTime() - _start; |
197 } |
201 } |
198 |
|
199 }; |
202 }; |
200 |
203 |
201 class ParNewGenTask: public AbstractGangTask { |
204 class ParNewGenTask: public AbstractGangTask { |
202 ParNewGeneration* _gen; |
205 private: |
203 Generation* _next_gen; |
206 ParNewGeneration* _gen; |
204 HeapWord* _young_old_boundary; |
207 Generation* _next_gen; |
|
208 HeapWord* _young_old_boundary; |
205 class ParScanThreadStateSet* _state_set; |
209 class ParScanThreadStateSet* _state_set; |
206 |
210 |
207 public: |
211 public: |
208 ParNewGenTask(ParNewGeneration* gen, |
212 ParNewGenTask(ParNewGeneration* gen, |
209 Generation* next_gen, |
213 Generation* next_gen, |
214 |
218 |
215 void work(int i); |
219 void work(int i); |
216 }; |
220 }; |
217 |
221 |
218 class KeepAliveClosure: public DefNewGeneration::KeepAliveClosure { |
222 class KeepAliveClosure: public DefNewGeneration::KeepAliveClosure { |
|
223 protected: |
|
224 template <class T> void do_oop_work(T* p); |
219 public: |
225 public: |
220 KeepAliveClosure(ScanWeakRefClosure* cl); |
226 KeepAliveClosure(ScanWeakRefClosure* cl); |
221 void do_oop(oop* p); |
227 virtual void do_oop(oop* p); |
|
228 virtual void do_oop(narrowOop* p); |
222 }; |
229 }; |
223 |
230 |
224 class EvacuateFollowersClosureGeneral: public VoidClosure { |
231 class EvacuateFollowersClosureGeneral: public VoidClosure { |
225 GenCollectedHeap* _gch; |
232 private: |
226 int _level; |
233 GenCollectedHeap* _gch; |
227 OopsInGenClosure* _scan_cur_or_nonheap; |
234 int _level; |
228 OopsInGenClosure* _scan_older; |
235 OopsInGenClosure* _scan_cur_or_nonheap; |
229 public: |
236 OopsInGenClosure* _scan_older; |
230 EvacuateFollowersClosureGeneral(GenCollectedHeap* gch, int level, |
237 public: |
231 OopsInGenClosure* cur, |
238 EvacuateFollowersClosureGeneral(GenCollectedHeap* gch, int level, |
232 OopsInGenClosure* older); |
239 OopsInGenClosure* cur, |
233 void do_void(); |
240 OopsInGenClosure* older); |
|
241 virtual void do_void(); |
234 }; |
242 }; |
235 |
243 |
236 // Closure for scanning ParNewGeneration. |
244 // Closure for scanning ParNewGeneration. |
237 // Same as ScanClosure, except does parallel GC barrier. |
245 // Same as ScanClosure, except does parallel GC barrier. |
238 class ScanClosureWithParBarrier: public ScanClosure { |
246 class ScanClosureWithParBarrier: public ScanClosure { |
239 public: |
247 protected: |
|
248 template <class T> void do_oop_work(T* p); |
|
249 public: |
240 ScanClosureWithParBarrier(ParNewGeneration* g, bool gc_barrier); |
250 ScanClosureWithParBarrier(ParNewGeneration* g, bool gc_barrier); |
241 void do_oop(oop* p); |
251 virtual void do_oop(oop* p); |
|
252 virtual void do_oop(narrowOop* p); |
242 }; |
253 }; |
243 |
254 |
244 // Implements AbstractRefProcTaskExecutor for ParNew. |
255 // Implements AbstractRefProcTaskExecutor for ParNew. |
245 class ParNewRefProcTaskExecutor: public AbstractRefProcTaskExecutor { |
256 class ParNewRefProcTaskExecutor: public AbstractRefProcTaskExecutor { |
246 public: |
257 private: |
247 |
258 ParNewGeneration& _generation; |
|
259 ParScanThreadStateSet& _state_set; |
|
260 public: |
248 ParNewRefProcTaskExecutor(ParNewGeneration& generation, |
261 ParNewRefProcTaskExecutor(ParNewGeneration& generation, |
249 ParScanThreadStateSet& state_set) |
262 ParScanThreadStateSet& state_set) |
250 : _generation(generation), _state_set(state_set) |
263 : _generation(generation), _state_set(state_set) |
251 { } |
264 { } |
252 |
265 |
253 // Executes a task using worker threads. |
266 // Executes a task using worker threads. |
254 virtual void execute(ProcessTask& task); |
267 virtual void execute(ProcessTask& task); |
255 virtual void execute(EnqueueTask& task); |
268 virtual void execute(EnqueueTask& task); |
256 // Switch to single threaded mode. |
269 // Switch to single threaded mode. |
257 virtual void set_single_threaded_mode(); |
270 virtual void set_single_threaded_mode(); |
258 private: |
|
259 ParNewGeneration& _generation; |
|
260 ParScanThreadStateSet& _state_set; |
|
261 }; |
271 }; |
262 |
272 |
263 |
273 |
264 // A Generation that does parallel young-gen collection. |
274 // A Generation that does parallel young-gen collection. |
265 |
275 |
267 friend class ParNewGenTask; |
277 friend class ParNewGenTask; |
268 friend class ParNewRefProcTask; |
278 friend class ParNewRefProcTask; |
269 friend class ParNewRefProcTaskExecutor; |
279 friend class ParNewRefProcTaskExecutor; |
270 friend class ParScanThreadStateSet; |
280 friend class ParScanThreadStateSet; |
271 |
281 |
|
282 private: |
272 // XXX use a global constant instead of 64! |
283 // XXX use a global constant instead of 64! |
273 struct ObjToScanQueuePadded { |
284 struct ObjToScanQueuePadded { |
274 ObjToScanQueue work_queue; |
285 ObjToScanQueue work_queue; |
275 char pad[64 - sizeof(ObjToScanQueue)]; // prevent false sharing |
286 char pad[64 - sizeof(ObjToScanQueue)]; // prevent false sharing |
276 }; |
287 }; |
312 |
323 |
313 // Adjust the tenuring threshold. See the implementation for |
324 // Adjust the tenuring threshold. See the implementation for |
314 // the details of the policy. |
325 // the details of the policy. |
315 virtual void adjust_desired_tenuring_threshold(); |
326 virtual void adjust_desired_tenuring_threshold(); |
316 |
327 |
317 public: |
328 public: |
318 ParNewGeneration(ReservedSpace rs, size_t initial_byte_size, int level); |
329 ParNewGeneration(ReservedSpace rs, size_t initial_byte_size, int level); |
319 |
330 |
320 ~ParNewGeneration() { |
331 ~ParNewGeneration() { |
321 for (uint i = 0; i < ParallelGCThreads; i++) |
332 for (uint i = 0; i < ParallelGCThreads; i++) |
322 delete _task_queues->queue(i); |
333 delete _task_queues->queue(i); |