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_concurrent_gc,
 81     _shenandoah_upgrade_to_full_gc,
 82 
 83     _z_timer,
 84     _z_warmup,
 85     _z_allocation_rate,
 86     _z_allocation_stall,
 87     _z_proactive,
 88     _z_high_usage,
 89 
 90     _last_gc_cause
 91   };
 92 
 93   inline static bool is_user_requested_gc(GCCause::Cause cause) {
 94     return (cause == GCCause::_java_lang_system_gc ||
 95             cause == GCCause::_dcmd_gc_run);
 96   }
 97 
 98   inline static bool is_explicit_full_gc(GCCause::Cause cause) {
 99     return (is_user_requested_gc(cause) ||
100             is_serviceability_requested_gc(cause) ||
101             cause == GCCause::_wb_full_gc);
102   }
103 
104   inline static bool is_serviceability_requested_gc(GCCause::Cause
105                                                              cause) {
106     return (cause == GCCause::_jvmti_force_gc ||
107             cause == GCCause::_heap_inspection ||
108             cause == GCCause::_heap_dump);
109   }
110 
111   // Causes for collection of the tenured gernation
112   inline static bool is_tenured_allocation_failure_gc(GCCause::Cause cause) {
113     // _adaptive_size_policy for a full collection after a young GC
114     // _allocation_failure is the generic cause a collection which could result
115     // in the collection of the tenured generation if there is not enough space
116     // in the tenured generation to support a young GC.
117     return (cause == GCCause::_adaptive_size_policy ||
118             cause == GCCause::_allocation_failure);
119   }
120 
121   // Causes for collection of the young generation
122   inline static bool is_allocation_failure_gc(GCCause::Cause cause) {
123     // _allocation_failure is the generic cause a collection for allocation failure
124     // _adaptive_size_policy is for a collection done before a full GC
125     return (cause == GCCause::_allocation_failure ||
126             cause == GCCause::_adaptive_size_policy ||
127             cause == GCCause::_shenandoah_allocation_failure_evac);
128   }
129 
130   // Return a string describing the GCCause.
131   static const char* to_string(GCCause::Cause cause);
132 };
133 
134 #endif // SHARE_GC_SHARED_GCCAUSE_HPP