1 /*
2 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
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 *
88 // increase the array size (:-)
89 // remove the oldest entry (this might allow more GC time for
90 // the time slice than what's allowed) - this is what we
91 // currently do
92 // consolidate the two entries with the minimum gap between them
93 // (this might allow less GC time than what's allowed)
94
95 // In the case where ScavengeALot is true, such overflow is not
96 // uncommon; in such cases, we can, without much loss of precision
97 // or performance (we are GC'ing most of the time anyway!),
98 // simply overwrite the oldest entry in the tracker.
99
100 _head_index = trim_index(_head_index + 1);
101 assert(_head_index == _tail_index, "Because we have a full circular buffer");
102 _tail_index = trim_index(_tail_index + 1);
103 } else {
104 _head_index = trim_index(_head_index + 1);
105 ++_no_entries;
106 }
107 _array[_head_index] = G1MMUTrackerQueueElem(start, end);
108 }
109
110 // basically the _internal call does not remove expired entries
111 // this is for trying things out in the future and a couple
112 // of other places (debugging)
113
114 double G1MMUTrackerQueue::longest_pause(double current_time) {
115 if (_DISABLE_MMU)
116 return _max_gc_time;
117
118 MutexLockerEx x(MMUTracker_lock, Mutex::_no_safepoint_check_flag);
119 remove_expired_entries(current_time);
120
121 return longest_pause_internal(current_time);
122 }
123
124 double G1MMUTrackerQueue::longest_pause_internal(double current_time) {
125 double target_time = _max_gc_time;
126
127 while( 1 ) {
|
1 /*
2 * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
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 *
88 // increase the array size (:-)
89 // remove the oldest entry (this might allow more GC time for
90 // the time slice than what's allowed) - this is what we
91 // currently do
92 // consolidate the two entries with the minimum gap between them
93 // (this might allow less GC time than what's allowed)
94
95 // In the case where ScavengeALot is true, such overflow is not
96 // uncommon; in such cases, we can, without much loss of precision
97 // or performance (we are GC'ing most of the time anyway!),
98 // simply overwrite the oldest entry in the tracker.
99
100 _head_index = trim_index(_head_index + 1);
101 assert(_head_index == _tail_index, "Because we have a full circular buffer");
102 _tail_index = trim_index(_tail_index + 1);
103 } else {
104 _head_index = trim_index(_head_index + 1);
105 ++_no_entries;
106 }
107 _array[_head_index] = G1MMUTrackerQueueElem(start, end);
108
109 if (EnableJFR) {
110 double slice_time = calculate_gc_time(end);
111 G1MMUTracer::report_mmu(_time_slice, slice_time, _max_gc_time, gc_thread);
112 }
113 }
114
115 // basically the _internal call does not remove expired entries
116 // this is for trying things out in the future and a couple
117 // of other places (debugging)
118
119 double G1MMUTrackerQueue::longest_pause(double current_time) {
120 if (_DISABLE_MMU)
121 return _max_gc_time;
122
123 MutexLockerEx x(MMUTracker_lock, Mutex::_no_safepoint_check_flag);
124 remove_expired_entries(current_time);
125
126 return longest_pause_internal(current_time);
127 }
128
129 double G1MMUTrackerQueue::longest_pause_internal(double current_time) {
130 double target_time = _max_gc_time;
131
132 while( 1 ) {
|