--- old/src/hotspot/share/gc/g1/g1HeapSizingPolicy.hpp 2020-06-10 10:12:05.097048906 +0200 +++ new/src/hotspot/share/gc/g1/g1HeapSizingPolicy.hpp 2020-06-10 10:12:05.001045608 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -26,38 +26,82 @@ #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 { - // 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; + // 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 _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; + 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 pause time threshold with heap size as we want to resize more + // 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: - // 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(); + // 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(); - // Clear ratio tracking data used by expansion_amount(). - void clear_ratio_check_data(); + // 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); };