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