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 
 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 
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
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
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