hotspot/src/share/vm/memory/collectorPolicy.cpp
author tschatzl
Mon, 06 May 2013 17:19:42 +0200
changeset 17322 35c488005999
parent 17320 e7e94e2542e4
child 17389 25ba661e4352
child 17376 4ee999c3c007
permissions -rw-r--r--
8006088: Incompatible heap size flags accepted by VM Summary: Make processing of minimum, initial and maximum heap size more intiutive by removing previous limitations on allowed values, and make error reporting consistent. Further, fix errors in ergonomic heap sizing. Reviewed-by: johnc, jwilhelm, tamao
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
15494
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
     2
 * Copyright (c) 2001, 2013, 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"
14583
d70ee55535f4 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 14291
diff changeset
    40
#include "runtime/thread.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    41
#include "runtime/vmThread.hpp"
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15091
diff changeset
    42
#include "utilities/macros.hpp"
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15091
diff changeset
    43
#if INCLUDE_ALL_GCS
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    44
#include "gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6985
diff changeset
    45
#include "gc_implementation/concurrentMarkSweep/cmsGCAdaptivePolicyCounters.hpp"
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 15091
diff changeset
    46
#endif // INCLUDE_ALL_GCS
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
// CollectorPolicy methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
void CollectorPolicy::initialize_flags() {
17320
e7e94e2542e4 8013791: G1: G1CollectorPolicy::initialize_flags() may set min_alignment > max_alignment
brutisso
parents: 17031
diff changeset
    51
  assert(max_alignment() >= min_alignment(),
e7e94e2542e4 8013791: G1: G1CollectorPolicy::initialize_flags() may set min_alignment > max_alignment
brutisso
parents: 17031
diff changeset
    52
      err_msg("max_alignment: " SIZE_FORMAT " less than min_alignment: " SIZE_FORMAT,
e7e94e2542e4 8013791: G1: G1CollectorPolicy::initialize_flags() may set min_alignment > max_alignment
brutisso
parents: 17031
diff changeset
    53
          max_alignment(), min_alignment()));
e7e94e2542e4 8013791: G1: G1CollectorPolicy::initialize_flags() may set min_alignment > max_alignment
brutisso
parents: 17031
diff changeset
    54
  assert(max_alignment() % min_alignment() == 0,
e7e94e2542e4 8013791: G1: G1CollectorPolicy::initialize_flags() may set min_alignment > max_alignment
brutisso
parents: 17031
diff changeset
    55
      err_msg("max_alignment: " SIZE_FORMAT " not aligned by min_alignment: " SIZE_FORMAT,
e7e94e2542e4 8013791: G1: G1CollectorPolicy::initialize_flags() may set min_alignment > max_alignment
brutisso
parents: 17031
diff changeset
    56
          max_alignment(), min_alignment()));
e7e94e2542e4 8013791: G1: G1CollectorPolicy::initialize_flags() may set min_alignment > max_alignment
brutisso
parents: 17031
diff changeset
    57
17322
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
    58
  if (MaxHeapSize < InitialHeapSize) {
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
    59
    vm_exit_during_initialization("Incompatible initial and maximum heap sizes specified");
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
    60
  }
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
    61
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
    62
  if (MetaspaceSize > MaxMetaspaceSize) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
    63
    MaxMetaspaceSize = MetaspaceSize;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
    65
  MetaspaceSize = MAX2(min_alignment(), align_size_down_(MetaspaceSize, min_alignment()));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
    66
  // Don't increase Metaspace size limit above specified.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
    67
  MaxMetaspaceSize = align_size_down(MaxMetaspaceSize, max_alignment());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
    68
  if (MetaspaceSize > MaxMetaspaceSize) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
    69
    MetaspaceSize = MaxMetaspaceSize;
6465
514cf4924008 6984368: Large default heap size does not allow to use zero based compressed oops
kvn
parents: 5547
diff changeset
    70
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
    72
  MinMetaspaceExpansion = MAX2(min_alignment(), align_size_down_(MinMetaspaceExpansion, min_alignment()));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
    73
  MaxMetaspaceExpansion = MAX2(min_alignment(), align_size_down_(MaxMetaspaceExpansion, min_alignment()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  MinHeapDeltaBytes = align_size_up(MinHeapDeltaBytes, min_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
    77
  assert(MetaspaceSize    % min_alignment() == 0, "metapace alignment");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
    78
  assert(MaxMetaspaceSize % max_alignment() == 0, "maximum metaspace alignment");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
    79
  if (MetaspaceSize < 256*K) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
    80
    vm_exit_during_initialization("Too small initial Metaspace size");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
void CollectorPolicy::initialize_size_info() {
17322
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
    85
  // User inputs from -mx and ms must be aligned
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
    86
  set_min_heap_byte_size(align_size_up(Arguments::min_heap_size(), min_alignment()));
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
    87
  set_initial_heap_byte_size(align_size_up(InitialHeapSize, min_alignment()));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 186
diff changeset
    88
  set_max_heap_byte_size(align_size_up(MaxHeapSize, max_alignment()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  // Check heap parameter properties
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
    91
  if (initial_heap_byte_size() < M) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
    vm_exit_during_initialization("Too small initial heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  // Check heap parameter properties
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
    95
  if (min_heap_byte_size() < M) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
    vm_exit_during_initialization("Too small minimum heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  }
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
    98
  if (initial_heap_byte_size() <= NewSize) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
     // make sure there is at least some room in old space
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
    vm_exit_during_initialization("Too small initial heap for new size specified");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  }
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   102
  if (max_heap_byte_size() < min_heap_byte_size()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
    vm_exit_during_initialization("Incompatible minimum and maximum heap sizes specified");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  }
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   105
  if (initial_heap_byte_size() < min_heap_byte_size()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
    vm_exit_during_initialization("Incompatible minimum and initial heap sizes specified");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  }
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   108
  if (max_heap_byte_size() < initial_heap_byte_size()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
    vm_exit_during_initialization("Incompatible initial and maximum heap sizes specified");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  }
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   111
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   112
  if (PrintGCDetails && Verbose) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   113
    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
   114
      SIZE_FORMAT "  Maximum heap " SIZE_FORMAT,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   115
      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
   116
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   119
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
   120
  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
   121
  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
   122
  return result;
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   123
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
GenRemSet* CollectorPolicy::create_rem_set(MemRegion whole_heap,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
                                           int max_covered_regions) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  switch (rem_set_name()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  case GenRemSet::CardTable: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
    CardTableRS* res = new CardTableRS(whole_heap, max_covered_regions);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
    return res;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
    guarantee(false, "unrecognized GenRemSet::Name");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   138
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
   139
  // 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
   140
  // 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
   141
  // 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
   142
  if (size_policy() != NULL) {
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   143
    _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
   144
  }
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   145
  _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
   146
}
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   147
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   148
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
// GenCollectorPolicy methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   151
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
   152
  size_t x = base_size / (NewRatio+1);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   153
  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
   154
                     align_size_down(x, min_alignment()) :
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   155
                     min_alignment();
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   156
  return new_gen_size;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   157
}
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   158
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   159
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
   160
                                                 size_t maximum_size) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   161
  size_t alignment = min_alignment();
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   162
  size_t max_minus = maximum_size - alignment;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   163
  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
   164
}
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   165
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   166
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
void GenCollectorPolicy::initialize_size_policy(size_t init_eden_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
                                                size_t init_promo_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
                                                size_t init_survivor_size) {
15748
66d805061d7a 8007764: Wrong initialized value of max_gc_pause_sec for an instance of class AdaptiveSizePolicy
tamao
parents: 15497
diff changeset
   170
  const double max_gc_pause_sec = ((double) MaxGCPauseMillis)/1000.0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  _size_policy = new AdaptiveSizePolicy(init_eden_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
                                        init_promo_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
                                        init_survivor_size,
15748
66d805061d7a 8007764: Wrong initialized value of max_gc_pause_sec for an instance of class AdaptiveSizePolicy
tamao
parents: 15497
diff changeset
   174
                                        max_gc_pause_sec,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
                                        GCTimeRatio);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
size_t GenCollectorPolicy::compute_max_alignment() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  // The card marking array and the offset arrays for old generations are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  // committed in os pages as well. Make sure they are entirely full (to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  // avoid partial page problems), e.g. if 512 bytes heap corresponds to 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  // byte entry and the os page size is 4096, the maximum heap size should
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  // be 512*4096 = 2MB aligned.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  size_t alignment = GenRemSet::max_alignment_constraint(rem_set_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  // Parallel GC does its own alignment of the generations to avoid requiring a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  // large page (256M on some platforms) for the permanent generation.  The
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  // other collectors should also be updated to do their own alignment and then
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  // this use of lcm() should be removed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  if (UseLargePages && !UseParallelGC) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
      // in presence of large pages we have to make sure that our
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
      // alignment is large page aware
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
      alignment = lcm(os::large_page_size(), alignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  return alignment;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
void GenCollectorPolicy::initialize_flags() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  // All sizes must be multiples of the generation granularity.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  set_min_alignment((uintx) Generation::GenGrain);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  set_max_alignment(compute_max_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  CollectorPolicy::initialize_flags();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  // All generational heaps have a youngest gen; handle those flags here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  // Adjust max size parameters
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  if (NewSize > MaxNewSize) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
    MaxNewSize = NewSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  NewSize = align_size_down(NewSize, min_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  MaxNewSize = align_size_down(MaxNewSize, min_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  // Check validity of heap flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  assert(NewSize     % min_alignment() == 0, "eden space alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  assert(MaxNewSize  % min_alignment() == 0, "survivor space alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  if (NewSize < 3*min_alignment()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
     // make sure there room for eden and two survivor spaces
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
    vm_exit_during_initialization("Too small new size specified");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  if (SurvivorRatio < 1 || NewRatio < 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
    vm_exit_during_initialization("Invalid heap ratio specified");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
void TwoGenerationCollectorPolicy::initialize_flags() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  GenCollectorPolicy::initialize_flags();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  OldSize = align_size_down(OldSize, min_alignment());
15494
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   232
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   233
  if (FLAG_IS_CMDLINE(OldSize) && FLAG_IS_DEFAULT(NewSize)) {
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   234
    // NewRatio will be used later to set the young generation size so we use
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   235
    // it to calculate how big the heap should be based on the requested OldSize
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   236
    // and NewRatio.
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   237
    assert(NewRatio > 0, "NewRatio should have been set up earlier");
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   238
    size_t calculated_heapsize = (OldSize / NewRatio) * (NewRatio + 1);
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   239
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   240
    calculated_heapsize = align_size_up(calculated_heapsize, max_alignment());
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   241
    MaxHeapSize = calculated_heapsize;
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   242
    InitialHeapSize = calculated_heapsize;
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   243
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  MaxHeapSize = align_size_up(MaxHeapSize, max_alignment());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
17322
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   246
  // adjust max heap size if necessary
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   247
  if (NewSize + OldSize > MaxHeapSize) {
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   248
    if (FLAG_IS_CMDLINE(MaxHeapSize)) {
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   249
      // somebody set a maximum heap size with the intention that we should not
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   250
      // exceed it. Adjust New/OldSize as necessary.
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   251
      uintx calculated_size = NewSize + OldSize;
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   252
      double shrink_factor = (double) MaxHeapSize / calculated_size;
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   253
      // align
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   254
      NewSize = align_size_down((uintx) (NewSize * shrink_factor), min_alignment());
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   255
      // OldSize is already aligned because above we aligned MaxHeapSize to
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   256
      // max_alignment(), and we just made sure that NewSize is aligned to
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   257
      // min_alignment(). In initialize_flags() we verified that max_alignment()
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   258
      // is a multiple of min_alignment().
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   259
      OldSize = MaxHeapSize - NewSize;
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   260
    } else {
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   261
      MaxHeapSize = NewSize + OldSize;
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   262
    }
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   263
  }
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   264
  // need to do this again
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   265
  MaxHeapSize = align_size_up(MaxHeapSize, max_alignment());
35c488005999 8006088: Incompatible heap size flags accepted by VM
tschatzl
parents: 17320
diff changeset
   266
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  always_do_update_barrier = UseConcMarkSweepGC;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  // Check validity of heap flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  assert(OldSize     % min_alignment() == 0, "old space alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  assert(MaxHeapSize % max_alignment() == 0, "maximum heap alignment");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   274
// 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
   275
// set command line parameters.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   276
// 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
   277
// 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
   278
// 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
   279
// 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
   280
// themselves and with overall heap sizings.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   281
// 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
   282
// such as the use of NewRatio are used to size the generation.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
void GenCollectorPolicy::initialize_size_info() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  CollectorPolicy::initialize_size_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   286
  // 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
   287
  // 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
   288
  // 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
   289
  // generations sizes.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   290
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   291
  // Determine maximum size of gen0
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
  size_t max_new_size = 0;
8687
264727307495 6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents: 7419
diff changeset
   294
  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
   295
    if (MaxNewSize < min_alignment()) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   296
      max_new_size = min_alignment();
8687
264727307495 6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents: 7419
diff changeset
   297
    }
264727307495 6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents: 7419
diff changeset
   298
    if (MaxNewSize >= max_heap_byte_size()) {
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   299
      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
   300
                                     min_alignment());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   301
      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
   302
        "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
   303
        "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
   304
        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
   305
    } else {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   306
      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
   307
    }
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   308
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   309
  // 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
   310
  // 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
   311
  // 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
   312
  // 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
   313
  // 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
   314
  // 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
   315
  // 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
   316
  // 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
   317
  // 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
   318
  // 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
   319
  // 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
   320
  // 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
   321
  // 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
   322
  // not always "wise".
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  } else {
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   324
    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
   325
    // Bound the maximum size by NewSize below (since it historically
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    // would have been NewSize and because the NewRatio calculation could
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
    // 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
   328
    // 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
   329
    // NewSize and MaxNewSize.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   330
    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
   331
  }
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   332
  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
   333
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   334
  // 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
   335
  // minimum gen0 sizes.
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   336
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   337
  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
   338
    // 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
   339
    // 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
   340
    // same as its maximum.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   341
    set_min_gen0_size(max_new_size);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   342
    set_initial_gen0_size(max_new_size);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   343
    set_max_gen0_size(max_new_size);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   344
  } else {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   345
    size_t desired_new_size = 0;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   346
    if (!FLAG_IS_DEFAULT(NewSize)) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   347
      // 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
   348
      // 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
   349
      // 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
   350
      // 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
   351
      // 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
   352
      // 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
   353
      // 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
   354
      // generally small compared to the NewRatio calculation.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   355
      _min_gen0_size = NewSize;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   356
      desired_new_size = NewSize;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   357
      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
   358
    } else {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   359
      // 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
   360
      // 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
   361
      // 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
   362
      // 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
   363
      // small.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   364
      _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
   365
                          NewSize);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   366
      desired_new_size =
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   367
        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
   368
             NewSize);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   369
    }
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   370
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   371
    assert(_min_gen0_size > 0, "Sanity check");
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   372
    set_initial_gen0_size(desired_new_size);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   373
    set_max_gen0_size(max_new_size);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   374
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   375
    // 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
   376
    // determined without regard to the maximum sizes.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   377
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   378
    // 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
   379
    set_min_gen0_size(
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   380
      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
   381
    set_initial_gen0_size(
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   382
      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
   383
    set_max_gen0_size(
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   384
      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
   385
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   386
    // 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
   387
    // maximum sizes but have not been checked for consistency
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 186
diff changeset
   388
    // among the three.
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   389
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   390
    // Final check min <= initial <= max
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   391
    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
   392
    set_initial_gen0_size(
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   393
      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
   394
    set_min_gen0_size(MIN2(_min_gen0_size, _initial_gen0_size));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   397
  if (PrintGCDetails && Verbose) {
8687
264727307495 6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents: 7419
diff changeset
   398
    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
   399
      SIZE_FORMAT "  Maximum gen0 " SIZE_FORMAT,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   400
      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
   401
  }
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   402
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   404
// 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
   405
// 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
   406
// 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
   407
// 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
   408
// 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
   409
// 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
   410
// 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
   411
// 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
   412
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
   413
                                                     size_t* gen1_size_ptr,
15494
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   414
                                                     const size_t heap_size,
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   415
                                                     const size_t min_gen1_size) {
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   416
  bool result = false;
15494
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   417
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   418
  if ((*gen1_size_ptr + *gen0_size_ptr) > heap_size) {
15494
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   419
    if ((heap_size < (*gen0_size_ptr + min_gen1_size)) &&
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   420
        (heap_size >= min_gen1_size + min_alignment())) {
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   421
      // Adjust gen0 down to accommodate min_gen1_size
b3a322a0bea5 6348447: Specifying -XX:OldSize crashes 64-bit VMs
jwilhelm
parents: 15091
diff changeset
   422
      *gen0_size_ptr = heap_size - min_gen1_size;
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   423
      *gen0_size_ptr =
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   424
        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
   425
             min_alignment());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   426
      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
   427
      result = true;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   428
    } else {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   429
      *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
   430
      *gen1_size_ptr =
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   431
        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
   432
                       min_alignment());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   433
    }
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
  return result;
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   436
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   438
// 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
   439
// 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
   440
// 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
   441
// 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
   442
// 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
   443
// but allow the values to pass.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
void TwoGenerationCollectorPolicy::initialize_size_info() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  GenCollectorPolicy::initialize_size_info();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   448
  // 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
   449
  // 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
   450
  // 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
   451
  // 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
   452
  // for setting the gen1 maximum.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   453
  _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
   454
  _max_gen1_size =
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   455
    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
   456
         min_alignment());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   457
  // 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
   458
  // 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
   459
  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
   460
    // 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
   461
    // 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
   462
    // 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
   463
    // the minimum, maximum and initial sizes consistent
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   464
    // 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
   465
    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
   466
      "gen0 has an unexpected minimum size");
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   467
    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
   468
    set_min_gen1_size(
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   469
      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
   470
           min_alignment()));
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   471
    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
   472
    set_initial_gen1_size(
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   473
      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
   474
           min_alignment()));
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   475
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   476
  } else {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   477
    // 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
   478
    // OldSize and then determine the consequences.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   479
    set_min_gen1_size(OldSize);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   480
    set_initial_gen1_size(OldSize);
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   481
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   482
    // 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
   483
    // with other command line flags, issue a warning.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
    // The generation minimums and the overall heap mimimum should
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
    // be within one heap alignment.
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   486
    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
   487
           min_heap_byte_size()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
      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
   489
          "generation sizes: using minimum heap = " SIZE_FORMAT,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   490
          min_heap_byte_size());
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   491
    }
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   492
    if ((OldSize > _max_gen1_size)) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   493
      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
   494
          "generation sizes: using maximum heap = " SIZE_FORMAT
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   495
          " -XX:OldSize flag is being ignored",
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   496
          max_heap_byte_size());
8687
264727307495 6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents: 7419
diff changeset
   497
    }
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   498
    // 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
   499
    // 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
   500
    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
   501
                          min_heap_byte_size(), OldSize)) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   502
      if (PrintGCDetails && Verbose) {
8687
264727307495 6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents: 7419
diff changeset
   503
        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
   504
              SIZE_FORMAT "  Maximum gen0 " SIZE_FORMAT,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   505
              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
   506
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
    }
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   508
    // Initial size
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   509
    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
   510
                         initial_heap_byte_size(), OldSize)) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   511
      if (PrintGCDetails && Verbose) {
8687
264727307495 6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents: 7419
diff changeset
   512
        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
   513
          SIZE_FORMAT "  Maximum gen0 " SIZE_FORMAT,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   514
          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
   515
      }
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   516
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  }
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   518
  // Enforce the maximum gen1 size.
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   519
  set_min_gen1_size(MIN2(_min_gen1_size, _max_gen1_size));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
186
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   521
  // 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
   522
  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
   523
  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
   524
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   525
  if (PrintGCDetails && Verbose) {
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   526
    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
   527
      SIZE_FORMAT "  Maximum gen1 " SIZE_FORMAT,
32e6c95f8d9b 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 1
diff changeset
   528
      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
   529
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
HeapWord* GenCollectorPolicy::mem_allocate_work(size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
                                        bool is_tlab,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
                                        bool* gc_overhead_limit_was_exceeded) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  GenCollectedHeap *gch = GenCollectedHeap::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
  debug_only(gch->check_for_valid_allocation_state());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  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
   539
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   540
  // 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
   541
  // 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
   542
  // 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
   543
  *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
   544
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  HeapWord* result = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
  // Loop until the allocation is satisified,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  // or unsatisfied after GC.
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15959
diff changeset
   549
  for (int try_count = 1, gclocker_stalled_count = 0; /* return or throw */; try_count += 1) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
    HandleMark hm; // discard any handles allocated in each iteration
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
    // First allocation attempt is lock-free.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
    Generation *gen0 = gch->get_gen(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
    assert(gen0->supports_inline_contig_alloc(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
      "Otherwise, must do alloc within heap lock");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
    if (gen0->should_allocate(size, is_tlab)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
      result = gen0->par_allocate(size, is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
      if (result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
        assert(gch->is_in_reserved(result), "result not in heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
        return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
    unsigned int gc_count_before;  // read inside the Heap_lock locked region
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
      MutexLocker ml(Heap_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
      if (PrintGC && Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
        gclog_or_tty->print_cr("TwoGenerationCollectorPolicy::mem_allocate_work:"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
                      " attempting locked slow path allocation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
      // Note that only large objects get a shot at being
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
      // allocated in later generations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
      bool first_only = ! should_try_older_generation_allocation(size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
      result = gch->attempt_allocation(size, is_tlab, first_only);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
      if (result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
        assert(gch->is_in_reserved(result), "result not in heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
        return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
      if (GC_locker::is_active_and_needs_gc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
        if (is_tlab) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
          return NULL;  // Caller will retry allocating individual object
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
        if (!gch->is_maximal_no_gc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
          // Try and expand heap to satisfy request
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
          result = expand_heap_and_allocate(size, is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
          // result could be null if we are out of space
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
          if (result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
            return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15959
diff changeset
   593
        if (gclocker_stalled_count > GCLockerRetryAllocationCount) {
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15959
diff changeset
   594
          return NULL; // we didn't get to do a GC and we didn't get any memory
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15959
diff changeset
   595
        }
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15959
diff changeset
   596
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
        // If this thread is not in a jni critical section, we stall
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
        // the requestor until the critical section has cleared and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
        // GC allowed. When the critical section clears, a GC is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
        // initiated by the last thread exiting the critical section; so
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
        // we retry the allocation sequence from the beginning of the loop,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
        // rather than causing more, now probably unnecessary, GC attempts.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
        JavaThread* jthr = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
        if (!jthr->in_critical()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
          MutexUnlocker mul(Heap_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
          // Wait for JNI critical section to be exited
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
          GC_locker::stall_until_clear();
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15959
diff changeset
   608
          gclocker_stalled_count += 1;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
          continue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
          if (CheckJNICalls) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
            fatal("Possible deadlock due to allocating while"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
                  " in jni critical section");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
          return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
      // Read the gc count while the heap lock is held.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
      gc_count_before = Universe::heap()->total_collections();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
    VM_GenCollectForAllocation op(size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
                                  is_tlab,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
                                  gc_count_before);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
    VMThread::execute(&op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
    if (op.prologue_succeeded()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
      result = op.result();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
      if (op.gc_locked()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
         assert(result == NULL, "must be NULL if gc_locked() is true");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
         continue;  // retry and/or stall as necessary
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
      }
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   633
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   634
      // 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
   635
      // 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
   636
      // 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
   637
      // 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
   638
      // 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
   639
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   640
      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
   641
      const bool softrefs_clear = all_soft_refs_clear();
15959
9a29e0e3a633 6976528: PS: assert(!limit_exceeded || softrefs_clear) failed: Should have been cleared
jmasa
parents: 15748
diff changeset
   642
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   643
      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
   644
        *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
   645
        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
   646
        if (op.result() != NULL) {
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   647
          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
   648
        }
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   649
        return NULL;
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   650
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
      assert(result == NULL || gch->is_in_reserved(result),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
             "result not in heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
      return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
    // Give a warning if we seem to be looping forever.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
    if ((QueuedAllocationWarningCount > 0) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
        (try_count % QueuedAllocationWarningCount == 0)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
          warning("TwoGenerationCollectorPolicy::mem_allocate_work retries %d times \n\t"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
                  " size=%d %s", try_count, size, is_tlab ? "(TLAB)" : "");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
HeapWord* GenCollectorPolicy::expand_heap_and_allocate(size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
                                                       bool   is_tlab) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
  GenCollectedHeap *gch = GenCollectedHeap::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
  HeapWord* result = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  for (int i = number_of_generations() - 1; i >= 0 && result == NULL; i--) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
    Generation *gen = gch->get_gen(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
    if (gen->should_allocate(size, is_tlab)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
      result = gen->expand_and_allocate(size, is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
  assert(result == NULL || gch->is_in_reserved(result), "result not in heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
HeapWord* GenCollectorPolicy::satisfy_failed_allocation(size_t size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
                                                        bool   is_tlab) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
  GenCollectedHeap *gch = GenCollectedHeap::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
  GCCauseSetter x(gch, GCCause::_allocation_failure);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
  HeapWord* result = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  assert(size != 0, "Precondition violated");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
  if (GC_locker::is_active_and_needs_gc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
    // GC locker is active; instead of a collection we will attempt
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
    // to expand the heap, if there's room for expansion.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
    if (!gch->is_maximal_no_gc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
      result = expand_heap_and_allocate(size, is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
    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
   693
  } else if (!gch->incremental_collection_will_fail(false /* don't consult_young */)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
    // Do an incremental collection.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
    gch->do_collection(false            /* full */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
                       false            /* clear_all_soft_refs */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
                       size             /* size */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
                       is_tlab          /* is_tlab */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
                       number_of_generations() - 1 /* max_level */);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
  } else {
7419
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   701
    if (Verbose && PrintGCDetails) {
263dd4e89b9d 7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed())
ysr
parents: 7397
diff changeset
   702
      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
   703
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
    // Try a full collection; see delta for bug id 6266275
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
    // for the original code and why this has been simplified
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
    // with from-space allocation criteria modified and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
    // such allocation moved out of the safepoint path.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
    gch->do_collection(true             /* full */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
                       false            /* clear_all_soft_refs */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
                       size             /* size */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
                       is_tlab          /* is_tlab */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
                       number_of_generations() - 1 /* max_level */);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
  result = gch->attempt_allocation(size, is_tlab, false /*first_only*/);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
  if (result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
    assert(gch->is_in_reserved(result), "result not in heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
    return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
  // OK, collection failed, try expansion.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
  result = expand_heap_and_allocate(size, is_tlab);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
  if (result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
    return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
  // If we reach this point, we're really out of memory. Try every trick
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
  // we can to reclaim memory. Force collection of soft references. Force
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
  // a complete compaction of the heap. Any additional methods for finding
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
  // free memory should be here, especially if they are expensive. If this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
  // attempt fails, an OOM exception will be thrown.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
    IntFlagSetting flag_change(MarkSweepAlwaysCompactCount, 1); // Make sure the heap is fully compacted
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
    gch->do_collection(true             /* full */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
                       true             /* clear_all_soft_refs */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
                       size             /* size */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
                       is_tlab          /* is_tlab */,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
                       number_of_generations() - 1 /* max_level */);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
  result = gch->attempt_allocation(size, is_tlab, false /* first_only */);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
  if (result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
    assert(gch->is_in_reserved(result), "result not in heap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
    return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 4434
diff changeset
   749
  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
   750
    "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
   751
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
  // What else?  We might try synchronous finalization later.  If the total
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
  // space available is large enough for the allocation, then a more
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
  // complete compaction phase than we've tried so far might be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
  // appropriate.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   759
MetaWord* CollectorPolicy::satisfy_failed_metadata_allocation(
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   760
                                                 ClassLoaderData* loader_data,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   761
                                                 size_t word_size,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   762
                                                 Metaspace::MetadataType mdtype) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   763
  uint loop_count = 0;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   764
  uint gc_count = 0;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   765
  uint full_gc_count = 0;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   766
14291
c8e69e83977f 8000988: VM deadlock when running btree006 on windows-i586
jmasa
parents: 13755
diff changeset
   767
  assert(!Heap_lock->owned_by_self(), "Should not be holding the Heap_lock");
c8e69e83977f 8000988: VM deadlock when running btree006 on windows-i586
jmasa
parents: 13755
diff changeset
   768
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   769
  do {
13755
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   770
    MetaWord* result = NULL;
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   771
    if (GC_locker::is_active_and_needs_gc()) {
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   772
      // If the GC_locker is active, just expand and allocate.
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   773
      // If that does not succeed, wait if this thread is not
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   774
      // in a critical section itself.
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   775
      result =
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   776
        loader_data->metaspace_non_null()->expand_and_allocate(word_size,
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   777
                                                               mdtype);
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   778
      if (result != NULL) {
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   779
        return result;
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   780
      }
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   781
      JavaThread* jthr = JavaThread::current();
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   782
      if (!jthr->in_critical()) {
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   783
        // Wait for JNI critical section to be exited
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   784
        GC_locker::stall_until_clear();
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   785
        // The GC invoked by the last thread leaving the critical
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   786
        // section will be a young collection and a full collection
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   787
        // is (currently) needed for unloading classes so continue
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   788
        // to the next iteration to get a full GC.
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   789
        continue;
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   790
      } else {
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   791
        if (CheckJNICalls) {
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   792
          fatal("Possible deadlock due to allocating while"
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   793
                " in jni critical section");
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   794
        }
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   795
        return NULL;
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   796
      }
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   797
    }
a00f5de57d30 7197557: NPG: nsk/sysdict/vm/stress/chain/chain004 hangs intermittently
jmasa
parents: 13728
diff changeset
   798
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   799
    {  // Need lock to get self consistent gc_count's
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   800
      MutexLocker ml(Heap_lock);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   801
      gc_count      = Universe::heap()->total_collections();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   802
      full_gc_count = Universe::heap()->total_full_collections();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   803
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   804
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   805
    // Generate a VM operation
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   806
    VM_CollectForMetadataAllocation op(loader_data,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   807
                                       word_size,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   808
                                       mdtype,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   809
                                       gc_count,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   810
                                       full_gc_count,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   811
                                       GCCause::_metadata_GC_threshold);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   812
    VMThread::execute(&op);
15086
2bfd799e9147 8005082: NPG: Add specialized Metachunk sizes for reflection and anonymous classloaders
jmasa
parents: 14583
diff changeset
   813
2bfd799e9147 8005082: NPG: Add specialized Metachunk sizes for reflection and anonymous classloaders
jmasa
parents: 14583
diff changeset
   814
    // If GC was locked out, try again.  Check
2bfd799e9147 8005082: NPG: Add specialized Metachunk sizes for reflection and anonymous classloaders
jmasa
parents: 14583
diff changeset
   815
    // before checking success because the prologue
2bfd799e9147 8005082: NPG: Add specialized Metachunk sizes for reflection and anonymous classloaders
jmasa
parents: 14583
diff changeset
   816
    // could have succeeded and the GC still have
2bfd799e9147 8005082: NPG: Add specialized Metachunk sizes for reflection and anonymous classloaders
jmasa
parents: 14583
diff changeset
   817
    // been locked out.
2bfd799e9147 8005082: NPG: Add specialized Metachunk sizes for reflection and anonymous classloaders
jmasa
parents: 14583
diff changeset
   818
    if (op.gc_locked()) {
2bfd799e9147 8005082: NPG: Add specialized Metachunk sizes for reflection and anonymous classloaders
jmasa
parents: 14583
diff changeset
   819
      continue;
2bfd799e9147 8005082: NPG: Add specialized Metachunk sizes for reflection and anonymous classloaders
jmasa
parents: 14583
diff changeset
   820
    }
2bfd799e9147 8005082: NPG: Add specialized Metachunk sizes for reflection and anonymous classloaders
jmasa
parents: 14583
diff changeset
   821
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   822
    if (op.prologue_succeeded()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   823
      return op.result();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   824
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   825
    loop_count++;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   826
    if ((QueuedAllocationWarningCount > 0) &&
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   827
        (loop_count % QueuedAllocationWarningCount == 0)) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   828
      warning("satisfy_failed_metadata_allocation() retries %d times \n\t"
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   829
              " size=%d", loop_count, word_size);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   830
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   831
  } while (true);  // Until a GC is done
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   832
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 10565
diff changeset
   833
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
// Return true if any of the following is true:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
// . the allocation won't fit into the current young gen heap
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
// . gc locker is occupied (jni critical section)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
// . heap memory is tight -- the most recent previous collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
//   was a full collection because a partial collection (would
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
//   have) failed and is likely to fail again
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
bool GenCollectorPolicy::should_try_older_generation_allocation(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
        size_t word_size) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
  GenCollectedHeap* gch = GenCollectedHeap::heap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
  size_t gen0_capacity = gch->get_gen(0)->capacity_before_gc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
  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
   845
         || 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
   846
         || gch->incremental_collection_failed();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
// MarkSweepPolicy methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
MarkSweepPolicy::MarkSweepPolicy() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
  initialize_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
void MarkSweepPolicy::initialize_generations() {
17031
9a576749065b 8012907: anti-delta fix for 8010992
dcubed
parents: 17026
diff changeset
   859
  _generations = new GenerationSpecPtr[number_of_generations()];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
  if (_generations == NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
    vm_exit_during_initialization("Unable to allocate gen spec");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
15091
826cff1f58f5 8005396: Use ParNew with only one thread instead of DefNew as default for CMS on single CPU machines
brutisso
parents: 15086
diff changeset
   863
  if (UseParNewGC) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
    _generations[0] = new GenerationSpec(Generation::ParNew, _initial_gen0_size, _max_gen0_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
    _generations[0] = new GenerationSpec(Generation::DefNew, _initial_gen0_size, _max_gen0_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
  _generations[1] = new GenerationSpec(Generation::MarkSweepCompact, _initial_gen1_size, _max_gen1_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
  if (_generations[0] == NULL || _generations[1] == NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
    vm_exit_during_initialization("Unable to allocate gen spec");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
void MarkSweepPolicy::initialize_gc_policy_counters() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
  // initialize the policy counters - 2 collectors, 3 generations
15091
826cff1f58f5 8005396: Use ParNew with only one thread instead of DefNew as default for CMS on single CPU machines
brutisso
parents: 15086
diff changeset
   876
  if (UseParNewGC) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
    _gc_policy_counters = new GCPolicyCounters("ParNew:MSC", 2, 3);
15091
826cff1f58f5 8005396: Use ParNew with only one thread instead of DefNew as default for CMS on single CPU machines
brutisso
parents: 15086
diff changeset
   878
  } else {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
    _gc_policy_counters = new GCPolicyCounters("Copy:MSC", 2, 3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
}