< prev index next >
src/hotspot/share/gc/g1/g1HeapSizingPolicy.hpp
Print this page
rev 59703 : imported patch 8238687-investigate-memory-uncommit-during-young-gc
*** 1,7 ****
/*
! * Copyright (c) 2016, 2019, Oracle and/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.
--- 1,7 ----
/*
! * Copyright (c) 2016, 2020, Oracle and/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.
*** 24,65 ****
#ifndef SHARE_GC_G1_G1HEAPSIZINGPOLICY_HPP
#define SHARE_GC_G1_G1HEAPSIZINGPOLICY_HPP
#include "memory/allocation.hpp"
class G1Analytics;
class G1CollectedHeap;
class G1HeapSizingPolicy: public CHeapObj<mtGC> {
! // MinOverThresholdForGrowth must be less than the number of recorded
! // pause times in G1Analytics, representing the minimum number of pause
! // time ratios that exceed GCTimeRatio before a heap expansion will be triggered.
! const static uint MinOverThresholdForGrowth = 4;
const G1CollectedHeap* _g1h;
const G1Analytics* _analytics;
! const uint _num_prev_pauses_for_heuristics;
! // Ratio check data for determining if heap growth is necessary.
! uint _ratio_over_threshold_count;
! double _ratio_over_threshold_sum;
! uint _pauses_since_start;
! // Scale "full" gc pause time threshold with heap size as we want to resize more
// eagerly at small heap sizes.
double scale_with_heap(double pause_time_threshold);
G1HeapSizingPolicy(const G1CollectedHeap* g1h, const G1Analytics* analytics);
public:
! // If an expansion would be appropriate, because recent GC overhead had
! // exceeded the desired limit, return an amount to expand by.
! size_t expansion_amount();
! // Clear ratio tracking data used by expansion_amount().
! void clear_ratio_check_data();
static G1HeapSizingPolicy* create(const G1CollectedHeap* g1h, const G1Analytics* analytics);
};
#endif // SHARE_GC_G1_G1HEAPSIZINGPOLICY_HPP
--- 24,109 ----
#ifndef SHARE_GC_G1_G1HEAPSIZINGPOLICY_HPP
#define SHARE_GC_G1_G1HEAPSIZINGPOLICY_HPP
#include "memory/allocation.hpp"
+ #include "utilities/numberSeq.hpp"
class G1Analytics;
class G1CollectedHeap;
+ //
+ // Contains heuristics for heap sizing, i.e. expansion or shrinking, during operation
+ // based on gc time ratio.
+ //
+ // The heuristics tracks both short term and long term behavior to effect heap
+ // size change.
+ //
+ // Short term tracking is based on short-term gc time ratio behavior: for this we
+ // record events for when actual gc time ratio is outside the range of
+ // [GCTimeRatio * G1MinimumPercentOfGCTimeRatio, GCTimeRatio] or not in a counter.
+ // If below that range, we decrement that counter, if above, we increment it.
+ //
+ // The intent of this mechanism is to filter short term events as heap sizing has
+ // some overhead.
+ //
+ // If that counter reaches the MinOverThresholdForExpansion we consider expansion,
+ // if that counter reaches -MinOverThresholdForShrink we consider heap shrinking.
+ //
+ // While doing so, we accumulate the difference to the midpoint of this range to
+ // guide the expansion/shrinking amount.
+ //
+ // Further, if there is no short-term based resizing event for a "long" time, we
+ // decay that counter, i.e. drop it towards zero again to avoid that previous
+ // intermediate length short term behavior followed by a quiet time and a single
+ // short term event causes unnecessary resizes.
+ //
+ // Long term behavior is solely managed by regularly comparing actual long term
+ // gc time ratio with the boundaries of above range in regular long term
+ // intervals. If current long term gc time ratio is outside, expand or shrink
+ // respectively.
+ //
class G1HeapSizingPolicy: public CHeapObj<mtGC> {
! // MinOverThresholdForExpansion/Shrink define the number of actual gc time
! // ratios over the upper and lower thresholds respectively.
! const static int MinOverThresholdForExpansion = 4;
! const static int MinOverThresholdForShrink = 4;
const G1CollectedHeap* _g1h;
const G1Analytics* _analytics;
! const uint _long_term_interval;
! // Number of times actual gc time ratio crossed lower and upper threshold
! // recently; every time the upper threshold is exceeded, it is incremented,
! // and decremented if the lower threshold is undercut.
! int _ratio_exceeds_threshold;
! // Recent actual gc time ratios relative to the middle of lower and upper threshold.
! TruncatedSeq _recent_pause_ratios;
! uint _long_term_count;
!
! // Clear ratio tracking data used by resize_amount().
! void reset_ratio_tracking_data();
! void decay_ratio_tracking_data();
! // Scale "full" gc time ratio threshold with heap size as we want to resize more
// eagerly at small heap sizes.
double scale_with_heap(double pause_time_threshold);
+ // Scale the ratio delta depending on how far it exceeds the actual target gc time
+ // ratio.
+ double scale_resize_ratio_delta(double ratio_delta);
+
G1HeapSizingPolicy(const G1CollectedHeap* g1h, const G1Analytics* analytics);
public:
! // Return by how many bytes the heap should be changed based on recent gc time
! // ratio after young collection. Positive values mean expansion is desired, and
! // negative values mean desired shrinking.
! ssize_t resize_amount_after_young_gc();
! // Calculate the target capacity based on used bytes and free ratio.
! size_t target_heap_capacity(size_t used_bytes, uintx free_ratio) const;
static G1HeapSizingPolicy* create(const G1CollectedHeap* g1h, const G1Analytics* analytics);
};
#endif // SHARE_GC_G1_G1HEAPSIZINGPOLICY_HPP
< prev index next >