hotspot/src/share/vm/memory/collectorPolicy.cpp
author ysr
Wed, 16 Mar 2011 10:37:08 -0700
changeset 8687 264727307495
parent 7419 263dd4e89b9d
child 9422 e3c824172b61
permissions -rw-r--r--
6896099: Integrate CMS heap ergo with default heap sizing ergo 6627787: CMS: JVM refuses to start up with -Xms16m -Xmx16m 7000125: CMS: Anti-monotone young gen sizing with respect to maximum whole heap size specification 7027529: CMS: retire CMSUseOldDefaults flag Summary: Simplify CMS heap sizing code, relying on ergonomic initial sizing consistent with other collectors for the most part, controlling only young gen sizing to rein in pause times. Make CMS young gen sizing default statically cpu-dependant. Remove inconsistencies wrt generation sizing and policy code, allowing for the fixing for 6627787 and 7000125. For 7027529, retire the flag CMSUseOldDefaults which had been introduced as a bridge from JDK 5 to JDK 6 a number of years ago. Reviewed-by: brutisso, poonam
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
8687
264727307495 6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents: 7419
diff changeset
     2
 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5343
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5343
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5343
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    26
#include "gc_implementation/shared/adaptiveSizePolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    27
#include "gc_implementation/shared/gcPolicyCounters.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    28
#include "gc_implementation/shared/vmGCOperations.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    29
#include "memory/cardTableRS.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    30
#include "memory/collectorPolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    31
#include "memory/gcLocker.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    32
#include "memory/genCollectedHeap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    33
#include "memory/generationSpec.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    34
#include "memory/space.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    35
#include "memory/universe.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    36
#include "runtime/arguments.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    37
#include "runtime/globals_extension.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    38
#include "runtime/handles.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    39
#include "runtime/java.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    40
#include "runtime/vmThread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    41
#ifdef TARGET_OS_FAMILY_linux
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    42
# include "thread_linux.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    43
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    44
#ifdef TARGET_OS_FAMILY_solaris
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    45
# include "thread_solaris.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    46
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    47
#ifdef TARGET_OS_FAMILY_windows
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    48
# include "thread_windows.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    49
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    50
#ifndef SERIALGC
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    51
#include "gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    52
#include "gc_implementation/concurrentMarkSweep/cmsGCAdaptivePolicyCounters.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    53
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
// CollectorPolicy methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
void CollectorPolicy::initialize_flags() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  if (PermSize > MaxPermSize) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
    MaxPermSize = PermSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 186
diff changeset
    61
  PermSize = MAX2(min_alignment(), align_size_down_(PermSize, min_alignment()));
6465
514cf4924008 6984368: Large default heap size does not allow to use zero based compressed oops
kvn
parents: 5547
diff changeset
    62
  // Don't increase Perm size limit above specified.
514cf4924008 6984368: Large default heap size does not allow to use zero based compressed oops
kvn
parents: 5547
diff changeset
    63
  MaxPermSize = align_size_down(MaxPermSize, max_alignment());
514cf4924008 6984368: Large default heap size does not allow to use zero based compressed oops
kvn
parents: 5547
diff changeset
    64
  if (PermSize > MaxPermSize) {
514cf4924008 6984368: Large default heap size does not allow to use zero based compressed oops
kvn
parents: 5547
diff changeset
    65
    PermSize = MaxPermSize;
514cf4924008 6984368: Large default heap size does not allow to use zero based compressed oops
kvn
parents: 5547
diff changeset
    66
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 186
diff changeset
    68
  MinPermHeapExpansion = MAX2(min_alignment(), align_size_down_(MinPermHeapExpansion, min_alignment()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 186
diff changeset
    69
  MaxPermHeapExpansion = MAX2(min_alignment(), align_size_down_(MaxPermHeapExpansion, min_alignment()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  MinHeapDeltaBytes = align_size_up(MinHeapDeltaBytes, min_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  SharedReadOnlySize = align_size_up(SharedReadOnlySize, max_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  SharedReadWriteSize = align_size_up(SharedReadWriteSize, max_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  SharedMiscDataSize = align_size_up(SharedMiscDataSize, max_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  assert(PermSize    % min_alignment() == 0, "permanent space alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  assert(MaxPermSize % max_alignment() == 0, "maximum permanent space alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  assert(SharedReadOnlySize % max_alignment() == 0, "read-only space alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  assert(SharedReadWriteSize % max_alignment() == 0, "read-write space alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  assert(SharedMiscDataSize % max_alignment() == 0, "misc-data space alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  if (PermSize < M) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
    vm_exit_during_initialization("Too small initial permanent heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
void CollectorPolicy::initialize_size_info() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  // User inputs from -mx and ms are aligned
4434
4b41e5b42f81 6887571: Increase default heap config sizes
phh
parents: 1388
diff changeset
    89
  set_initial_heap_byte_size(InitialHeapSize);
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
    90
  if (initial_heap_byte_size() == 0) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
    91
    set_initial_heap_byte_size(NewSize + OldSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 186
diff changeset
    93
  set_initial_heap_byte_size(align_size_up(_initial_heap_byte_size,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 186
diff changeset
    94
                                           min_alignment()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 186
diff changeset
    95
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 186
diff changeset
    96
  set_min_heap_byte_size(Arguments::min_heap_size());
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
    97
  if (min_heap_byte_size() == 0) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
    98
    set_min_heap_byte_size(NewSize + OldSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 186
diff changeset
   100
  set_min_heap_byte_size(align_size_up(_min_heap_byte_size,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 186
diff changeset
   101
                                       min_alignment()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 186
diff changeset
   102
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 186
diff changeset
   103
  set_max_heap_byte_size(align_size_up(MaxHeapSize, max_alignment()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  // Check heap parameter properties
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   106
  if (initial_heap_byte_size() < M) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
    vm_exit_during_initialization("Too small initial heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  // Check heap parameter properties
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   110
  if (min_heap_byte_size() < M) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
    vm_exit_during_initialization("Too small minimum heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  }
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   113
  if (initial_heap_byte_size() <= NewSize) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
     // make sure there is at least some room in old space
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
    vm_exit_during_initialization("Too small initial heap for new size specified");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  }
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   117
  if (max_heap_byte_size() < min_heap_byte_size()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
    vm_exit_during_initialization("Incompatible minimum and maximum heap sizes specified");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  }
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   120
  if (initial_heap_byte_size() < min_heap_byte_size()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
    vm_exit_during_initialization("Incompatible minimum and initial heap sizes specified");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  }
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   123
  if (max_heap_byte_size() < initial_heap_byte_size()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
    vm_exit_during_initialization("Incompatible initial and maximum heap sizes specified");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  }
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   126
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   127
  if (PrintGCDetails && Verbose) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   128
    gclog_or_tty->print_cr("Minimum heap " SIZE_FORMAT "  Initial heap "
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   129
      SIZE_FORMAT "  Maximum heap " SIZE_FORMAT,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   130
      min_heap_byte_size(), initial_heap_byte_size(), max_heap_byte_size());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   131
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
void CollectorPolicy::initialize_perm_generation(PermGen::Name pgnm) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  _permanent_generation =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
    new PermanentGenerationSpec(pgnm, PermSize, MaxPermSize,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
                                SharedReadOnlySize,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
                                SharedReadWriteSize,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
                                SharedMiscDataSize,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
                                SharedMiscCodeSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  if (_permanent_generation == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
    vm_exit_during_initialization("Unable to allocate gen spec");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   146
bool CollectorPolicy::use_should_clear_all_soft_refs(bool v) {
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   147
  bool result = _should_clear_all_soft_refs;
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   148
  set_should_clear_all_soft_refs(false);
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   149
  return result;
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   150
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
GenRemSet* CollectorPolicy::create_rem_set(MemRegion whole_heap,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
                                           int max_covered_regions) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  switch (rem_set_name()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  case GenRemSet::CardTable: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
    CardTableRS* res = new CardTableRS(whole_heap, max_covered_regions);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
    return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
    guarantee(false, "unrecognized GenRemSet::Name");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   165
void CollectorPolicy::cleared_all_soft_refs() {
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   166
  // If near gc overhear limit, continue to clear SoftRefs.  SoftRefs may
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   167
  // have been cleared in the last collection but if the gc overhear
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   168
  // limit continues to be near, SoftRefs should still be cleared.
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   169
  if (size_policy() != NULL) {
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   170
    _should_clear_all_soft_refs = size_policy()->gc_overhead_limit_near();
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   171
  }
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   172
  _all_soft_refs_clear = true;
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   173
}
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   174
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   175
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
// GenCollectorPolicy methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   178
size_t GenCollectorPolicy::scale_by_NewRatio_aligned(size_t base_size) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   179
  size_t x = base_size / (NewRatio+1);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   180
  size_t new_gen_size = x > min_alignment() ?
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   181
                     align_size_down(x, min_alignment()) :
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   182
                     min_alignment();
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   183
  return new_gen_size;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   184
}
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   185
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   186
size_t GenCollectorPolicy::bound_minus_alignment(size_t desired_size,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   187
                                                 size_t maximum_size) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   188
  size_t alignment = min_alignment();
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   189
  size_t max_minus = maximum_size - alignment;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   190
  return desired_size < max_minus ? desired_size : max_minus;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   191
}
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   192
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   193
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
void GenCollectorPolicy::initialize_size_policy(size_t init_eden_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
                                                size_t init_promo_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
                                                size_t init_survivor_size) {
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   197
  const double max_gc_minor_pause_sec = ((double) MaxGCMinorPauseMillis)/1000.0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  _size_policy = new AdaptiveSizePolicy(init_eden_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
                                        init_promo_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
                                        init_survivor_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
                                        max_gc_minor_pause_sec,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
                                        GCTimeRatio);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
size_t GenCollectorPolicy::compute_max_alignment() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  // The card marking array and the offset arrays for old generations are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  // committed in os pages as well. Make sure they are entirely full (to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  // avoid partial page problems), e.g. if 512 bytes heap corresponds to 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  // byte entry and the os page size is 4096, the maximum heap size should
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  // be 512*4096 = 2MB aligned.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  size_t alignment = GenRemSet::max_alignment_constraint(rem_set_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  // Parallel GC does its own alignment of the generations to avoid requiring a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  // large page (256M on some platforms) for the permanent generation.  The
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  // other collectors should also be updated to do their own alignment and then
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  // this use of lcm() should be removed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  if (UseLargePages && !UseParallelGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
      // in presence of large pages we have to make sure that our
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
      // alignment is large page aware
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
      alignment = lcm(os::large_page_size(), alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  return alignment;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
void GenCollectorPolicy::initialize_flags() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  // All sizes must be multiples of the generation granularity.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  set_min_alignment((uintx) Generation::GenGrain);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  set_max_alignment(compute_max_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  assert(max_alignment() >= min_alignment() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
         max_alignment() % min_alignment() == 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
         "invalid alignment constraints");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  CollectorPolicy::initialize_flags();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  // All generational heaps have a youngest gen; handle those flags here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  // Adjust max size parameters
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  if (NewSize > MaxNewSize) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
    MaxNewSize = NewSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  NewSize = align_size_down(NewSize, min_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  MaxNewSize = align_size_down(MaxNewSize, min_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  // Check validity of heap flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  assert(NewSize     % min_alignment() == 0, "eden space alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  assert(MaxNewSize  % min_alignment() == 0, "survivor space alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  if (NewSize < 3*min_alignment()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
     // make sure there room for eden and two survivor spaces
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
    vm_exit_during_initialization("Too small new size specified");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  if (SurvivorRatio < 1 || NewRatio < 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
    vm_exit_during_initialization("Invalid heap ratio specified");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
void TwoGenerationCollectorPolicy::initialize_flags() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  GenCollectorPolicy::initialize_flags();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  OldSize = align_size_down(OldSize, min_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  if (NewSize + OldSize > MaxHeapSize) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
    MaxHeapSize = NewSize + OldSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  MaxHeapSize = align_size_up(MaxHeapSize, max_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  always_do_update_barrier = UseConcMarkSweepGC;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  BlockOffsetArrayUseUnallocatedBlock =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
      BlockOffsetArrayUseUnallocatedBlock || ParallelGCThreads > 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  // Check validity of heap flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  assert(OldSize     % min_alignment() == 0, "old space alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  assert(MaxHeapSize % max_alignment() == 0, "maximum heap alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   276
// Values set on the command line win over any ergonomically
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   277
// set command line parameters.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   278
// Ergonomic choice of parameters are done before this
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   279
// method is called.  Values for command line parameters such as NewSize
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   280
// and MaxNewSize feed those ergonomic choices into this method.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   281
// This method makes the final generation sizings consistent with
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   282
// themselves and with overall heap sizings.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   283
// In the absence of explicitly set command line flags, policies
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   284
// such as the use of NewRatio are used to size the generation.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
void GenCollectorPolicy::initialize_size_info() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  CollectorPolicy::initialize_size_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   288
  // min_alignment() is used for alignment within a generation.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   289
  // There is additional alignment done down stream for some
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   290
  // collectors that sometimes causes unwanted rounding up of
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   291
  // generations sizes.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   292
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   293
  // Determine maximum size of gen0
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   294
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   295
  size_t max_new_size = 0;
8687
264727307495 6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents: 7419
diff changeset
   296
  if (FLAG_IS_CMDLINE(MaxNewSize) || FLAG_IS_ERGO(MaxNewSize)) {
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   297
    if (MaxNewSize < min_alignment()) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   298
      max_new_size = min_alignment();
8687
264727307495 6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents: 7419
diff changeset
   299
    }
264727307495 6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents: 7419
diff changeset
   300
    if (MaxNewSize >= max_heap_byte_size()) {
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   301
      max_new_size = align_size_down(max_heap_byte_size() - min_alignment(),
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   302
                                     min_alignment());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   303
      warning("MaxNewSize (" SIZE_FORMAT "k) is equal to or "
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   304
        "greater than the entire heap (" SIZE_FORMAT "k).  A "
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   305
        "new generation size of " SIZE_FORMAT "k will be used.",
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   306
        MaxNewSize/K, max_heap_byte_size()/K, max_new_size/K);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   307
    } else {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   308
      max_new_size = align_size_down(MaxNewSize, min_alignment());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   309
    }
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   310
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   311
  // The case for FLAG_IS_ERGO(MaxNewSize) could be treated
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   312
  // specially at this point to just use an ergonomically set
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   313
  // MaxNewSize to set max_new_size.  For cases with small
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   314
  // heaps such a policy often did not work because the MaxNewSize
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   315
  // was larger than the entire heap.  The interpretation given
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   316
  // to ergonomically set flags is that the flags are set
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   317
  // by different collectors for their own special needs but
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   318
  // are not allowed to badly shape the heap.  This allows the
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   319
  // different collectors to decide what's best for themselves
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   320
  // without having to factor in the overall heap shape.  It
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   321
  // can be the case in the future that the collectors would
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   322
  // only make "wise" ergonomics choices and this policy could
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   323
  // just accept those choices.  The choices currently made are
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   324
  // not always "wise".
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  } else {
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   326
    max_new_size = scale_by_NewRatio_aligned(max_heap_byte_size());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   327
    // Bound the maximum size by NewSize below (since it historically
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
    // would have been NewSize and because the NewRatio calculation could
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
    // yield a size that is too small) and bound it by MaxNewSize above.
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   330
    // Ergonomics plays here by previously calculating the desired
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   331
    // NewSize and MaxNewSize.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   332
    max_new_size = MIN2(MAX2(max_new_size, NewSize), MaxNewSize);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   333
  }
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   334
  assert(max_new_size > 0, "All paths should set max_new_size");
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   335
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   336
  // Given the maximum gen0 size, determine the initial and
8687
264727307495 6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents: 7419
diff changeset
   337
  // minimum gen0 sizes.
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   338
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   339
  if (max_heap_byte_size() == min_heap_byte_size()) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   340
    // The maximum and minimum heap sizes are the same so
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   341
    // the generations minimum and initial must be the
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   342
    // same as its maximum.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   343
    set_min_gen0_size(max_new_size);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   344
    set_initial_gen0_size(max_new_size);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   345
    set_max_gen0_size(max_new_size);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   346
  } else {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   347
    size_t desired_new_size = 0;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   348
    if (!FLAG_IS_DEFAULT(NewSize)) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   349
      // If NewSize is set ergonomically (for example by cms), it
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   350
      // would make sense to use it.  If it is used, also use it
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   351
      // to set the initial size.  Although there is no reason
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   352
      // the minimum size and the initial size have to be the same,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   353
      // the current implementation gets into trouble during the calculation
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   354
      // of the tenured generation sizes if they are different.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   355
      // Note that this makes the initial size and the minimum size
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   356
      // generally small compared to the NewRatio calculation.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   357
      _min_gen0_size = NewSize;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   358
      desired_new_size = NewSize;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   359
      max_new_size = MAX2(max_new_size, NewSize);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   360
    } else {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   361
      // For the case where NewSize is the default, use NewRatio
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   362
      // to size the minimum and initial generation sizes.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   363
      // Use the default NewSize as the floor for these values.  If
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   364
      // NewRatio is overly large, the resulting sizes can be too
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   365
      // small.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   366
      _min_gen0_size = MAX2(scale_by_NewRatio_aligned(min_heap_byte_size()),
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   367
                          NewSize);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   368
      desired_new_size =
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   369
        MAX2(scale_by_NewRatio_aligned(initial_heap_byte_size()),
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   370
             NewSize);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   371
    }
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   372
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   373
    assert(_min_gen0_size > 0, "Sanity check");
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   374
    set_initial_gen0_size(desired_new_size);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   375
    set_max_gen0_size(max_new_size);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   376
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   377
    // At this point the desirable initial and minimum sizes have been
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   378
    // determined without regard to the maximum sizes.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   379
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   380
    // Bound the sizes by the corresponding overall heap sizes.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   381
    set_min_gen0_size(
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   382
      bound_minus_alignment(_min_gen0_size, min_heap_byte_size()));
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   383
    set_initial_gen0_size(
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   384
      bound_minus_alignment(_initial_gen0_size, initial_heap_byte_size()));
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   385
    set_max_gen0_size(
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   386
      bound_minus_alignment(_max_gen0_size, max_heap_byte_size()));
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   387
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   388
    // At this point all three sizes have been checked against the
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   389
    // maximum sizes but have not been checked for consistency
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 186
diff changeset
   390
    // among the three.
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   391
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   392
    // Final check min <= initial <= max
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   393
    set_min_gen0_size(MIN2(_min_gen0_size, _max_gen0_size));
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   394
    set_initial_gen0_size(
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   395
      MAX2(MIN2(_initial_gen0_size, _max_gen0_size), _min_gen0_size));
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   396
    set_min_gen0_size(MIN2(_min_gen0_size, _initial_gen0_size));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   399
  if (PrintGCDetails && Verbose) {
8687
264727307495 6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents: 7419
diff changeset
   400
    gclog_or_tty->print_cr("1: Minimum gen0 " SIZE_FORMAT "  Initial gen0 "
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   401
      SIZE_FORMAT "  Maximum gen0 " SIZE_FORMAT,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   402
      min_gen0_size(), initial_gen0_size(), max_gen0_size());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   403
  }
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   404
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   406
// Call this method during the sizing of the gen1 to make
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   407
// adjustments to gen0 because of gen1 sizing policy.  gen0 initially has
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   408
// the most freedom in sizing because it is done before the
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   409
// policy for gen1 is applied.  Once gen1 policies have been applied,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   410
// there may be conflicts in the shape of the heap and this method
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   411
// is used to make the needed adjustments.  The application of the
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   412
// policies could be more sophisticated (iterative for example) but
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   413
// keeping it simple also seems a worthwhile goal.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   414
bool TwoGenerationCollectorPolicy::adjust_gen0_sizes(size_t* gen0_size_ptr,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   415
                                                     size_t* gen1_size_ptr,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   416
                                                     size_t heap_size,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   417
                                                     size_t min_gen0_size) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   418
  bool result = false;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   419
  if ((*gen1_size_ptr + *gen0_size_ptr) > heap_size) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   420
    if (((*gen0_size_ptr + OldSize) > heap_size) &&
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   421
       (heap_size - min_gen0_size) >= min_alignment()) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   422
      // Adjust gen0 down to accomodate OldSize
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   423
      *gen0_size_ptr = heap_size - min_gen0_size;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   424
      *gen0_size_ptr =
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   425
        MAX2((uintx)align_size_down(*gen0_size_ptr, min_alignment()),
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   426
             min_alignment());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   427
      assert(*gen0_size_ptr > 0, "Min gen0 is too large");
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   428
      result = true;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   429
    } else {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   430
      *gen1_size_ptr = heap_size - *gen0_size_ptr;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   431
      *gen1_size_ptr =
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   432
        MAX2((uintx)align_size_down(*gen1_size_ptr, min_alignment()),
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   433
                       min_alignment());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   434
    }
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   435
  }
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   436
  return result;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   437
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   439
// Minimum sizes of the generations may be different than
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   440
// the initial sizes.  An inconsistently is permitted here
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   441
// in the total size that can be specified explicitly by
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   442
// command line specification of OldSize and NewSize and
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   443
// also a command line specification of -Xms.  Issue a warning
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   444
// but allow the values to pass.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
void TwoGenerationCollectorPolicy::initialize_size_info() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  GenCollectorPolicy::initialize_size_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   449
  // At this point the minimum, initial and maximum sizes
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   450
  // of the overall heap and of gen0 have been determined.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   451
  // The maximum gen1 size can be determined from the maximum gen0
8687
264727307495 6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents: 7419
diff changeset
   452
  // and maximum heap size since no explicit flags exits
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   453
  // for setting the gen1 maximum.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   454
  _max_gen1_size = max_heap_byte_size() - _max_gen0_size;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   455
  _max_gen1_size =
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   456
    MAX2((uintx)align_size_down(_max_gen1_size, min_alignment()),
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   457
         min_alignment());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   458
  // If no explicit command line flag has been set for the
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   459
  // gen1 size, use what is left for gen1.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   460
  if (FLAG_IS_DEFAULT(OldSize) || FLAG_IS_ERGO(OldSize)) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   461
    // The user has not specified any value or ergonomics
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   462
    // has chosen a value (which may or may not be consistent
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   463
    // with the overall heap size).  In either case make
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   464
    // the minimum, maximum and initial sizes consistent
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   465
    // with the gen0 sizes and the overall heap sizes.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   466
    assert(min_heap_byte_size() > _min_gen0_size,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   467
      "gen0 has an unexpected minimum size");
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   468
    set_min_gen1_size(min_heap_byte_size() - min_gen0_size());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   469
    set_min_gen1_size(
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   470
      MAX2((uintx)align_size_down(_min_gen1_size, min_alignment()),
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   471
           min_alignment()));
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   472
    set_initial_gen1_size(initial_heap_byte_size() - initial_gen0_size());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   473
    set_initial_gen1_size(
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   474
      MAX2((uintx)align_size_down(_initial_gen1_size, min_alignment()),
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   475
           min_alignment()));
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   476
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   477
  } else {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   478
    // It's been explicitly set on the command line.  Use the
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   479
    // OldSize and then determine the consequences.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   480
    set_min_gen1_size(OldSize);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   481
    set_initial_gen1_size(OldSize);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   482
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   483
    // If the user has explicitly set an OldSize that is inconsistent
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   484
    // with other command line flags, issue a warning.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
    // The generation minimums and the overall heap mimimum should
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
    // be within one heap alignment.
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   487
    if ((_min_gen1_size + _min_gen0_size + min_alignment()) <
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   488
           min_heap_byte_size()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
      warning("Inconsistency between minimum heap size and minimum "
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   490
          "generation sizes: using minimum heap = " SIZE_FORMAT,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   491
          min_heap_byte_size());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   492
    }
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   493
    if ((OldSize > _max_gen1_size)) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   494
      warning("Inconsistency between maximum heap size and maximum "
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   495
          "generation sizes: using maximum heap = " SIZE_FORMAT
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   496
          " -XX:OldSize flag is being ignored",
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   497
          max_heap_byte_size());
8687
264727307495 6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents: 7419
diff changeset
   498
    }
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   499
    // If there is an inconsistency between the OldSize and the minimum and/or
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   500
    // initial size of gen0, since OldSize was explicitly set, OldSize wins.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   501
    if (adjust_gen0_sizes(&_min_gen0_size, &_min_gen1_size,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   502
                          min_heap_byte_size(), OldSize)) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   503
      if (PrintGCDetails && Verbose) {
8687
264727307495 6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents: 7419
diff changeset
   504
        gclog_or_tty->print_cr("2: Minimum gen0 " SIZE_FORMAT "  Initial gen0 "
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   505
              SIZE_FORMAT "  Maximum gen0 " SIZE_FORMAT,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   506
              min_gen0_size(), initial_gen0_size(), max_gen0_size());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   507
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
    }
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   509
    // Initial size
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   510
    if (adjust_gen0_sizes(&_initial_gen0_size, &_initial_gen1_size,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   511
                         initial_heap_byte_size(), OldSize)) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   512
      if (PrintGCDetails && Verbose) {
8687
264727307495 6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents: 7419
diff changeset
   513
        gclog_or_tty->print_cr("3: Minimum gen0 " SIZE_FORMAT "  Initial gen0 "
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   514
          SIZE_FORMAT "  Maximum gen0 " SIZE_FORMAT,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   515
          min_gen0_size(), initial_gen0_size(), max_gen0_size());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   516
      }
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   517
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
  }
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   519
  // Enforce the maximum gen1 size.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   520
  set_min_gen1_size(MIN2(_min_gen1_size, _max_gen1_size));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   522
  // Check that min gen1 <= initial gen1 <= max gen1
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   523
  set_initial_gen1_size(MAX2(_initial_gen1_size, _min_gen1_size));
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   524
  set_initial_gen1_size(MIN2(_initial_gen1_size, _max_gen1_size));
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   525
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   526
  if (PrintGCDetails && Verbose) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   527
    gclog_or_tty->print_cr("Minimum gen1 " SIZE_FORMAT "  Initial gen1 "
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   528
      SIZE_FORMAT "  Maximum gen1 " SIZE_FORMAT,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   529
      min_gen1_size(), initial_gen1_size(), max_gen1_size());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   530
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
HeapWord* GenCollectorPolicy::mem_allocate_work(size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
                                        bool is_tlab,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
                                        bool* gc_overhead_limit_was_exceeded) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  GenCollectedHeap *gch = GenCollectedHeap::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  debug_only(gch->check_for_valid_allocation_state());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  assert(gch->no_gc_in_progress(), "Allocation during gc not allowed");
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   540
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   541
  // In general gc_overhead_limit_was_exceeded should be false so
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   542
  // set it so here and reset it to true only if the gc time
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   543
  // limit is being exceeded as checked below.
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   544
  *gc_overhead_limit_was_exceeded = false;
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   545
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  HeapWord* result = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  // Loop until the allocation is satisified,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  // or unsatisfied after GC.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  for (int try_count = 1; /* return or throw */; try_count += 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
    HandleMark hm; // discard any handles allocated in each iteration
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
    // First allocation attempt is lock-free.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
    Generation *gen0 = gch->get_gen(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
    assert(gen0->supports_inline_contig_alloc(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
      "Otherwise, must do alloc within heap lock");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
    if (gen0->should_allocate(size, is_tlab)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
      result = gen0->par_allocate(size, is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
      if (result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
        assert(gch->is_in_reserved(result), "result not in heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
        return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
    unsigned int gc_count_before;  // read inside the Heap_lock locked region
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
      MutexLocker ml(Heap_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
      if (PrintGC && Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
        gclog_or_tty->print_cr("TwoGenerationCollectorPolicy::mem_allocate_work:"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
                      " attempting locked slow path allocation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
      // Note that only large objects get a shot at being
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
      // allocated in later generations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
      bool first_only = ! should_try_older_generation_allocation(size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
      result = gch->attempt_allocation(size, is_tlab, first_only);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
      if (result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
        assert(gch->is_in_reserved(result), "result not in heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
        return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
      if (GC_locker::is_active_and_needs_gc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
        if (is_tlab) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
          return NULL;  // Caller will retry allocating individual object
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
        if (!gch->is_maximal_no_gc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
          // Try and expand heap to satisfy request
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
          result = expand_heap_and_allocate(size, is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
          // result could be null if we are out of space
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
          if (result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
            return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
        // If this thread is not in a jni critical section, we stall
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
        // the requestor until the critical section has cleared and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
        // GC allowed. When the critical section clears, a GC is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
        // initiated by the last thread exiting the critical section; so
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
        // we retry the allocation sequence from the beginning of the loop,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
        // rather than causing more, now probably unnecessary, GC attempts.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
        JavaThread* jthr = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
        if (!jthr->in_critical()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
          MutexUnlocker mul(Heap_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
          // Wait for JNI critical section to be exited
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
          GC_locker::stall_until_clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
          continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
          if (CheckJNICalls) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
            fatal("Possible deadlock due to allocating while"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
                  " in jni critical section");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
          return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
      // Read the gc count while the heap lock is held.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
      gc_count_before = Universe::heap()->total_collections();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
    VM_GenCollectForAllocation op(size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
                                  is_tlab,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
                                  gc_count_before);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
    VMThread::execute(&op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
    if (op.prologue_succeeded()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
      result = op.result();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
      if (op.gc_locked()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
         assert(result == NULL, "must be NULL if gc_locked() is true");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
         continue;  // retry and/or stall as necessary
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
      }
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   629
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   630
      // Allocation has failed and a collection
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   631
      // has been done.  If the gc time limit was exceeded the
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   632
      // this time, return NULL so that an out-of-memory
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   633
      // will be thrown.  Clear gc_overhead_limit_exceeded
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   634
      // so that the overhead exceeded does not persist.
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   635
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   636
      const bool limit_exceeded = size_policy()->gc_overhead_limit_exceeded();
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   637
      const bool softrefs_clear = all_soft_refs_clear();
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   638
      assert(!limit_exceeded || softrefs_clear, "Should have been cleared");
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   639
      if (limit_exceeded && softrefs_clear) {
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   640
        *gc_overhead_limit_was_exceeded = true;
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   641
        size_policy()->set_gc_overhead_limit_exceeded(false);
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   642
        if (op.result() != NULL) {
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   643
          CollectedHeap::fill_with_object(op.result(), size);
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   644
        }
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   645
        return NULL;
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   646
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
      assert(result == NULL || gch->is_in_reserved(result),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
             "result not in heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
      return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
    // Give a warning if we seem to be looping forever.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
    if ((QueuedAllocationWarningCount > 0) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
        (try_count % QueuedAllocationWarningCount == 0)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
          warning("TwoGenerationCollectorPolicy::mem_allocate_work retries %d times \n\t"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
                  " size=%d %s", try_count, size, is_tlab ? "(TLAB)" : "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
HeapWord* GenCollectorPolicy::expand_heap_and_allocate(size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
                                                       bool   is_tlab) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
  GenCollectedHeap *gch = GenCollectedHeap::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
  HeapWord* result = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
  for (int i = number_of_generations() - 1; i >= 0 && result == NULL; i--) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
    Generation *gen = gch->get_gen(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
    if (gen->should_allocate(size, is_tlab)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
      result = gen->expand_and_allocate(size, is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
  assert(result == NULL || gch->is_in_reserved(result), "result not in heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
HeapWord* GenCollectorPolicy::satisfy_failed_allocation(size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
                                                        bool   is_tlab) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
  GenCollectedHeap *gch = GenCollectedHeap::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
  GCCauseSetter x(gch, GCCause::_allocation_failure);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
  HeapWord* result = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
  assert(size != 0, "Precondition violated");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
  if (GC_locker::is_active_and_needs_gc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
    // GC locker is active; instead of a collection we will attempt
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
    // to expand the heap, if there's room for expansion.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
    if (!gch->is_maximal_no_gc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
      result = expand_heap_and_allocate(size, is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
    return result;   // could be null if we are out of space
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   689
  } else if (!gch->incremental_collection_will_fail(false /* don't consult_young */)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
    // Do an incremental collection.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
    gch->do_collection(false            /* full */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
                       false            /* clear_all_soft_refs */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
                       size             /* size */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
                       is_tlab          /* is_tlab */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
                       number_of_generations() - 1 /* max_level */);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
  } else {
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   697
    if (Verbose && PrintGCDetails) {
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   698
      gclog_or_tty->print(" :: Trying full because partial may fail :: ");
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   699
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
    // Try a full collection; see delta for bug id 6266275
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
    // for the original code and why this has been simplified
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
    // with from-space allocation criteria modified and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
    // such allocation moved out of the safepoint path.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
    gch->do_collection(true             /* full */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
                       false            /* clear_all_soft_refs */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
                       size             /* size */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
                       is_tlab          /* is_tlab */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
                       number_of_generations() - 1 /* max_level */);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
  result = gch->attempt_allocation(size, is_tlab, false /*first_only*/);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
  if (result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
    assert(gch->is_in_reserved(result), "result not in heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
    return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
  // OK, collection failed, try expansion.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
  result = expand_heap_and_allocate(size, is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
  if (result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
    return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
  // If we reach this point, we're really out of memory. Try every trick
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
  // we can to reclaim memory. Force collection of soft references. Force
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
  // a complete compaction of the heap. Any additional methods for finding
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
  // free memory should be here, especially if they are expensive. If this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
  // attempt fails, an OOM exception will be thrown.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
    IntFlagSetting flag_change(MarkSweepAlwaysCompactCount, 1); // Make sure the heap is fully compacted
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
    gch->do_collection(true             /* full */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
                       true             /* clear_all_soft_refs */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
                       size             /* size */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
                       is_tlab          /* is_tlab */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
                       number_of_generations() - 1 /* max_level */);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
  result = gch->attempt_allocation(size, is_tlab, false /* first_only */);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
  if (result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
    assert(gch->is_in_reserved(result), "result not in heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
    return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   745
  assert(!should_clear_all_soft_refs(),
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   746
    "Flag should have been handled and cleared prior to this point");
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   747
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
  // What else?  We might try synchronous finalization later.  If the total
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
  // space available is large enough for the allocation, then a more
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
  // complete compaction phase than we've tried so far might be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
  // appropriate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
size_t GenCollectorPolicy::large_typearray_limit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
  return FastAllocateSizeLimit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
// Return true if any of the following is true:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
// . the allocation won't fit into the current young gen heap
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
// . gc locker is occupied (jni critical section)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
// . heap memory is tight -- the most recent previous collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
//   was a full collection because a partial collection (would
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
//   have) failed and is likely to fail again
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
bool GenCollectorPolicy::should_try_older_generation_allocation(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
        size_t word_size) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
  GenCollectedHeap* gch = GenCollectedHeap::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  size_t gen0_capacity = gch->get_gen(0)->capacity_before_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
  return    (word_size > heap_word_size(gen0_capacity))
6985
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6465
diff changeset
   770
         || GC_locker::is_active_and_needs_gc()
e9364ec299ac 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 6465
diff changeset
   771
         || gch->incremental_collection_failed();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
// MarkSweepPolicy methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
MarkSweepPolicy::MarkSweepPolicy() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
  initialize_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
void MarkSweepPolicy::initialize_generations() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
  initialize_perm_generation(PermGen::MarkSweepCompact);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
  _generations = new GenerationSpecPtr[number_of_generations()];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
  if (_generations == NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
    vm_exit_during_initialization("Unable to allocate gen spec");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
  if (UseParNewGC && ParallelGCThreads > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
    _generations[0] = new GenerationSpec(Generation::ParNew, _initial_gen0_size, _max_gen0_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
    _generations[0] = new GenerationSpec(Generation::DefNew, _initial_gen0_size, _max_gen0_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
  _generations[1] = new GenerationSpec(Generation::MarkSweepCompact, _initial_gen1_size, _max_gen1_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
  if (_generations[0] == NULL || _generations[1] == NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
    vm_exit_during_initialization("Unable to allocate gen spec");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
void MarkSweepPolicy::initialize_gc_policy_counters() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
  // initialize the policy counters - 2 collectors, 3 generations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
  if (UseParNewGC && ParallelGCThreads > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
    _gc_policy_counters = new GCPolicyCounters("ParNew:MSC", 2, 3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
  else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
    _gc_policy_counters = new GCPolicyCounters("Copy:MSC", 2, 3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
}