15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "gc/g1/g1CollectedHeap.inline.hpp"
27 #include "gc/g1/g1CollectorPolicy.hpp"
28 #include "gc/g1/g1CollectionSet.hpp"
29 #include "gc/g1/g1YoungRemSetSamplingThread.hpp"
30 #include "gc/g1/heapRegion.inline.hpp"
31 #include "gc/g1/heapRegionRemSet.hpp"
32 #include "gc/g1/suspendibleThreadSet.hpp"
33 #include "runtime/mutexLocker.hpp"
34
35 void G1YoungRemSetSamplingThread::run() {
36 initialize_in_thread();
37 wait_for_universe_init();
38
39 run_service();
40
41 terminate();
42 }
43
44 void G1YoungRemSetSamplingThread::stop() {
45 // it is ok to take late safepoints here, if needed
46 {
47 MutexLockerEx mu(Terminator_lock);
48 _should_terminate = true;
49 }
50
51 stop_service();
52
53 {
54 MutexLockerEx mu(Terminator_lock);
55 while (!_has_terminated) {
56 Terminator_lock->wait();
57 }
58 }
59 }
60
61 G1YoungRemSetSamplingThread::G1YoungRemSetSamplingThread() :
62 ConcurrentGCThread(),
63 _monitor(Mutex::nonleaf,
64 "G1YoungRemSetSamplingThread monitor",
65 true,
66 Monitor::_safepoint_check_never) {
67 set_name("G1 Young RemSet Sampling");
68 create_and_start();
69 }
70
71 void G1YoungRemSetSamplingThread::sleep_before_next_cycle() {
72 MutexLockerEx x(&_monitor, Mutex::_no_safepoint_check_flag);
73 if (!_should_terminate) {
74 uintx waitms = G1ConcRefinementServiceIntervalMillis; // 300, really should be?
75 _monitor.wait(Mutex::_no_safepoint_check_flag, waitms);
76 }
77 }
78
79 void G1YoungRemSetSamplingThread::run_service() {
80 double vtime_start = os::elapsedVTime();
81
82 while (!_should_terminate) {
83 sample_young_list_rs_lengths();
84
85 if (os::supports_vtime()) {
86 _vtime_accum = (os::elapsedVTime() - vtime_start);
87 } else {
88 _vtime_accum = 0.0;
89 }
90
91 sleep_before_next_cycle();
92 }
93 }
94
95 void G1YoungRemSetSamplingThread::stop_service() {
96 MutexLockerEx x(&_monitor, Mutex::_no_safepoint_check_flag);
97 _monitor.notify();
98 }
99
100 void G1YoungRemSetSamplingThread::sample_young_list_rs_lengths() {
101 SuspendibleThreadSetJoiner sts;
102 G1CollectedHeap* g1h = G1CollectedHeap::heap();
|
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "gc/g1/g1CollectedHeap.inline.hpp"
27 #include "gc/g1/g1CollectorPolicy.hpp"
28 #include "gc/g1/g1CollectionSet.hpp"
29 #include "gc/g1/g1YoungRemSetSamplingThread.hpp"
30 #include "gc/g1/heapRegion.inline.hpp"
31 #include "gc/g1/heapRegionRemSet.hpp"
32 #include "gc/g1/suspendibleThreadSet.hpp"
33 #include "runtime/mutexLocker.hpp"
34
35 G1YoungRemSetSamplingThread::G1YoungRemSetSamplingThread() :
36 ConcurrentGCThread(),
37 _monitor(Mutex::nonleaf,
38 "G1YoungRemSetSamplingThread monitor",
39 true,
40 Monitor::_safepoint_check_never) {
41 set_name("G1 Young RemSet Sampling");
42 create_and_start();
43 }
44
45 void G1YoungRemSetSamplingThread::sleep_before_next_cycle() {
46 MutexLockerEx x(&_monitor, Mutex::_no_safepoint_check_flag);
47 if (!should_terminate()) {
48 uintx waitms = G1ConcRefinementServiceIntervalMillis; // 300, really should be?
49 _monitor.wait(Mutex::_no_safepoint_check_flag, waitms);
50 }
51 }
52
53 void G1YoungRemSetSamplingThread::run_service() {
54 double vtime_start = os::elapsedVTime();
55
56 while (!should_terminate()) {
57 sample_young_list_rs_lengths();
58
59 if (os::supports_vtime()) {
60 _vtime_accum = (os::elapsedVTime() - vtime_start);
61 } else {
62 _vtime_accum = 0.0;
63 }
64
65 sleep_before_next_cycle();
66 }
67 }
68
69 void G1YoungRemSetSamplingThread::stop_service() {
70 MutexLockerEx x(&_monitor, Mutex::_no_safepoint_check_flag);
71 _monitor.notify();
72 }
73
74 void G1YoungRemSetSamplingThread::sample_young_list_rs_lengths() {
75 SuspendibleThreadSetJoiner sts;
76 G1CollectedHeap* g1h = G1CollectedHeap::heap();
|