< prev index next >

src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.hpp

Print this page
*** 1,7 ***
--- 1,8 ---
  /*
   * Copyright (c) 2018, 2019, Red Hat, Inc. All rights reserved.
+  * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License version 2 only, as
   * published by the Free Software Foundation.

*** 23,12 ***
--- 24,16 ---
   */
  
  #ifndef SHARE_GC_SHENANDOAH_HEURISTICS_SHENANDOAHADAPTIVEHEURISTICS_HPP
  #define SHARE_GC_SHENANDOAH_HEURISTICS_SHENANDOAHADAPTIVEHEURISTICS_HPP
  
+ #include "runtime/globals_extension.hpp"
+ #include "memory/allocation.hpp"
  #include "gc/shenandoah/heuristics/shenandoahHeuristics.hpp"
+ #include "gc/shenandoah/heuristics/shenandoahSpaceInfo.hpp"
  #include "gc/shenandoah/shenandoahPhaseTimings.hpp"
+ #include "gc/shenandoah/shenandoahSharedVariables.hpp"
  #include "utilities/numberSeq.hpp"
  
  class ShenandoahAllocationRate : public CHeapObj<mtGC> {
   public:
    explicit ShenandoahAllocationRate();

*** 36,11 ***
  
    double sample(size_t allocated);
  
    double upper_bound(double sds) const;
    bool is_spiking(double rate, double threshold) const;
- 
   private:
  
    double instantaneous_rate(double time, size_t allocated) const;
  
    double _last_sample_time;
--- 41,10 ---

*** 48,22 ***
    double _interval_sec;
    TruncatedSeq _rate;
    TruncatedSeq _rate_avg;
  };
  
  class ShenandoahAdaptiveHeuristics : public ShenandoahHeuristics {
  public:
!   ShenandoahAdaptiveHeuristics();
  
    virtual ~ShenandoahAdaptiveHeuristics();
  
    virtual void choose_collection_set_from_regiondata(ShenandoahCollectionSet* cset,
                                                       RegionData* data, size_t size,
                                                       size_t actual_free);
  
    void record_cycle_start();
!   void record_success_concurrent();
    void record_success_degenerated();
    void record_success_full();
  
    virtual bool should_start_gc();
  
--- 52,33 ---
    double _interval_sec;
    TruncatedSeq _rate;
    TruncatedSeq _rate_avg;
  };
  
+ /*
+  * The adaptive heuristic tracks the allocation behavior and average cycle
+  * time of the application. It attempts to start a cycle with enough time
+  * to complete before the available memory is exhausted. It errors on the
+  * side of starting cycles early to avoid allocation failures (degenerated
+  * cycles).
+  *
+  * This heuristic limits the number of regions for evacuation such that the
+  * evacuation reserve is respected. This helps it avoid allocation failures
+  * during evacuation. It preferentially selects regions with the most garbage.
+  */
  class ShenandoahAdaptiveHeuristics : public ShenandoahHeuristics {
  public:
!   ShenandoahAdaptiveHeuristics(ShenandoahSpaceInfo* space_info);
  
    virtual ~ShenandoahAdaptiveHeuristics();
  
    virtual void choose_collection_set_from_regiondata(ShenandoahCollectionSet* cset,
                                                       RegionData* data, size_t size,
                                                       size_t actual_free);
  
    void record_cycle_start();
!   void record_success_concurrent(bool abbreviated);
    void record_success_degenerated();
    void record_success_full();
  
    virtual bool should_start_gc();
  

*** 96,15 ***
  
    void adjust_last_trigger_parameters(double amount);
    void adjust_margin_of_error(double amount);
    void adjust_spike_threshold(double amount);
  
    ShenandoahAllocationRate _allocation_rate;
  
    // The margin of error expressed in standard deviations to add to our
    // average cycle time and allocation rate. As this value increases we
!   // tend to over estimate the rate at which mutators will deplete the
    // heap. In other words, erring on the side of caution will trigger more
    // concurrent GCs.
    double _margin_of_error_sd;
  
    // The allocation spike threshold is expressed in standard deviations.
--- 111,16 ---
  
    void adjust_last_trigger_parameters(double amount);
    void adjust_margin_of_error(double amount);
    void adjust_spike_threshold(double amount);
  
+ protected:
    ShenandoahAllocationRate _allocation_rate;
  
    // The margin of error expressed in standard deviations to add to our
    // average cycle time and allocation rate. As this value increases we
!   // tend to overestimate the rate at which mutators will deplete the
    // heap. In other words, erring on the side of caution will trigger more
    // concurrent GCs.
    double _margin_of_error_sd;
  
    // The allocation spike threshold is expressed in standard deviations.

*** 123,8 ***
--- 139,10 ---
  
    // Keep track of the available memory at the end of a GC cycle. This
    // establishes what is 'normal' for the application and is used as a
    // source of feedback to adjust trigger parameters.
    TruncatedSeq _available;
+ 
+   size_t min_free_threshold();
  };
  
  #endif // SHARE_GC_SHENANDOAH_HEURISTICS_SHENANDOAHADAPTIVEHEURISTICS_HPP
< prev index next >