1 /* 2 * Copyright (c) 2015, 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 #include "precompiled.hpp" 26 #include "gc/g1/g1CollectedHeap.inline.hpp" 27 #include "gc/g1/g1ErgoVerbose.hpp" 28 #include "gc/g1/g1IHOPControl.hpp" 29 30 G1IHOPControl::G1IHOPControl(double initial_ihop_percent, size_t target_occupancy) : 31 _initial_ihop_percent(initial_ihop_percent), 32 _target_occupancy(target_occupancy) { 33 assert(_initial_ihop_percent >= 0.0 && _initial_ihop_percent <= 100.0, "Initial IHOP value must be between 0 and 100 but is %.3f", initial_ihop_percent); 34 } 35 36 G1StaticIHOPControl::G1StaticIHOPControl(double ihop_percent, size_t target_occupancy) : 37 G1IHOPControl(ihop_percent, target_occupancy), 38 _last_allocation_time_s(0.0), 39 _last_allocated_bytes(0), 40 _last_marking_length_s(0.0) { 41 assert(_target_occupancy > 0, "Target occupancy must be larger than zero."); 42 } 43 44 void G1StaticIHOPControl::print() { 45 ergo_verbose6(ErgoIHOP, 46 "basic information", 47 ergo_format_reason("value update") 48 ergo_format_byte_perc("threshold") 49 ergo_format_byte("target occupancy") 50 ergo_format_byte("current occupancy") 51 ergo_format_double("recent old gen allocation rate") 52 ergo_format_ms("recent marking phase length"), 53 get_conc_mark_start_threshold(), 54 _initial_ihop_percent, 55 _target_occupancy, 56 G1CollectedHeap::heap()->used(), 57 _last_allocation_time_s > 0.0 ? _last_allocated_bytes / _last_allocation_time_s : 0.0, 58 _last_marking_length_s * 1000.0); 59 } 60 61 #ifndef PRODUCT 62 static void test_update(G1IHOPControl* ctrl, double alloc_time, size_t alloc_amount, size_t young_size, double mark_time) { 63 for (int i = 0; i < 100; i++) { 64 ctrl->update_allocation_info(alloc_time, alloc_amount, young_size); 65 ctrl->update_marking_length(mark_time); 66 } 67 } 68 69 void G1StaticIHOPControl::test() { 70 size_t const initial_ihop = 45; 71 72 G1StaticIHOPControl ctrl(initial_ihop, 100); 73 size_t threshold; 74 75 threshold = ctrl.get_conc_mark_start_threshold(); 76 assert(threshold == initial_ihop, 77 "Expected IHOP threshold of " SIZE_FORMAT " but is " SIZE_FORMAT, initial_ihop, threshold); 78 79 ctrl.update_allocation_info(100.0, 100, 100); 80 threshold = ctrl.get_conc_mark_start_threshold(); 81 assert(threshold == initial_ihop, 82 "Expected IHOP threshold of " SIZE_FORMAT " but is " SIZE_FORMAT, initial_ihop, threshold); 83 84 ctrl.update_marking_length(1000.0); 85 threshold = ctrl.get_conc_mark_start_threshold(); 86 assert(threshold == initial_ihop, 87 "Expected IHOP threshold of " SIZE_FORMAT " but is " SIZE_FORMAT, initial_ihop, threshold); 88 89 // Whatever we pass, the IHOP value must stay the same. 90 test_update(&ctrl, 2, 10, 10, 3); 91 threshold = ctrl.get_conc_mark_start_threshold(); 92 assert(threshold == initial_ihop, 93 "Expected IHOP threshold of " SIZE_FORMAT " but is " SIZE_FORMAT, initial_ihop, threshold); 94 95 test_update(&ctrl, 12, 10, 10, 3); 96 threshold = ctrl.get_conc_mark_start_threshold(); 97 assert(threshold == initial_ihop, 98 "Expected IHOP threshold of " SIZE_FORMAT " but is " SIZE_FORMAT, initial_ihop, threshold); 99 } 100 #endif 101 102 #ifndef PRODUCT 103 void IHOP_test() { 104 G1StaticIHOPControl::test(); 105 } 106 #endif