Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/share/gc/g1/g1CollectorState.hpp
40961 views
1
/*
2
* Copyright (c) 2015, 2021, 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
*
23
*/
24
25
#ifndef SHARE_GC_G1_G1COLLECTORSTATE_HPP
26
#define SHARE_GC_G1_G1COLLECTORSTATE_HPP
27
28
#include "gc/g1/g1GCPauseType.hpp"
29
#include "utilities/globalDefinitions.hpp"
30
31
// State of the G1 collection.
32
class G1CollectorState {
33
// Indicates whether we are in the phase where we do partial gcs that only contain
34
// the young generation. Not set while _in_full_gc is set.
35
bool _in_young_only_phase;
36
37
// Indicates whether we are in the last young gc before the mixed gc phase. This GC
38
// is required to keep pause time requirements.
39
bool _in_young_gc_before_mixed;
40
41
// If _initiate_conc_mark_if_possible is set at the beginning of a
42
// pause, it is a suggestion that the pause should start a marking
43
// cycle by doing the concurrent start work. However, it is possible
44
// that the concurrent marking thread is still finishing up the
45
// previous marking cycle (e.g., clearing the next marking
46
// bitmap). If that is the case we cannot start a new cycle and
47
// we'll have to wait for the concurrent marking thread to finish
48
// what it is doing. In this case we will postpone the marking cycle
49
// initiation decision for the next pause. When we eventually decide
50
// to start a cycle, we will set _in_concurrent_start_gc which
51
// will stay true until the end of the concurrent start pause doing the
52
// concurrent start work.
53
volatile bool _in_concurrent_start_gc;
54
55
// At the end of a pause we check the heap occupancy and we decide
56
// whether we will start a marking cycle during the next pause. If
57
// we decide that we want to do that, set this parameter. This parameter will
58
// stay set until the beginning of a subsequent pause (not necessarily
59
// the next one) when we decide that we will indeed start a marking cycle and
60
// do the concurrent start phase work.
61
volatile bool _initiate_conc_mark_if_possible;
62
63
// Marking or rebuilding remembered set work is in progress. Set from the end
64
// of the concurrent start pause to the end of the Cleanup pause.
65
bool _mark_or_rebuild_in_progress;
66
67
// The next bitmap is currently being cleared or about to be cleared. TAMS and bitmap
68
// may be out of sync.
69
bool _clearing_next_bitmap;
70
71
// Set during a full gc pause.
72
bool _in_full_gc;
73
74
public:
75
G1CollectorState() :
76
_in_young_only_phase(true),
77
_in_young_gc_before_mixed(false),
78
79
_in_concurrent_start_gc(false),
80
_initiate_conc_mark_if_possible(false),
81
82
_mark_or_rebuild_in_progress(false),
83
_clearing_next_bitmap(false),
84
_in_full_gc(false) { }
85
86
// Phase setters
87
void set_in_young_only_phase(bool v) { _in_young_only_phase = v; }
88
89
// Pause setters
90
void set_in_young_gc_before_mixed(bool v) { _in_young_gc_before_mixed = v; }
91
void set_in_concurrent_start_gc(bool v) { _in_concurrent_start_gc = v; }
92
void set_in_full_gc(bool v) { _in_full_gc = v; }
93
94
void set_initiate_conc_mark_if_possible(bool v) { _initiate_conc_mark_if_possible = v; }
95
96
void set_mark_or_rebuild_in_progress(bool v) { _mark_or_rebuild_in_progress = v; }
97
void set_clearing_next_bitmap(bool v) { _clearing_next_bitmap = v; }
98
99
// Phase getters
100
bool in_young_only_phase() const { return _in_young_only_phase && !_in_full_gc; }
101
bool in_mixed_phase() const { return !in_young_only_phase() && !_in_full_gc; }
102
103
// Specific pauses
104
bool in_young_gc_before_mixed() const { return _in_young_gc_before_mixed; }
105
bool in_full_gc() const { return _in_full_gc; }
106
bool in_concurrent_start_gc() const { return _in_concurrent_start_gc; }
107
108
bool initiate_conc_mark_if_possible() const { return _initiate_conc_mark_if_possible; }
109
110
bool mark_or_rebuild_in_progress() const { return _mark_or_rebuild_in_progress; }
111
bool clearing_next_bitmap() const { return _clearing_next_bitmap; }
112
113
// Calculate GC Pause Type from internal state.
114
G1GCPauseType young_gc_pause_type(bool concurrent_operation_is_full_mark) const;
115
};
116
117
#endif // SHARE_GC_G1_G1COLLECTORSTATE_HPP
118
119