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
69 bool phase_mark_loop();
70 bool mark_loop_needs_restart() const;
71 bool subphase_mark_from_roots();
72 bool subphase_preclean();
73 bool subphase_delay_to_keep_mmu_before_remark();
74 bool subphase_remark();
75 bool phase_rebuild_remembered_sets();
76 bool phase_delay_to_keep_mmu_before_cleanup();
77 bool phase_cleanup();
78 bool phase_clear_bitmap_for_next_mark();
79
80 void concurrent_cycle_start();
81 // Perform a full concurrent cycle.
82 void full_concurrent_cycle_do();
83 void concurrent_cycle_end();
84
85 // Delay pauses to meet MMU.
86 void delay_to_keep_mmu(bool remark);
87 double mmu_delay_end(G1Policy* policy, bool remark);
88
89 void run_service();
90 void stop_service();
91
92 public:
93 // Constructor
94 G1ConcurrentMarkThread(G1ConcurrentMark* cm);
95
96 // Total virtual time so far for this thread and concurrent marking tasks.
97 double vtime_accum();
98 // Marking virtual time so far this thread and concurrent marking tasks.
99 double vtime_mark_accum();
100
101 G1ConcurrentMark* cm() { return _cm; }
102
103 void set_idle() { assert(_state != Started, "must not be starting a new cycle"); _state = Idle; }
104 bool idle() { return _state == Idle; }
105 void set_started() { assert(_state == Idle, "cycle in progress"); _state = Started; }
106 bool started() { return _state == Started; }
107 void set_in_progress() { assert(_state == Started, "must be starting a cycle"); _state = InProgress; }
|