1 /* |
1 /* |
2 * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
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 |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
152 } |
152 } |
153 |
153 |
154 assert(is_object_aligned(max_size()) && min_size() <= max_size(), |
154 assert(is_object_aligned(max_size()) && min_size() <= max_size(), |
155 "PLAB clipping computation may be incorrect"); |
155 "PLAB clipping computation may be incorrect"); |
156 |
156 |
157 if (_allocated == 0) { |
157 assert(_allocated != 0 || _unused == 0, |
158 assert(_unused == 0, |
158 "Inconsistency in PLAB stats: " |
159 "Inconsistency in PLAB stats: " |
159 "_allocated: " SIZE_FORMAT ", " |
160 "_allocated: " SIZE_FORMAT ", " |
160 "_wasted: " SIZE_FORMAT ", " |
161 "_wasted: " SIZE_FORMAT ", " |
161 "_unused: " SIZE_FORMAT ", " |
162 "_unused: " SIZE_FORMAT ", " |
162 "_undo_wasted: " SIZE_FORMAT, |
163 "_undo_wasted: " SIZE_FORMAT, |
163 _allocated, _wasted, _unused, _undo_wasted); |
164 _allocated, _wasted, _unused, _undo_wasted); |
|
165 |
164 |
166 _allocated = 1; |
165 size_t plab_sz = compute_desired_plab_sz(); |
167 } |
166 // Take historical weighted average |
168 double wasted_frac = (double)_unused / (double)_allocated; |
167 _filter.sample(plab_sz); |
|
168 _desired_net_plab_sz = MAX2(min_size(), (size_t)_filter.average()); |
|
169 |
|
170 log_sizing(plab_sz, _desired_net_plab_sz); |
|
171 // Clear accumulators for next round |
|
172 reset(); |
|
173 } |
|
174 |
|
175 size_t PLABStats::compute_desired_plab_sz() { |
|
176 size_t allocated = MAX2(_allocated, size_t(1)); |
|
177 double wasted_frac = (double)_unused / (double)allocated; |
169 size_t target_refills = (size_t)((wasted_frac * TargetSurvivorRatio) / TargetPLABWastePct); |
178 size_t target_refills = (size_t)((wasted_frac * TargetSurvivorRatio) / TargetPLABWastePct); |
170 if (target_refills == 0) { |
179 if (target_refills == 0) { |
171 target_refills = 1; |
180 target_refills = 1; |
172 } |
181 } |
173 size_t used = _allocated - _wasted - _unused; |
182 size_t used = allocated - _wasted - _unused; |
174 // Assumed to have 1 gc worker thread |
183 // Assumed to have 1 gc worker thread |
175 size_t recent_plab_sz = used / target_refills; |
184 size_t recent_plab_sz = used / target_refills; |
176 // Take historical weighted average |
185 return recent_plab_sz; |
177 _filter.sample(recent_plab_sz); |
|
178 _desired_net_plab_sz = MAX2(min_size(), (size_t)_filter.average()); |
|
179 |
|
180 log_sizing(recent_plab_sz, _desired_net_plab_sz); |
|
181 |
|
182 reset(); |
|
183 } |
186 } |