annotate src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp @ 1886:72a161e62cc4

6991377: G1: race between concurrent refinement and humongous object allocation Summary: There is a race between the concurrent refinement threads and the humongous object allocation that can cause the concurrent refinement threads to corrupt the part of the BOT that it is being initialized by the humongous object allocation operation. The solution is to do the humongous object allocation in careful steps to ensure that the concurrent refinement threads always have a consistent view over the BOT, region contents, and top. The fix includes some very minor tidying up in sparsePRT. Reviewed-by: jcoomes, johnc, ysr
author tonyp
date Sat, 16 Oct 2010 17:12:19 -0400
parents c18cbe5936b8
children f95d63e2154a
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 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1394
diff changeset
2 * Copyright (c) 2001, 2010, 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: 1394
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1394
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: 1394
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
25 #include "incls/_precompiled.incl"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
26 #include "incls/_concurrentG1RefineThread.cpp.incl"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
27
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
28 ConcurrentG1RefineThread::
795
215f81b4d9b3 6841831: G1: assert(contains_reference(from),"We just added it!") fires
iveresov
parents: 794
diff changeset
29 ConcurrentG1RefineThread(ConcurrentG1Refine* cg1r, ConcurrentG1RefineThread *next,
215f81b4d9b3 6841831: G1: assert(contains_reference(from),"We just added it!") fires
iveresov
parents: 794
diff changeset
30 int worker_id_offset, int worker_id) :
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
31 ConcurrentGCThread(),
795
215f81b4d9b3 6841831: G1: assert(contains_reference(from),"We just added it!") fires
iveresov
parents: 794
diff changeset
32 _worker_id_offset(worker_id_offset),
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
33 _worker_id(worker_id),
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
34 _active(false),
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
35 _next(next),
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
36 _monitor(NULL),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
37 _cg1r(cg1r),
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
38 _vtime_accum(0.0)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
39 {
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
40
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
41 // Each thread has its own monitor. The i-th thread is responsible for signalling
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
42 // to thread i+1 if the number of buffers in the queue exceeds a threashold for this
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
43 // thread. Monitors are also used to wake up the threads during termination.
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
44 // The 0th worker in notified by mutator threads and has a special monitor.
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
45 // The last worker is used for young gen rset size sampling.
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
46 if (worker_id > 0) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
47 _monitor = new Monitor(Mutex::nonleaf, "Refinement monitor", true);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
48 } else {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
49 _monitor = DirtyCardQ_CBL_mon;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
50 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
51 initialize();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
52 create_and_start();
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
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
55 void ConcurrentG1RefineThread::initialize() {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
56 if (_worker_id < cg1r()->worker_thread_num()) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
57 // Current thread activation threshold
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
58 _threshold = MIN2<int>(cg1r()->thread_threshold_step() * (_worker_id + 1) + cg1r()->green_zone(),
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
59 cg1r()->yellow_zone());
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
60 // A thread deactivates once the number of buffer reached a deactivation threshold
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
61 _deactivation_threshold = MAX2<int>(_threshold - cg1r()->thread_threshold_step(), cg1r()->green_zone());
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
62 } else {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
63 set_active(true);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
64 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
65 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
66
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
67 void ConcurrentG1RefineThread::sample_young_list_rs_lengths() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
68 G1CollectedHeap* g1h = G1CollectedHeap::heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
69 G1CollectorPolicy* g1p = g1h->g1_policy();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
70 if (g1p->adaptive_young_list_length()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
71 int regions_visited = 0;
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1282
diff changeset
72 g1h->young_list()->rs_length_sampling_init();
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1282
diff changeset
73 while (g1h->young_list()->rs_length_sampling_more()) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1282
diff changeset
74 g1h->young_list()->rs_length_sampling_next();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
75 ++regions_visited;
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 // we try to yield every time we visit 10 regions
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
78 if (regions_visited == 10) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
79 if (_sts.should_yield()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
80 _sts.yield("G1 refine");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
81 // we just abandon the iteration
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
82 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
83 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
84 regions_visited = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
85 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
86 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
87
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
88 g1p->check_prediction_validity();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
89 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
90 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
91
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
92 void ConcurrentG1RefineThread::run_young_rs_sampling() {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
93 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
94 _vtime_start = os::elapsedVTime();
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
95 while(!_should_terminate) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
96 _sts.join();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
97 sample_young_list_rs_lengths();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
98 _sts.leave();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
99
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
100 if (os::supports_vtime()) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
101 _vtime_accum = (os::elapsedVTime() - _vtime_start);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
102 } else {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
103 _vtime_accum = 0.0;
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
104 }
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
105
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
106 MutexLockerEx x(_monitor, Mutex::_no_safepoint_check_flag);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
107 if (_should_terminate) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
108 break;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
109 }
1282
b81f3572f355 6928059: G1: command line parameter renaming
tonyp
parents: 1111
diff changeset
110 _monitor->wait(Mutex::_no_safepoint_check_flag, G1ConcRefinementServiceIntervalMillis);
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
111 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
112 }
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
113
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
114 void ConcurrentG1RefineThread::wait_for_completed_buffers() {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
115 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
116 MutexLockerEx x(_monitor, Mutex::_no_safepoint_check_flag);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
117 while (!_should_terminate && !is_active()) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
118 _monitor->wait(Mutex::_no_safepoint_check_flag);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
119 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
120 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
121
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
122 bool ConcurrentG1RefineThread::is_active() {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
123 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
124 return _worker_id > 0 ? _active : dcqs.process_completed_buffers();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
125 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
126
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
127 void ConcurrentG1RefineThread::activate() {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
128 MutexLockerEx x(_monitor, Mutex::_no_safepoint_check_flag);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
129 if (_worker_id > 0) {
1282
b81f3572f355 6928059: G1: command line parameter renaming
tonyp
parents: 1111
diff changeset
130 if (G1TraceConcRefinement) {
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
131 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
132 gclog_or_tty->print_cr("G1-Refine-activated worker %d, on threshold %d, current %d",
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
133 _worker_id, _threshold, (int)dcqs.completed_buffers_num());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
134 }
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
135 set_active(true);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
136 } else {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
137 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
138 dcqs.set_process_completed(true);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
139 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
140 _monitor->notify();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
141 }
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
142
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
143 void ConcurrentG1RefineThread::deactivate() {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
144 MutexLockerEx x(_monitor, Mutex::_no_safepoint_check_flag);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
145 if (_worker_id > 0) {
1282
b81f3572f355 6928059: G1: command line parameter renaming
tonyp
parents: 1111
diff changeset
146 if (G1TraceConcRefinement) {
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
147 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
148 gclog_or_tty->print_cr("G1-Refine-deactivated worker %d, off threshold %d, current %d",
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
149 _worker_id, _deactivation_threshold, (int)dcqs.completed_buffers_num());
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
150 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
151 set_active(false);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
152 } else {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
153 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
154 dcqs.set_process_completed(false);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
155 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
156 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
157
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
158 void ConcurrentG1RefineThread::run() {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
159 initialize_in_thread();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
160 wait_for_universe_init();
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
161
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
162 if (_worker_id >= cg1r()->worker_thread_num()) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
163 run_young_rs_sampling();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
164 terminate();
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1282
diff changeset
165 return;
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
166 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
167
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
168 _vtime_start = os::elapsedVTime();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
169 while (!_should_terminate) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
170 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
171
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
172 // Wait for work
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
173 wait_for_completed_buffers();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
174
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
175 if (_should_terminate) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
176 break;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
177 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
178
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
179 _sts.join();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
180
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
181 do {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
182 int curr_buffer_num = (int)dcqs.completed_buffers_num();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
183 // If the number of the buffers falls down into the yellow zone,
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
184 // that means that the transition period after the evacuation pause has ended.
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
185 if (dcqs.completed_queue_padding() > 0 && curr_buffer_num <= cg1r()->yellow_zone()) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
186 dcqs.set_completed_queue_padding(0);
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
187 }
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
188
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
189 if (_worker_id > 0 && curr_buffer_num <= _deactivation_threshold) {
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
190 // If the number of the buffer has fallen below our threshold
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
191 // we should deactivate. The predecessor will reactivate this
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
192 // thread should the number of the buffers cross the threshold again.
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
193 deactivate();
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
194 break;
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
195 }
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
196
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
197 // Check if we need to activate the next thread.
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
198 if (_next != NULL && !_next->is_active() && curr_buffer_num > _next->_threshold) {
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
199 _next->activate();
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
200 }
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
201 } while (dcqs.apply_closure_to_completed_buffer(_worker_id + _worker_id_offset, cg1r()->green_zone()));
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
202
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
203 // We can exit the loop above while being active if there was a yield request.
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
204 if (is_active()) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
205 deactivate();
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
206 }
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
207
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
208 _sts.leave();
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
209
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
210 if (os::supports_vtime()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
211 _vtime_accum = (os::elapsedVTime() - _vtime_start);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
212 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
213 _vtime_accum = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
214 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
215 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
216 assert(_should_terminate, "just checking");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
217 terminate();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
218 }
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
221 void ConcurrentG1RefineThread::yield() {
1282
b81f3572f355 6928059: G1: command line parameter renaming
tonyp
parents: 1111
diff changeset
222 if (G1TraceConcRefinement) {
b81f3572f355 6928059: G1: command line parameter renaming
tonyp
parents: 1111
diff changeset
223 gclog_or_tty->print_cr("G1-Refine-yield");
b81f3572f355 6928059: G1: command line parameter renaming
tonyp
parents: 1111
diff changeset
224 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
225 _sts.yield("G1 refine");
1282
b81f3572f355 6928059: G1: command line parameter renaming
tonyp
parents: 1111
diff changeset
226 if (G1TraceConcRefinement) {
b81f3572f355 6928059: G1: command line parameter renaming
tonyp
parents: 1111
diff changeset
227 gclog_or_tty->print_cr("G1-Refine-yield-end");
b81f3572f355 6928059: G1: command line parameter renaming
tonyp
parents: 1111
diff changeset
228 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
229 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
230
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
231 void ConcurrentG1RefineThread::stop() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
232 // it is ok to take late safepoints here, if needed
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
233 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
234 MutexLockerEx mu(Terminator_lock);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
235 _should_terminate = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
236 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
237
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
238 {
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
239 MutexLockerEx x(_monitor, Mutex::_no_safepoint_check_flag);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1019
diff changeset
240 _monitor->notify();
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
243 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
244 MutexLockerEx mu(Terminator_lock);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
245 while (!_has_terminated) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
246 Terminator_lock->wait();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
247 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
248 }
1282
b81f3572f355 6928059: G1: command line parameter renaming
tonyp
parents: 1111
diff changeset
249 if (G1TraceConcRefinement) {
b81f3572f355 6928059: G1: command line parameter renaming
tonyp
parents: 1111
diff changeset
250 gclog_or_tty->print_cr("G1-Refine-stop");
b81f3572f355 6928059: G1: command line parameter renaming
tonyp
parents: 1111
diff changeset
251 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
252 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
253
1019
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
254 void ConcurrentG1RefineThread::print() const {
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
255 print_on(tty);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
256 }
1019
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
257
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
258 void ConcurrentG1RefineThread::print_on(outputStream* st) const {
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
259 st->print("\"G1 Concurrent Refinement Thread#%d\" ", _worker_id);
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
260 Thread::print_on(st);
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
261 st->cr();
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 936
diff changeset
262 }