Mercurial > hg > truffle
comparison src/share/vm/gc_implementation/parNew/parNewGeneration.hpp @ 679:cea947c8a988
6819891: ParNew: Fix work queue overflow code to deal correctly with +UseCompressedOops
Summary: When using compressed oops, rather than chaining the overflowed grey objects' pre-images through their klass words, we use GC-worker thread-local overflow stacks.
Reviewed-by: jcoomes, jmasa
author | ysr |
---|---|
date | Sat, 28 Mar 2009 15:47:29 -0700 |
parents | 0fbdb4381b99 |
children | becb17ad5e51 |
comparison
equal
deleted
inserted
replaced
678:4ac7d97e6101 | 679:cea947c8a988 |
---|---|
53 // The state needed by thread performing parallel young-gen collection. | 53 // The state needed by thread performing parallel young-gen collection. |
54 class ParScanThreadState { | 54 class ParScanThreadState { |
55 friend class ParScanThreadStateSet; | 55 friend class ParScanThreadStateSet; |
56 private: | 56 private: |
57 ObjToScanQueue *_work_queue; | 57 ObjToScanQueue *_work_queue; |
58 GrowableArray<oop>* _overflow_stack; | |
58 | 59 |
59 ParGCAllocBuffer _to_space_alloc_buffer; | 60 ParGCAllocBuffer _to_space_alloc_buffer; |
60 | 61 |
61 ParScanWithoutBarrierClosure _to_space_closure; // scan_without_gc_barrier | 62 ParScanWithoutBarrierClosure _to_space_closure; // scan_without_gc_barrier |
62 ParScanWithBarrierClosure _old_gen_closure; // scan_with_gc_barrier | 63 ParScanWithBarrierClosure _old_gen_closure; // scan_with_gc_barrier |
77 | 78 |
78 | 79 |
79 Space* _to_space; | 80 Space* _to_space; |
80 Space* to_space() { return _to_space; } | 81 Space* to_space() { return _to_space; } |
81 | 82 |
83 ParNewGeneration* _young_gen; | |
84 ParNewGeneration* young_gen() const { return _young_gen; } | |
85 | |
82 Generation* _old_gen; | 86 Generation* _old_gen; |
83 Generation* old_gen() { return _old_gen; } | 87 Generation* old_gen() { return _old_gen; } |
84 | 88 |
85 HeapWord *_young_old_boundary; | 89 HeapWord *_young_old_boundary; |
86 | 90 |
131 ParScanClosure& older_gen_closure() { return _older_gen_closure; } | 135 ParScanClosure& older_gen_closure() { return _older_gen_closure; } |
132 ParRootScanWithoutBarrierClosure& to_space_root_closure() { return _to_space_root_closure; }; | 136 ParRootScanWithoutBarrierClosure& to_space_root_closure() { return _to_space_root_closure; }; |
133 | 137 |
134 // Decrease queue size below "max_size". | 138 // Decrease queue size below "max_size". |
135 void trim_queues(int max_size); | 139 void trim_queues(int max_size); |
140 | |
141 // Private overflow stack usage | |
142 GrowableArray<oop>* overflow_stack() { return _overflow_stack; } | |
143 bool take_from_overflow_stack(); | |
144 void push_on_overflow_stack(oop p); | |
136 | 145 |
137 // Is new_obj a candidate for scan_partial_array_and_push_remainder method. | 146 // Is new_obj a candidate for scan_partial_array_and_push_remainder method. |
138 inline bool should_be_partially_scanned(oop new_obj, oop old_obj) const; | 147 inline bool should_be_partially_scanned(oop new_obj, oop old_obj) const; |
139 | 148 |
140 int* hash_seed() { return &_hash_seed; } | 149 int* hash_seed() { return &_hash_seed; } |
376 | 385 |
377 // in support of testing overflow code | 386 // in support of testing overflow code |
378 NOT_PRODUCT(int _overflow_counter;) | 387 NOT_PRODUCT(int _overflow_counter;) |
379 NOT_PRODUCT(bool should_simulate_overflow();) | 388 NOT_PRODUCT(bool should_simulate_overflow();) |
380 | 389 |
390 // Accessor for overflow list | |
391 oop overflow_list() { return _overflow_list; } | |
392 | |
381 // Push the given (from-space) object on the global overflow list. | 393 // Push the given (from-space) object on the global overflow list. |
382 void push_on_overflow_list(oop from_space_obj, ParScanThreadState* par_scan_state); | 394 void push_on_overflow_list(oop from_space_obj, ParScanThreadState* par_scan_state); |
383 | 395 |
384 // If the global overflow list is non-empty, move some tasks from it | 396 // If the global overflow list is non-empty, move some tasks from it |
385 // onto "work_q" (which must be empty). No more than 1/4 of the | 397 // onto "work_q" (which need not be empty). No more than 1/4 of the |
386 // max_elems of "work_q" are moved. | 398 // available space on "work_q" is used. |
387 bool take_from_overflow_list(ParScanThreadState* par_scan_state); | 399 bool take_from_overflow_list(ParScanThreadState* par_scan_state); |
400 bool take_from_overflow_list_work(ParScanThreadState* par_scan_state); | |
388 | 401 |
389 // The task queues to be used by parallel GC threads. | 402 // The task queues to be used by parallel GC threads. |
390 ObjToScanQueueSet* task_queues() { | 403 ObjToScanQueueSet* task_queues() { |
391 return _task_queues; | 404 return _task_queues; |
392 } | 405 } |