1 /*
2  * Copyright (c) 2003, 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 
25 #ifndef SHARE_GC_PARALLEL_PSGCADAPTIVEPOLICYCOUNTERS_HPP
26 #define SHARE_GC_PARALLEL_PSGCADAPTIVEPOLICYCOUNTERS_HPP
27 
28 #include "gc/parallel/gcAdaptivePolicyCounters.hpp"
29 #include "gc/parallel/psAdaptiveSizePolicy.hpp"
30 #include "gc/shared/gcPolicyCounters.hpp"
31 
32 // PSGCAdaptivePolicyCounters is a holder class for performance counters
33 // that track the data and decisions for the ergonomics policy for the
34 // parallel scavenge collector.
35 
36 class PSGCAdaptivePolicyCounters : public GCAdaptivePolicyCounters {
37   friend class VMStructs;
38 
39  private:
40   // survivor space vs. tenuring threshold
41   PerfVariable* _old_promo_size;
42   PerfVariable* _old_eden_size;
43   PerfVariable* _avg_promoted_avg_counter;
44   PerfVariable* _avg_promoted_dev_counter;
45   PerfVariable* _avg_promoted_padded_avg_counter;
46   PerfVariable* _avg_pretenured_padded_avg;
47 
48   // young gen vs. old gen sizing
49   PerfVariable* _avg_major_pause;
50   PerfVariable* _avg_major_interval;
51   PerfVariable* _live_space;
52   PerfVariable* _free_space;
53   PerfVariable* _avg_base_footprint;
54   PerfVariable* _live_at_last_full_gc_counter;
55   PerfVariable* _old_capacity;
56   PerfVariable* _boundary_moved;
57 
58   PerfVariable* _change_old_gen_for_min_pauses;
59   PerfVariable* _change_young_gen_for_maj_pauses_counter;
60 
61   PerfVariable* _major_pause_old_slope;
62   PerfVariable* _minor_pause_old_slope;
63   PerfVariable* _major_pause_young_slope;
64 
65   PerfVariable* _scavenge_skipped;
66   PerfVariable* _full_follows_scavenge;
67 
68   // Use this time stamp if the gc time stamp is not available.
69   TimeStamp     _counter_time_stamp;
70 
71  protected:
ps_size_policy()72   PSAdaptiveSizePolicy* ps_size_policy() {
73     return (PSAdaptiveSizePolicy*)_size_policy;
74   }
75 
76  public:
77   PSGCAdaptivePolicyCounters(const char* name, int collectors, int generations,
78                              PSAdaptiveSizePolicy* size_policy);
update_old_capacity(size_t size_in_bytes)79   inline void update_old_capacity(size_t size_in_bytes) {
80     _old_capacity->set_value(size_in_bytes);
81   }
update_old_eden_size(size_t old_size)82   inline void update_old_eden_size(size_t old_size) {
83     _old_eden_size->set_value(old_size);
84   }
update_old_promo_size(size_t old_size)85   inline void update_old_promo_size(size_t old_size) {
86     _old_promo_size->set_value(old_size);
87   }
update_boundary_moved(int size_in_bytes)88   inline void update_boundary_moved(int size_in_bytes) {
89     _boundary_moved->set_value(size_in_bytes);
90   }
update_avg_promoted_avg()91   inline void update_avg_promoted_avg() {
92     _avg_promoted_avg_counter->set_value(
93       (jlong)(ps_size_policy()->avg_promoted()->average())
94     );
95   }
update_avg_promoted_dev()96   inline void update_avg_promoted_dev() {
97     _avg_promoted_dev_counter->set_value(
98       (jlong)(ps_size_policy()->avg_promoted()->deviation())
99     );
100   }
update_avg_promoted_padded_avg()101   inline void update_avg_promoted_padded_avg() {
102     _avg_promoted_padded_avg_counter->set_value(
103       (jlong)(ps_size_policy()->avg_promoted()->padded_average())
104     );
105   }
106 
update_avg_pretenured_padded_avg()107   inline void update_avg_pretenured_padded_avg() {
108     _avg_pretenured_padded_avg->set_value(
109       (jlong)(ps_size_policy()->_avg_pretenured->padded_average())
110     );
111   }
update_change_young_gen_for_maj_pauses()112   inline void update_change_young_gen_for_maj_pauses() {
113     _change_young_gen_for_maj_pauses_counter->set_value(
114       ps_size_policy()->change_young_gen_for_maj_pauses());
115   }
update_change_old_gen_for_min_pauses()116   inline void update_change_old_gen_for_min_pauses() {
117     _change_old_gen_for_min_pauses->set_value(
118       ps_size_policy()->change_old_gen_for_min_pauses());
119   }
120 
121   // compute_generations_free_space() statistics
122 
update_avg_major_pause()123   inline void update_avg_major_pause() {
124     _avg_major_pause->set_value(
125       (jlong)(ps_size_policy()->_avg_major_pause->average() * 1000.0)
126     );
127   }
update_avg_major_interval()128   inline void update_avg_major_interval() {
129     _avg_major_interval->set_value(
130       (jlong)(ps_size_policy()->_avg_major_interval->average() * 1000.0)
131     );
132   }
133 
update_major_gc_cost_counter()134   inline void update_major_gc_cost_counter() {
135     _major_gc_cost_counter->set_value(
136       (jlong)(ps_size_policy()->major_gc_cost() * 100.0)
137     );
138   }
update_mutator_cost_counter()139   inline void update_mutator_cost_counter() {
140     _mutator_cost_counter->set_value(
141       (jlong)(ps_size_policy()->mutator_cost() * 100.0)
142     );
143   }
144 
update_live_space()145   inline void update_live_space() {
146     _live_space->set_value(ps_size_policy()->live_space());
147   }
update_free_space()148   inline void update_free_space() {
149     _free_space->set_value(ps_size_policy()->free_space());
150   }
151 
update_avg_base_footprint()152   inline void update_avg_base_footprint() {
153     _avg_base_footprint->set_value(
154       (jlong)(ps_size_policy()->avg_base_footprint()->average())
155     );
156   }
update_avg_old_live()157   inline void update_avg_old_live() {
158     _avg_old_live_counter->set_value(
159       (jlong)(ps_size_policy()->avg_old_live()->average())
160     );
161   }
162   // Scale up all the slopes
update_major_pause_old_slope()163   inline void update_major_pause_old_slope() {
164     _major_pause_old_slope->set_value(
165       (jlong)(ps_size_policy()->major_pause_old_slope() * 1000)
166     );
167   }
update_minor_pause_old_slope()168   inline void update_minor_pause_old_slope() {
169     _minor_pause_old_slope->set_value(
170       (jlong)(ps_size_policy()->minor_pause_old_slope() * 1000)
171     );
172   }
update_major_pause_young_slope()173   inline void update_major_pause_young_slope() {
174     _major_pause_young_slope->set_value(
175       (jlong)(ps_size_policy()->major_pause_young_slope() * 1000)
176     );
177   }
update_gc_overhead_limit_exceeded_counter()178   inline void update_gc_overhead_limit_exceeded_counter() {
179     gc_overhead_limit_exceeded_counter()->set_value(
180       (jlong) ps_size_policy()->gc_overhead_limit_exceeded());
181   }
update_live_at_last_full_gc_counter()182   inline void update_live_at_last_full_gc_counter() {
183     _live_at_last_full_gc_counter->set_value(
184       (jlong)(ps_size_policy()->live_at_last_full_gc()));
185   }
186 
update_scavenge_skipped(int cause)187   inline void update_scavenge_skipped(int cause) {
188     _scavenge_skipped->set_value(cause);
189   }
190 
update_full_follows_scavenge(int event)191   inline void update_full_follows_scavenge(int event) {
192     _full_follows_scavenge->set_value(event);
193   }
194 
195   // Update all the counters that can be updated from the size policy.
196   // This should be called after all policy changes have been made
197   // and reflected internally in the size policy.
198   void update_counters_from_policy();
199 
200   // Update counters that can be updated from fields internal to the
201   // counter or from globals.  This is distinguished from counters
202   // that are updated via input parameters.
203   void update_counters();
204 
kind() const205   virtual GCPolicyCounters::Name kind() const {
206     return GCPolicyCounters::PSGCAdaptivePolicyCountersKind;
207   }
208 };
209 
210 #endif // SHARE_GC_PARALLEL_PSGCADAPTIVEPOLICYCOUNTERS_HPP
211