22 *
23 */
24
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_BUFFERINGOOPCLOSURE_HPP
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_BUFFERINGOOPCLOSURE_HPP
27
28 #include "memory/genOopClosures.hpp"
29 #include "memory/generation.hpp"
30 #include "runtime/os.hpp"
31 #include "utilities/taskqueue.hpp"
32
33 // A BufferingOops closure tries to separate out the cost of finding roots
34 // from the cost of applying closures to them. It maintains an array of
35 // ref-containing locations. Until the array is full, applying the closure
36 // to an oop* merely records that location in the array. Since this
37 // closure app cost is small, an elapsed timer can approximately attribute
38 // all of this cost to the cost of finding the roots. When the array fills
39 // up, the wrapped closure is applied to all elements, keeping track of
40 // this elapsed time of this process, and leaving the array empty.
41 // The caller must be sure to call "done" to process any unprocessed
42 // buffered entriess.
43
44 class Generation;
45 class HeapRegion;
46
47 class BufferingOopClosure: public OopClosure {
48 protected:
49 enum PrivateConstants {
50 BufferLength = 1024
51 };
52
53 StarTask _buffer[BufferLength];
54 StarTask* _buffer_top;
55 StarTask* _buffer_curr;
56
57 OopClosure* _oc;
58 double _closure_app_seconds;
59
60 void process_buffer () {
61 double start = os::elapsedTime();
62 for (StarTask* curr = _buffer; curr < _buffer_curr; ++curr) {
|
22 *
23 */
24
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_BUFFERINGOOPCLOSURE_HPP
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_BUFFERINGOOPCLOSURE_HPP
27
28 #include "memory/genOopClosures.hpp"
29 #include "memory/generation.hpp"
30 #include "runtime/os.hpp"
31 #include "utilities/taskqueue.hpp"
32
33 // A BufferingOops closure tries to separate out the cost of finding roots
34 // from the cost of applying closures to them. It maintains an array of
35 // ref-containing locations. Until the array is full, applying the closure
36 // to an oop* merely records that location in the array. Since this
37 // closure app cost is small, an elapsed timer can approximately attribute
38 // all of this cost to the cost of finding the roots. When the array fills
39 // up, the wrapped closure is applied to all elements, keeping track of
40 // this elapsed time of this process, and leaving the array empty.
41 // The caller must be sure to call "done" to process any unprocessed
42 // buffered entries.
43
44 class Generation;
45 class HeapRegion;
46
47 class BufferingOopClosure: public OopClosure {
48 protected:
49 enum PrivateConstants {
50 BufferLength = 1024
51 };
52
53 StarTask _buffer[BufferLength];
54 StarTask* _buffer_top;
55 StarTask* _buffer_curr;
56
57 OopClosure* _oc;
58 double _closure_app_seconds;
59
60 void process_buffer () {
61 double start = os::elapsedTime();
62 for (StarTask* curr = _buffer; curr < _buffer_curr; ++curr) {
|