1 /* 2 * Copyright (c) 2001, 2016, 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/g1Analytics.hpp" 27 #include "gc/g1/g1CollectorPolicy.hpp" 28 #include "gc/g1/g1YoungGenSizer.hpp" 29 #include "gc/g1/heapRegion.hpp" 30 #include "gc/g1/heapRegionRemSet.hpp" 31 #include "gc/shared/gcPolicyCounters.hpp" 32 #include "runtime/globals.hpp" 33 #include "utilities/debug.hpp" 34 35 G1CollectorPolicy::G1CollectorPolicy() { 36 37 // Set up the region size and associated fields. Given that the 38 // policy is created before the heap, we have to set this up here, 39 // so it's done as soon as possible. 40 41 // It would have been natural to pass initial_heap_byte_size() and 42 // max_heap_byte_size() to setup_heap_region_size() but those have 43 // not been set up at this point since they should be aligned with 44 // the region size. So, there is a circular dependency here. We base 45 // the region size on the heap size, but the heap size should be 46 // aligned with the region size. To get around this we use the 47 // unaligned values for the heap. 48 HeapRegion::setup_heap_region_size(InitialHeapSize, MaxHeapSize); 49 HeapRegionRemSet::setup_remset_size(); 50 51 // Below, we might need to calculate the pause time target based on 52 // the pause interval. When we do so we are going to give G1 maximum 53 // flexibility and allow it to do pauses when it needs to. So, we'll 54 // arrange that the pause interval to be pause time target + 1 to 55 // ensure that a) the pause time target is maximized with respect to 56 // the pause interval and b) we maintain the invariant that pause 57 // time target < pause interval. If the user does not want this 58 // maximum flexibility, they will have to set the pause interval 59 // explicitly. 60 61 // First make sure that, if either parameter is set, its value is 62 // reasonable. 63 guarantee(MaxGCPauseMillis >= 1, "Range checking for MaxGCPauseMillis should guarantee that value is >= 1"); 64 65 // Then, if the pause time target parameter was not set, set it to 66 // the default value. 67 if (FLAG_IS_DEFAULT(MaxGCPauseMillis)) { 68 if (FLAG_IS_DEFAULT(GCPauseIntervalMillis)) { 69 // The default pause time target in G1 is 200ms 70 FLAG_SET_DEFAULT(MaxGCPauseMillis, 200); 71 } else { 72 // We do not allow the pause interval to be set without the 73 // pause time target 74 vm_exit_during_initialization("GCPauseIntervalMillis cannot be set " 75 "without setting MaxGCPauseMillis"); 76 } 77 } 78 79 // Then, if the interval parameter was not set, set it according to 80 // the pause time target (this will also deal with the case when the 81 // pause time target is the default value). 82 if (FLAG_IS_DEFAULT(GCPauseIntervalMillis)) { 83 FLAG_SET_DEFAULT(GCPauseIntervalMillis, MaxGCPauseMillis + 1); 84 } 85 guarantee(GCPauseIntervalMillis >= 1, "Constraint for GCPauseIntervalMillis should guarantee that value is >= 1"); 86 guarantee(GCPauseIntervalMillis > MaxGCPauseMillis, "Constraint for GCPauseIntervalMillis should guarantee that GCPauseIntervalMillis > MaxGCPauseMillis"); 87 } 88 89 void G1CollectorPolicy::initialize_alignments() { 90 _space_alignment = HeapRegion::GrainBytes; 91 size_t card_table_alignment = CardTableRS::ct_max_alignment_constraint(); 92 size_t page_size = UseLargePages ? os::large_page_size() : os::vm_page_size(); 93 _heap_alignment = MAX3(card_table_alignment, _space_alignment, page_size); 94 } 95 96 void G1CollectorPolicy::initialize_flags() { 97 if (G1HeapRegionSize != HeapRegion::GrainBytes) { 98 FLAG_SET_ERGO(size_t, G1HeapRegionSize, HeapRegion::GrainBytes); 99 } 100 101 guarantee(SurvivorRatio >= 1, "Range checking for SurvivorRatio should guarantee that value is >= 1"); 102 103 CollectorPolicy::initialize_flags(); 104 } 105