1 /*
  2  * Copyright (c) 2002, 2023, 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/allStatic.hpp"
 29 #include "utilities/debug.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_full_gc,
 55     _wb_breakpoint,
 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     _codecache_GC_threshold,
 65     _codecache_GC_aggressive,
 66     _metadata_GC_threshold,
 67     _metadata_GC_clear_soft_refs,
 68 
 69     _adaptive_size_policy,
 70 
 71     _g1_inc_collection_pause,
 72     _g1_compaction_pause,
 73     _g1_humongous_allocation,
 74     _g1_periodic_collection,
 75 
 76     _dcmd_gc_run,
 77 
 78     _shenandoah_stop_vm,
 79     _shenandoah_allocation_failure_evac,
 80     _shenandoah_humongous_allocation_failure,
 81     _shenandoah_concurrent_gc,
 82     _shenandoah_upgrade_to_full_gc,
 83 
 84     _z_timer,
 85     _z_warmup,
 86     _z_allocation_rate,
 87     _z_allocation_stall,
 88     _z_proactive,
 89     _z_high_usage,
 90 
 91     _last_gc_cause
 92   };
 93 
 94   inline static bool is_user_requested_gc(GCCause::Cause cause) {
 95     return (cause == GCCause::_java_lang_system_gc ||
 96             cause == GCCause::_dcmd_gc_run);
 97   }
 98 
 99   inline static bool is_explicit_full_gc(GCCause::Cause cause) {
100     return (is_user_requested_gc(cause) ||
101             is_serviceability_requested_gc(cause) ||
102             cause == GCCause::_wb_full_gc);
103   }
104 
105   inline static bool is_serviceability_requested_gc(GCCause::Cause
106                                                              cause) {
107     return (cause == GCCause::_jvmti_force_gc ||
108             cause == GCCause::_heap_inspection ||
109             cause == GCCause::_heap_dump);
110   }
111 
112   // Causes for collection of the tenured gernation
113   inline static bool is_tenured_allocation_failure_gc(GCCause::Cause cause) {
114     // _adaptive_size_policy for a full collection after a young GC
115     // _allocation_failure is the generic cause a collection which could result
116     // in the collection of the tenured generation if there is not enough space
117     // in the tenured generation to support a young GC.
118     return (cause == GCCause::_adaptive_size_policy ||
119             cause == GCCause::_allocation_failure);
120   }
121 
122   // Causes for collection of the young generation
123   inline static bool is_allocation_failure_gc(GCCause::Cause cause) {
124     // _allocation_failure is the generic cause a collection for allocation failure
125     // _adaptive_size_policy is for a collection done before a full GC
126     return (cause == GCCause::_allocation_failure ||
127             cause == GCCause::_adaptive_size_policy ||
128             cause == GCCause::_shenandoah_allocation_failure_evac);
129   }
130 
131   // Return a string describing the GCCause.
132   static const char* to_string(GCCause::Cause cause);
133 };
134 
135 #endif // SHARE_GC_SHARED_GCCAUSE_HPP