20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #ifndef SHARE_GC_G1_G1CONCURRENTMARKTHREAD_HPP
26 #define SHARE_GC_G1_G1CONCURRENTMARKTHREAD_HPP
27
28 #include "gc/shared/concurrentGCThread.hpp"
29
30 class G1ConcurrentMark;
31 class G1Policy;
32
33 // The concurrent mark thread triggers the various steps of the concurrent marking
34 // cycle, including various marking cleanup.
35 class G1ConcurrentMarkThread: public ConcurrentGCThread {
36 friend class VMStructs;
37
38 double _vtime_start; // Initial virtual time.
39 double _vtime_accum; // Accumulated virtual time.
40 double _vtime_mark_accum;
41
42 G1ConcurrentMark* _cm;
43
44 enum State {
45 Idle,
46 Started,
47 InProgress
48 };
49
50 volatile State _state;
51
52 void sleep_before_next_cycle();
53 // Delay marking to meet MMU.
54 void delay_to_keep_mmu(G1Policy* g1_policy, bool remark);
55 double mmu_delay_end(G1Policy* g1_policy, bool remark);
56
57 void run_service();
58 void stop_service();
59
60 public:
61 // Constructor
62 G1ConcurrentMarkThread(G1ConcurrentMark* cm);
63
64 // Total virtual time so far for this thread and concurrent marking tasks.
65 double vtime_accum();
66 // Marking virtual time so far this thread and concurrent marking tasks.
67 double vtime_mark_accum();
68
69 G1ConcurrentMark* cm() { return _cm; }
70
71 void set_idle() { assert(_state != Started, "must not be starting a new cycle"); _state = Idle; }
72 bool idle() { return _state == Idle; }
73 void set_started() { assert(_state == Idle, "cycle in progress"); _state = Started; }
74 bool started() { return _state == Started; }
75 void set_in_progress() { assert(_state == Started, "must be starting a cycle"); _state = InProgress; }
|
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #ifndef SHARE_GC_G1_G1CONCURRENTMARKTHREAD_HPP
26 #define SHARE_GC_G1_G1CONCURRENTMARKTHREAD_HPP
27
28 #include "gc/shared/concurrentGCThread.hpp"
29
30 class G1ConcurrentMark;
31 class G1Policy;
32
33 // The concurrent mark thread triggers the various steps of the concurrent marking
34 // cycle, including various marking cleanup.
35 class G1ConcurrentMarkThread: public ConcurrentGCThread {
36 friend class VMStructs;
37
38 double _vtime_start; // Initial virtual time.
39 double _vtime_accum; // Accumulated virtual time.
40
41 G1ConcurrentMark* _cm;
42
43 enum ServiceState {
44 Idle,
45 Started,
46 InProgress
47 };
48
49 volatile ServiceState _state;
50
51 // Wait for next cycle. Returns true if we should stop the service.
52 bool wait_for_next_cycle();
53
54 // Phases for the full concurrent marking cycle in order.
55 //
56 // We have to ensure that we finish scanning the root regions
57 // before the next GC takes place. To ensure this we have to
58 // make sure that we do not join the STS until the root regions
59 // have been scanned. If we did then it's possible that a
60 // subsequent GC could block us from joining the STS and proceed
61 // without the root regions have been scanned which would be a
62 // correctness issue.
63 // ConcurrentGCBreakpoints must not be placed before the the root
64 // region scan phase too for this reason.
65 bool phase_concurrent_cycle_start();
66 bool phase_clear_cld_claimed_marks();
67 bool phase_scan_root_regions();
68 bool phase_mark_from_roots();
69 bool phase_preclean();
70 bool phase_delay_to_keep_mmu_before_remark();
71 bool phase_remark(bool& has_overflown);
72 bool phase_rebuild_remembered_sets();
73 bool phase_delay_to_keep_mmu_before_cleanup();
74 bool phase_cleanup();
75 bool phase_clear_bitmap_for_next_mark();
76
77 void concurrent_cycle_start();
78 // Perform a full concurrent cycle.
79 void full_concurrent_cycle_do();
80 void concurrent_cycle_end();
81
82 // Delay pauses to meet MMU.
83 void delay_to_keep_mmu(bool remark);
84 double mmu_delay_end(G1Policy* policy, bool remark);
85
86 void run_service();
87 void stop_service();
88
89 public:
90 // Constructor
91 G1ConcurrentMarkThread(G1ConcurrentMark* cm);
92
93 // Total virtual time so far for this thread and concurrent marking tasks.
94 double vtime_accum();
95 // Marking virtual time so far this thread and concurrent marking tasks.
96 double vtime_mark_accum();
97
98 G1ConcurrentMark* cm() { return _cm; }
99
100 void set_idle() { assert(_state != Started, "must not be starting a new cycle"); _state = Idle; }
101 bool idle() { return _state == Idle; }
102 void set_started() { assert(_state == Idle, "cycle in progress"); _state = Started; }
103 bool started() { return _state == Started; }
104 void set_in_progress() { assert(_state == Started, "must be starting a cycle"); _state = InProgress; }
|