1 /*
   2  * Copyright (c) 2015, 2019, 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 #include "precompiled.hpp"
  25 #include "gc/z/zCollectedHeap.hpp"
  26 #include "gc/z/zDirector.hpp"
  27 #include "gc/z/zHeap.inline.hpp"
  28 #include "gc/z/zStat.hpp"
  29 #include "gc/z/zUtils.hpp"
  30 #include "logging/log.hpp"
  31 
  32 const double ZDirector::one_in_1000 = 3.290527;
  33 
  34 ZDirector::ZDirector() :
  35     _metronome(ZStatAllocRate::sample_hz) {
  36   set_name("ZDirector");
  37   create_and_start();
  38 }
  39 
  40 void ZDirector::sample_allocation_rate() const {
  41   // Sample allocation rate. This is needed by rule_allocation_rate()
  42   // below to estimate the time we have until we run out of memory.
  43   const double bytes_per_second = ZStatAllocRate::sample_and_reset();
  44 
  45   log_debug(gc, alloc)("Allocation Rate: %.3fMB/s, Avg: %.3f(+/-%.3f)MB/s",
  46                        bytes_per_second / M,
  47                        ZStatAllocRate::avg() / M,
  48                        ZStatAllocRate::avg_sd() / M);
  49 }
  50 
  51 bool ZDirector::rule_timer() const {
  52   if (ZCollectionInterval == 0) {
  53     // Rule disabled
  54     return false;
  55   }
  56 
  57   // Perform GC if timer has expired.
  58   const double time_since_last_gc = ZStatCycle::time_since_last();
  59   const double time_until_gc = ZCollectionInterval - time_since_last_gc;
  60 
  61   log_debug(gc, director)("Rule: Timer, Interval: %us, TimeUntilGC: %.3fs",
  62                           ZCollectionInterval, time_until_gc);
  63 
  64   return time_until_gc <= 0;
  65 }
  66 
  67 bool ZDirector::rule_warmup() const {
  68   if (ZStatCycle::is_warm()) {
  69     // Rule disabled
  70     return false;
  71   }
  72 
  73   // Perform GC if heap usage passes 10/20/30% and no other GC has been
  74   // performed yet. This allows us to get some early samples of the GC
  75   // duration, which is needed by the other rules.
  76   const size_t soft_max_capacity = ZHeap::heap()->soft_max_capacity();
  77   const size_t used = ZHeap::heap()->used();
  78   const double used_threshold_percent = (ZStatCycle::nwarmup_cycles() + 1) * 0.1;
  79   const size_t used_threshold = soft_max_capacity * used_threshold_percent;
  80 
  81   log_debug(gc, director)("Rule: Warmup %.0f%%, Used: " SIZE_FORMAT "MB, UsedThreshold: " SIZE_FORMAT "MB",
  82                           used_threshold_percent * 100, used / M, used_threshold / M);
  83 
  84   return used >= used_threshold;
  85 }
  86 
  87 bool ZDirector::rule_allocation_rate() const {
  88   if (!ZStatCycle::is_normalized_duration_trustable()) {
  89     // Rule disabled
  90     return false;
  91   }
  92 
  93   // Perform GC if the estimated max allocation rate indicates that we
  94   // will run out of memory. The estimated max allocation rate is based
  95   // on the moving average of the sampled allocation rate plus a safety
  96   // margin based on variations in the allocation rate and unforeseen
  97   // allocation spikes.
  98 
  99   // Calculate amount of free memory available to Java threads. Note that
 100   // the heap reserve is not available to Java threads and is therefore not
 101   // considered part of the free memory.
 102   const size_t soft_max_capacity = ZHeap::heap()->soft_max_capacity();
 103   const size_t max_reserve = ZHeap::heap()->max_reserve();
 104   const size_t used = ZHeap::heap()->used();
 105   const size_t free_with_reserve = soft_max_capacity - MIN2(soft_max_capacity, used);
 106   const size_t free = free_with_reserve - MIN2(free_with_reserve, max_reserve);
 107 
 108   // Calculate time until OOM given the max allocation rate and the amount
 109   // of free memory. The allocation rate is a moving average and we multiply
 110   // that with an allocation spike tolerance factor to guard against unforeseen
 111   // phase changes in the allocate rate. We then add ~3.3 sigma to account for
 112   // the allocation rate variance, which means the probability is 1 in 1000
 113   // that a sample is outside of the confidence interval.
 114   const double max_alloc_rate = (ZStatAllocRate::avg() * ZAllocationSpikeTolerance) + (ZStatAllocRate::avg_sd() * one_in_1000);
 115   const double time_until_oom = free / (max_alloc_rate + 1.0); // Plus 1.0B/s to avoid division by zero
 116 
 117   // Calculate max duration of a GC cycle. The duration of GC is a moving
 118   // average, we add ~3.3 sigma to account for the GC duration variance.
 119   const AbsSeq& duration_of_gc = ZStatCycle::normalized_duration();
 120   const double max_duration_of_gc = duration_of_gc.davg() + (duration_of_gc.dsd() * one_in_1000);
 121 
 122   // Calculate time until GC given the time until OOM and max duration of GC.
 123   // We also deduct the sample interval, so that we don't overshoot the target
 124   // time and end up starting the GC too late in the next interval.
 125   const double sample_interval = 1.0 / ZStatAllocRate::sample_hz;
 126   const double time_until_gc = time_until_oom - max_duration_of_gc - sample_interval;
 127 
 128   log_debug(gc, director)("Rule: Allocation Rate, MaxAllocRate: %.3fMB/s, Free: " SIZE_FORMAT "MB, MaxDurationOfGC: %.3fs, TimeUntilGC: %.3fs",
 129                           max_alloc_rate / M, free / M, max_duration_of_gc, time_until_gc);
 130 
 131   return time_until_gc <= 0;
 132 }
 133 
 134 bool ZDirector::rule_proactive() const {
 135   if (!ZProactive || !ZStatCycle::is_warm()) {
 136     // Rule disabled
 137     return false;
 138   }
 139 
 140   // Perform GC if the impact of doing so, in terms of application throughput
 141   // reduction, is considered acceptable. This rule allows us to keep the heap
 142   // size down and allow reference processing to happen even when we have a lot
 143   // of free space on the heap.
 144 
 145   // Only consider doing a proactive GC if the heap usage has grown by at least
 146   // 10% of the max capacity since the previous GC, or more than 5 minutes has
 147   // passed since the previous GC. This helps avoid superfluous GCs when running
 148   // applications with very low allocation rate.
 149   const size_t used_after_last_gc = ZStatHeap::used_at_relocate_end();
 150   const size_t used_increase_threshold = ZHeap::heap()->soft_max_capacity() * 0.10; // 10%
 151   const size_t used_threshold = used_after_last_gc + used_increase_threshold;
 152   const size_t used = ZHeap::heap()->used();
 153   const double time_since_last_gc = ZStatCycle::time_since_last();
 154   const double time_since_last_gc_threshold = 5 * 60; // 5 minutes
 155   if (used < used_threshold && time_since_last_gc < time_since_last_gc_threshold) {
 156     // Don't even consider doing a proactive GC
 157     log_debug(gc, director)("Rule: Proactive, UsedUntilEnabled: " SIZE_FORMAT "MB, TimeUntilEnabled: %.3fs",
 158                             (used_threshold - used) / M,
 159                             time_since_last_gc_threshold - time_since_last_gc);
 160     return false;
 161   }
 162 
 163   const double assumed_throughput_drop_during_gc = 0.50; // 50%
 164   const double acceptable_throughput_drop = 0.01;        // 1%
 165   const AbsSeq& duration_of_gc = ZStatCycle::normalized_duration();
 166   const double max_duration_of_gc = duration_of_gc.davg() + (duration_of_gc.dsd() * one_in_1000);
 167   const double acceptable_gc_interval = max_duration_of_gc * ((assumed_throughput_drop_during_gc / acceptable_throughput_drop) - 1.0);
 168   const double time_until_gc = acceptable_gc_interval - time_since_last_gc;
 169 
 170   log_debug(gc, director)("Rule: Proactive, AcceptableGCInterval: %.3fs, TimeSinceLastGC: %.3fs, TimeUntilGC: %.3fs",
 171                           acceptable_gc_interval, time_since_last_gc, time_until_gc);
 172 
 173   return time_until_gc <= 0;
 174 }
 175 
 176 bool ZDirector::rule_high_usage() const {
 177   // Perform GC if the amount of free memory is 5% or less. This is a preventive
 178   // meassure in the case where the application has a very low allocation rate,
 179   // such that the allocation rate rule doesn't trigger, but the amount of free
 180   // memory is still slowly but surely heading towards zero. In this situation,
 181   // we start a GC cycle to avoid a potential allocation stall later.
 182 
 183   // Calculate amount of free memory available to Java threads. Note that
 184   // the heap reserve is not available to Java threads and is therefore not
 185   // considered part of the free memory.
 186   const size_t soft_max_capacity = ZHeap::heap()->soft_max_capacity();
 187   const size_t max_reserve = ZHeap::heap()->max_reserve();
 188   const size_t used = ZHeap::heap()->used();
 189   const size_t free_with_reserve = soft_max_capacity - used;
 190   const size_t free = free_with_reserve - MIN2(free_with_reserve, max_reserve);
 191   const double free_percent = percent_of(free, soft_max_capacity);
 192 
 193   log_debug(gc, director)("Rule: High Usage, Free: " SIZE_FORMAT "MB(%.1f%%)",
 194                           free / M, free_percent);
 195 
 196   return free_percent <= 5.0;
 197 }
 198 
 199 GCCause::Cause ZDirector::make_gc_decision() const {
 200   // Rule 0: Timer
 201   if (rule_timer()) {
 202     return GCCause::_z_timer;
 203   }
 204 
 205   // Rule 1: Warmup
 206   if (rule_warmup()) {
 207     return GCCause::_z_warmup;
 208   }
 209 
 210   // Rule 2: Allocation rate
 211   if (rule_allocation_rate()) {
 212     return GCCause::_z_allocation_rate;
 213   }
 214 
 215   // Rule 3: Proactive
 216   if (rule_proactive()) {
 217     return GCCause::_z_proactive;
 218   }
 219 
 220   // Rule 4: High usage
 221   if (rule_high_usage()) {
 222     return GCCause::_z_high_usage;
 223   }
 224 
 225   // No GC
 226   return GCCause::_no_gc;
 227 }
 228 
 229 void ZDirector::run_service() {
 230   // Main loop
 231   while (_metronome.wait_for_tick()) {
 232     sample_allocation_rate();
 233     const GCCause::Cause cause = make_gc_decision();
 234     if (cause != GCCause::_no_gc) {
 235       ZCollectedHeap::heap()->collect(cause);
 236     }
 237   }
 238 }
 239 
 240 void ZDirector::stop_service() {
 241   _metronome.stop();
 242 }
--- EOF ---