1 /*
2  * Copyright (c) 2002, 2020, 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_SHARED_GCCAUSE_HPP
26 #define SHARE_GC_SHARED_GCCAUSE_HPP
27 
28 #include "memory/allocation.hpp"
29 
30 //
31 // This class exposes implementation details of the various
32 // collector(s), and we need to be very careful with it. If
33 // use of this class grows, we should split it into public
34 // and implementation-private "causes".
35 //
36 // The definitions in the SA code should be kept in sync
37 // with the definitions here.
38 //
39 
40 class GCCause : public AllStatic {
41  public:
42   enum Cause {
43     /* public */
44     _java_lang_system_gc,
45     _full_gc_alot,
46     _scavenge_alot,
47     _allocation_profiler,
48     _jvmti_force_gc,
49     _gc_locker,
50     _heap_inspection,
51     _heap_dump,
52     _wb_young_gc,
53     _wb_conc_mark,
54     _wb_full_gc,
55     _wb_breakpoint,
56     _archive_time_gc,
57 
58     /* implementation independent, but reserved for GC use */
59     _no_gc,
60     _no_cause_specified,
61     _allocation_failure,
62 
63     /* implementation specific */
64 
65     _tenured_generation_full,
66     _metadata_GC_threshold,
67     _metadata_GC_clear_soft_refs,
68 
69     _old_generation_expanded_on_last_scavenge,
70     _old_generation_too_full_to_scavenge,
71     _adaptive_size_policy,
72 
73     _g1_inc_collection_pause,
74     _g1_compaction_pause,
75     _g1_humongous_allocation,
76     _g1_periodic_collection,
77     _g1_preventive_collection,
78 
79     _dcmd_gc_run,
80 
81     _shenandoah_stop_vm,
82     _shenandoah_allocation_failure_evac,
83     _shenandoah_concurrent_gc,
84     _shenandoah_upgrade_to_full_gc,
85 
86     _z_timer,
87     _z_warmup,
88     _z_allocation_rate,
89     _z_allocation_stall,
90     _z_proactive,
91     _z_high_usage,
92 
93     _last_gc_cause
94   };
95 
is_user_requested_gc(GCCause::Cause cause)96   inline static bool is_user_requested_gc(GCCause::Cause cause) {
97     return (cause == GCCause::_java_lang_system_gc ||
98             cause == GCCause::_dcmd_gc_run);
99   }
100 
is_serviceability_requested_gc(GCCause::Cause cause)101   inline static bool is_serviceability_requested_gc(GCCause::Cause
102                                                              cause) {
103     return (cause == GCCause::_jvmti_force_gc ||
104             cause == GCCause::_heap_inspection ||
105             cause == GCCause::_heap_dump);
106   }
107 
108   // Causes for collection of the tenured gernation
is_tenured_allocation_failure_gc(GCCause::Cause cause)109   inline static bool is_tenured_allocation_failure_gc(GCCause::Cause cause) {
110     assert(cause != GCCause::_old_generation_too_full_to_scavenge &&
111            cause != GCCause::_old_generation_expanded_on_last_scavenge,
112            "This GCCause may be correct but is not expected yet: %s",
113            to_string(cause));
114     // _tenured_generation_full for full tenured generations
115     // _adaptive_size_policy for a full collection after a young GC
116     // _allocation_failure is the generic cause a collection which could result
117     // in the collection of the tenured generation if there is not enough space
118     // in the tenured generation to support a young GC.
119     return (cause == GCCause::_tenured_generation_full ||
120             cause == GCCause::_adaptive_size_policy ||
121             cause == GCCause::_allocation_failure);
122   }
123 
124   // Causes for collection of the young generation
is_allocation_failure_gc(GCCause::Cause cause)125   inline static bool is_allocation_failure_gc(GCCause::Cause cause) {
126     // _allocation_failure is the generic cause a collection for allocation failure
127     // _adaptive_size_policy is for a collecton done before a full GC
128     return (cause == GCCause::_allocation_failure ||
129             cause == GCCause::_adaptive_size_policy ||
130             cause == GCCause::_shenandoah_allocation_failure_evac);
131   }
132 
133   // Return a string describing the GCCause.
134   static const char* to_string(GCCause::Cause cause);
135 };
136 
137 #endif // SHARE_GC_SHARED_GCCAUSE_HPP
138