annotate src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp @ 6007:5c86f8211d1e

7160728: Introduce an extra logging level for G1 logging Summary: Added log levels "fine", "finer" and "finest". Let PrintGC map to "fine" and PrintGCDetails map to "finer". Separated out the per worker information in the G1 logging to the "finest" level. Reviewed-by: stefank, jwilhelm, tonyp, johnc
author brutisso
date Fri, 13 Apr 2012 01:59:38 +0200
parents 64bf7c8270cb
children 37552638d24a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1 /*
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4096
diff changeset
2 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
7 * published by the Free Software Foundation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
8 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
13 * accompanied this code).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
14 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1019
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1019
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1019
diff changeset
21 * questions.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
22 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
23 */
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1840
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1840
diff changeset
26 #include "gc_implementation/g1/concurrentMarkThread.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1840
diff changeset
27 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1840
diff changeset
28 #include "gc_implementation/g1/g1CollectorPolicy.hpp"
6007
5c86f8211d1e 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 5963
diff changeset
29 #include "gc_implementation/g1/g1Log.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1840
diff changeset
30 #include "gc_implementation/g1/g1MMUTracker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1840
diff changeset
31 #include "gc_implementation/g1/vm_operations_g1.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1840
diff changeset
32 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1840
diff changeset
33 #include "runtime/vmThread.hpp"
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
34
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
35 // ======= Concurrent Mark Thread ========
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
36
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
37 // The CM thread is created when the G1 garbage collector is used
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
38
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
39 SurrogateLockerThread*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
40 ConcurrentMarkThread::_slt = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
41
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
42 ConcurrentMarkThread::ConcurrentMarkThread(ConcurrentMark* cm) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
43 ConcurrentGCThread(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
44 _cm(cm),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
45 _started(false),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
46 _in_progress(false),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
47 _vtime_accum(0.0),
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4096
diff changeset
48 _vtime_mark_accum(0.0) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
49 create_and_start();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
50 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
51
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
52 class CMCheckpointRootsFinalClosure: public VoidClosure {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
53
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
54 ConcurrentMark* _cm;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
55 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
56
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
57 CMCheckpointRootsFinalClosure(ConcurrentMark* cm) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
58 _cm(cm) {}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
59
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
60 void do_void(){
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
61 _cm->checkpointRootsFinal(false); // !clear_all_soft_refs
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
62 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
63 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
64
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
65 class CMCleanUp: public VoidClosure {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
66 ConcurrentMark* _cm;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
67 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
68
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
69 CMCleanUp(ConcurrentMark* cm) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
70 _cm(cm) {}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
71
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
72 void do_void(){
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
73 _cm->cleanup();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
74 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
75 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
76
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
77
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
78
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
79 void ConcurrentMarkThread::run() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
80 initialize_in_thread();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
81 _vtime_start = os::elapsedVTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
82 wait_for_universe_init();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
83
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
84 G1CollectedHeap* g1h = G1CollectedHeap::heap();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
85 G1CollectorPolicy* g1_policy = g1h->g1_policy();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
86 G1MMUTracker *mmu_tracker = g1_policy->mmu_tracker();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
87 Thread *current_thread = Thread::current();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
88
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
89 while (!_should_terminate) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
90 // wait until started is set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
91 sleepBeforeNextCycle();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
92 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
93 ResourceMark rm;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
94 HandleMark hm;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
95 double cycle_start = os::elapsedVTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
96 char verbose_str[128];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
97
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
98 // We have to ensure that we finish scanning the root regions
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
99 // before the next GC takes place. To ensure this we have to
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
100 // make sure that we do not join the STS until the root regions
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
101 // have been scanned. If we did then it's possible that a
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
102 // subsequent GC could block us from joining the STS and proceed
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
103 // without the root regions have been scanned which would be a
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
104 // correctness issue.
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
105
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
106 double scan_start = os::elapsedTime();
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
107 if (!cm()->has_aborted()) {
6007
5c86f8211d1e 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 5963
diff changeset
108 if (G1Log::fine()) {
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
109 gclog_or_tty->date_stamp(PrintGCDateStamps);
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
110 gclog_or_tty->stamp(PrintGCTimeStamps);
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
111 gclog_or_tty->print_cr("[GC concurrent-root-region-scan-start]");
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
112 }
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
113
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
114 _cm->scanRootRegions();
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
115
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
116 double scan_end = os::elapsedTime();
6007
5c86f8211d1e 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 5963
diff changeset
117 if (G1Log::fine()) {
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
118 gclog_or_tty->date_stamp(PrintGCDateStamps);
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
119 gclog_or_tty->stamp(PrintGCTimeStamps);
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
120 gclog_or_tty->print_cr("[GC concurrent-root-region-scan-end, %1.7lf]",
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
121 scan_end - scan_start);
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
122 }
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
123 }
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
124
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
125 double mark_start_sec = os::elapsedTime();
6007
5c86f8211d1e 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 5963
diff changeset
126 if (G1Log::fine()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
127 gclog_or_tty->date_stamp(PrintGCDateStamps);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
128 gclog_or_tty->stamp(PrintGCTimeStamps);
619
7ea5ca260b28 6814467: G1: small fixes related to concurrent marking verboseness
tonyp
parents: 342
diff changeset
129 gclog_or_tty->print_cr("[GC concurrent-mark-start]");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
130 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
131
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
132 int iter = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
133 do {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
134 iter++;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
135 if (!cm()->has_aborted()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
136 _cm->markFromRoots();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
137 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
138
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
139 double mark_end_time = os::elapsedVTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
140 double mark_end_sec = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
141 _vtime_mark_accum += (mark_end_time - cycle_start);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
142 if (!cm()->has_aborted()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
143 if (g1_policy->adaptive_young_list_length()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
144 double now = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
145 double remark_prediction_ms = g1_policy->predict_remark_time_ms();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
146 jlong sleep_time_ms = mmu_tracker->when_ms(now, remark_prediction_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
147 os::sleep(current_thread, sleep_time_ms, false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
148 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
149
6007
5c86f8211d1e 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 5963
diff changeset
150 if (G1Log::fine()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
151 gclog_or_tty->date_stamp(PrintGCDateStamps);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
152 gclog_or_tty->stamp(PrintGCTimeStamps);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
153 gclog_or_tty->print_cr("[GC concurrent-mark-end, %1.7lf sec]",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
154 mark_end_sec - mark_start_sec);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
155 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
156
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
157 CMCheckpointRootsFinalClosure final_cl(_cm);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
158 sprintf(verbose_str, "GC remark");
5963
64bf7c8270cb 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 4837
diff changeset
159 VM_CGC_Operation op(&final_cl, verbose_str, true /* needs_pll */);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
160 VMThread::execute(&op);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
161 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
162 if (cm()->restart_for_overflow() &&
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
163 G1TraceMarkStackOverflow) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
164 gclog_or_tty->print_cr("Restarting conc marking because of MS overflow "
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
165 "in remark (restart #%d).", iter);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
166 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
167
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
168 if (cm()->restart_for_overflow()) {
6007
5c86f8211d1e 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 5963
diff changeset
169 if (G1Log::fine()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
170 gclog_or_tty->date_stamp(PrintGCDateStamps);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
171 gclog_or_tty->stamp(PrintGCTimeStamps);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
172 gclog_or_tty->print_cr("[GC concurrent-mark-restart-for-overflow]");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
173 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
174 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
175 } while (cm()->restart_for_overflow());
4022
db89aa49298f 7099824: G1: we should take the pending list lock before doing the remark pause
johnc
parents: 4012
diff changeset
176
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
177 double end_time = os::elapsedVTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
178 // Update the total virtual time before doing this, since it will try
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
179 // to measure it to get the vtime for this marking. We purposely
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
180 // neglect the presumably-short "completeCleanup" phase here.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
181 _vtime_accum = (end_time - _vtime_start);
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4096
diff changeset
182
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
183 if (!cm()->has_aborted()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
184 if (g1_policy->adaptive_young_list_length()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
185 double now = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
186 double cleanup_prediction_ms = g1_policy->predict_cleanup_time_ms();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
187 jlong sleep_time_ms = mmu_tracker->when_ms(now, cleanup_prediction_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
188 os::sleep(current_thread, sleep_time_ms, false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
189 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
190
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
191 CMCleanUp cl_cl(_cm);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
192 sprintf(verbose_str, "GC cleanup");
5963
64bf7c8270cb 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 4837
diff changeset
193 VM_CGC_Operation op(&cl_cl, verbose_str, false /* needs_pll */);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
194 VMThread::execute(&op);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
195 } else {
4096
00dd86e542eb 7114303: G1: assert(_g1->mark_in_progress()) failed: shouldn't be here otherwise
johnc
parents: 4022
diff changeset
196 // We don't want to update the marking status if a GC pause
00dd86e542eb 7114303: G1: assert(_g1->mark_in_progress()) failed: shouldn't be here otherwise
johnc
parents: 4022
diff changeset
197 // is already underway.
00dd86e542eb 7114303: G1: assert(_g1->mark_in_progress()) failed: shouldn't be here otherwise
johnc
parents: 4022
diff changeset
198 _sts.join();
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
199 g1h->set_marking_complete();
4096
00dd86e542eb 7114303: G1: assert(_g1->mark_in_progress()) failed: shouldn't be here otherwise
johnc
parents: 4022
diff changeset
200 _sts.leave();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
201 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
202
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
203 // Check if cleanup set the free_regions_coming flag. If it
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
204 // hasn't, we can just skip the next step.
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
205 if (g1h->free_regions_coming()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
206 // The following will finish freeing up any regions that we
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
207 // found to be empty during cleanup. We'll do this part
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
208 // without joining the suspendible set. If an evacuation pause
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2185
diff changeset
209 // takes place, then we would carry on freeing regions in
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
210 // case they are needed by the pause. If a Full GC takes
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2185
diff changeset
211 // place, it would wait for us to process the regions
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
212 // reclaimed by cleanup.
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
213
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
214 double cleanup_start_sec = os::elapsedTime();
6007
5c86f8211d1e 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 5963
diff changeset
215 if (G1Log::fine()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
216 gclog_or_tty->date_stamp(PrintGCDateStamps);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
217 gclog_or_tty->stamp(PrintGCTimeStamps);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
218 gclog_or_tty->print_cr("[GC concurrent-cleanup-start]");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
219 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
220
4012
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
221 // Now do the concurrent cleanup operation.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
222 _cm->completeCleanup();
4012
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
223
2185
b7a938236e43 7014679: G1: deadlock during concurrent cleanup
tonyp
parents: 2172
diff changeset
224 // Notify anyone who's waiting that there are no more free
4012
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
225 // regions coming. We have to do this before we join the STS
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
226 // (in fact, we should not attempt to join the STS in the
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
227 // interval between finishing the cleanup pause and clearing
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
228 // the free_regions_coming flag) otherwise we might deadlock:
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
229 // a GC worker could be blocked waiting for the notification
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
230 // whereas this thread will be blocked for the pause to finish
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
231 // while it's trying to join the STS, which is conditional on
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
232 // the GC workers finishing.
2185
b7a938236e43 7014679: G1: deadlock during concurrent cleanup
tonyp
parents: 2172
diff changeset
233 g1h->reset_free_regions_coming();
b7a938236e43 7014679: G1: deadlock during concurrent cleanup
tonyp
parents: 2172
diff changeset
234
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
235 double cleanup_end_sec = os::elapsedTime();
6007
5c86f8211d1e 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 5963
diff changeset
236 if (G1Log::fine()) {
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
237 gclog_or_tty->date_stamp(PrintGCDateStamps);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
238 gclog_or_tty->stamp(PrintGCTimeStamps);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
239 gclog_or_tty->print_cr("[GC concurrent-cleanup-end, %1.7lf]",
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
240 cleanup_end_sec - cleanup_start_sec);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
241 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
242 }
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
243 guarantee(cm()->cleanup_list_is_empty(),
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
244 "at this point there should be no regions on the cleanup list");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
245
4012
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
246 // There is a tricky race before recording that the concurrent
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
247 // cleanup has completed and a potential Full GC starting around
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
248 // the same time. We want to make sure that the Full GC calls
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
249 // abort() on concurrent mark after
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
250 // record_concurrent_mark_cleanup_completed(), since abort() is
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
251 // the method that will reset the concurrent mark state. If we
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
252 // end up calling record_concurrent_mark_cleanup_completed()
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
253 // after abort() then we might incorrectly undo some of the work
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
254 // abort() did. Checking the has_aborted() flag after joining
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
255 // the STS allows the correct ordering of the two methods. There
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
256 // are two scenarios:
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
257 //
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
258 // a) If we reach here before the Full GC, the fact that we have
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
259 // joined the STS means that the Full GC cannot start until we
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
260 // leave the STS, so record_concurrent_mark_cleanup_completed()
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
261 // will complete before abort() is called.
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
262 //
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
263 // b) If we reach here during the Full GC, we'll be held up from
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
264 // joining the STS until the Full GC is done, which means that
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
265 // abort() will have completed and has_aborted() will return
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
266 // true to prevent us from calling
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
267 // record_concurrent_mark_cleanup_completed() (and, in fact, it's
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
268 // not needed any more as the concurrent mark state has been
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
269 // already reset).
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
270 _sts.join();
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
271 if (!cm()->has_aborted()) {
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
272 g1_policy->record_concurrent_mark_cleanup_completed();
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
273 }
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
274 _sts.leave();
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
275
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
276 if (cm()->has_aborted()) {
6007
5c86f8211d1e 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 5963
diff changeset
277 if (G1Log::fine()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
278 gclog_or_tty->date_stamp(PrintGCDateStamps);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
279 gclog_or_tty->stamp(PrintGCTimeStamps);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
280 gclog_or_tty->print_cr("[GC concurrent-mark-abort]");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
281 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
282 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
283
4012
ec4b032a4977 7098085: G1: partially-young GCs not initiated under certain circumstances
tonyp
parents: 3867
diff changeset
284 // We now want to allow clearing of the marking bitmap to be
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
285 // suspended by a collection pause.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
286 _sts.join();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
287 _cm->clearNextBitmap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
288 _sts.leave();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
289 }
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1552
diff changeset
290
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1552
diff changeset
291 // Update the number of full collections that have been
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1552
diff changeset
292 // completed. This will also notify the FullGCCount_lock in case a
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1552
diff changeset
293 // Java thread is waiting for a full GC to happen (e.g., it
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1552
diff changeset
294 // called System.gc() with +ExplicitGCInvokesConcurrent).
2030
fb712ff22571 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 1972
diff changeset
295 _sts.join();
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2030
diff changeset
296 g1h->increment_full_collections_completed(true /* concurrent */);
2030
fb712ff22571 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 1972
diff changeset
297 _sts.leave();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
298 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
299 assert(_should_terminate, "just checking");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
300
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
301 terminate();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
302 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
303
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
304
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
305 void ConcurrentMarkThread::yield() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
306 _sts.yield("Concurrent Mark");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
307 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
308
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
309 void ConcurrentMarkThread::stop() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
310 // it is ok to take late safepoints here, if needed
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
311 MutexLockerEx mu(Terminator_lock);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
312 _should_terminate = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
313 while (!_has_terminated) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
314 Terminator_lock->wait();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
315 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
316 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
317
1019
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
318 void ConcurrentMarkThread::print() const {
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
319 print_on(tty);
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
320 }
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
321
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
322 void ConcurrentMarkThread::print_on(outputStream* st) const {
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
323 st->print("\"G1 Main Concurrent Mark GC Thread\" ");
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
324 Thread::print_on(st);
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
325 st->cr();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
326 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
327
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
328 void ConcurrentMarkThread::sleepBeforeNextCycle() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
329 // We join here because we don't want to do the "shouldConcurrentMark()"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
330 // below while the world is otherwise stopped.
1840
4e0094bc41fa 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 1656
diff changeset
331 assert(!in_progress(), "should have been cleared");
4e0094bc41fa 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 1656
diff changeset
332
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
333 MutexLockerEx x(CGC_lock, Mutex::_no_safepoint_check_flag);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
334 while (!started()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
335 CGC_lock->wait(Mutex::_no_safepoint_check_flag);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
336 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
337 set_in_progress();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
338 clear_started();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
339 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
340
4022
db89aa49298f 7099824: G1: we should take the pending list lock before doing the remark pause
johnc
parents: 4012
diff changeset
341 // Note: As is the case with CMS - this method, although exported
db89aa49298f 7099824: G1: we should take the pending list lock before doing the remark pause
johnc
parents: 4012
diff changeset
342 // by the ConcurrentMarkThread, which is a non-JavaThread, can only
db89aa49298f 7099824: G1: we should take the pending list lock before doing the remark pause
johnc
parents: 4012
diff changeset
343 // be called by a JavaThread. Currently this is done at vm creation
db89aa49298f 7099824: G1: we should take the pending list lock before doing the remark pause
johnc
parents: 4012
diff changeset
344 // time (post-vm-init) by the main/Primordial (Java)Thread.
db89aa49298f 7099824: G1: we should take the pending list lock before doing the remark pause
johnc
parents: 4012
diff changeset
345 // XXX Consider changing this in the future to allow the CM thread
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
346 // itself to create this thread?
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
347 void ConcurrentMarkThread::makeSurrogateLockerThread(TRAPS) {
4022
db89aa49298f 7099824: G1: we should take the pending list lock before doing the remark pause
johnc
parents: 4012
diff changeset
348 assert(UseG1GC, "SLT thread needed only for concurrent GC");
db89aa49298f 7099824: G1: we should take the pending list lock before doing the remark pause
johnc
parents: 4012
diff changeset
349 assert(THREAD->is_Java_thread(), "must be a Java thread");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
350 assert(_slt == NULL, "SLT already created");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
351 _slt = SurrogateLockerThread::make(THREAD);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
352 }