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