hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp
author brutisso
Fri, 13 Apr 2012 01:59:38 +0200
changeset 12378 ed44b9ecfa2f
parent 12272 f87fd1292095
child 12381 1438e0fbfa27
permissions -rw-r--r--
7160728: Introduce an extra logging level for G1 logging Summary: Added log levels "fine", "finer" and "finest". Let PrintGC map to "fine" and PrintGCDetails map to "finer". Separated out the per worker information in the G1 logging to the "finest" level. Reviewed-by: stefank, jwilhelm, tonyp, johnc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     1
/*
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11397
diff changeset
     2
 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     4
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     7
 * published by the Free Software Foundation.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     8
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    13
 * accompanied this code).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    14
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5350
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5350
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: 5350
diff changeset
    21
 * questions.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    22
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    23
 */
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    26
#include "gc_implementation/g1/concurrentG1Refine.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    27
#include "gc_implementation/g1/concurrentMark.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    28
#include "gc_implementation/g1/concurrentMarkThread.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    29
#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    30
#include "gc_implementation/g1/g1CollectorPolicy.hpp"
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
    31
#include "gc_implementation/g1/g1ErgoVerbose.hpp"
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
    32
#include "gc_implementation/g1/g1Log.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    33
#include "gc_implementation/g1/heapRegionRemSet.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    34
#include "gc_implementation/shared/gcPolicyCounters.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    35
#include "runtime/arguments.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    36
#include "runtime/java.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    37
#include "runtime/mutexLocker.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    38
#include "utilities/debug.hpp"
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    39
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    40
// Different defaults for different number of GC threads
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    41
// They were chosen by running GCOld and SPECjbb on debris with different
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    42
//   numbers of GC threads and choosing them based on the results
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    43
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    44
// all the same
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    45
static double rs_length_diff_defaults[] = {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    46
  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    47
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    48
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    49
static double cost_per_card_ms_defaults[] = {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    50
  0.01, 0.005, 0.005, 0.003, 0.003, 0.002, 0.002, 0.0015
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    51
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    52
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    53
// all the same
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
    54
static double young_cards_per_entry_ratio_defaults[] = {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    55
  1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    56
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    57
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    58
static double cost_per_entry_ms_defaults[] = {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    59
  0.015, 0.01, 0.01, 0.008, 0.008, 0.0055, 0.0055, 0.005
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    60
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    61
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    62
static double cost_per_byte_ms_defaults[] = {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    63
  0.00006, 0.00003, 0.00003, 0.000015, 0.000015, 0.00001, 0.00001, 0.000009
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    64
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    65
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    66
// these should be pretty consistent
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    67
static double constant_other_time_ms_defaults[] = {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    68
  5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    69
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    70
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    71
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    72
static double young_other_cost_per_region_ms_defaults[] = {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    73
  0.3, 0.2, 0.2, 0.15, 0.15, 0.12, 0.12, 0.1
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    74
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    75
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    76
static double non_young_other_cost_per_region_ms_defaults[] = {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    77
  1.0, 0.7, 0.7, 0.5, 0.5, 0.42, 0.42, 0.30
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    78
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    79
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    80
// Help class for avoiding interleaved logging
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    81
class LineBuffer: public StackObj {
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    82
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    83
private:
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    84
  static const int BUFFER_LEN = 1024;
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    85
  static const int INDENT_CHARS = 3;
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    86
  char _buffer[BUFFER_LEN];
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    87
  int _indent_level;
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    88
  int _cur;
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    89
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    90
  void vappend(const char* format, va_list ap) {
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    91
    int res = vsnprintf(&_buffer[_cur], BUFFER_LEN - _cur, format, ap);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    92
    if (res != -1) {
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    93
      _cur += res;
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    94
    } else {
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    95
      DEBUG_ONLY(warning("buffer too small in LineBuffer");)
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    96
      _buffer[BUFFER_LEN -1] = 0;
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    97
      _cur = BUFFER_LEN; // vsnprintf above should not add to _buffer if we are called again
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    98
    }
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    99
  }
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   100
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   101
public:
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   102
  explicit LineBuffer(int indent_level): _indent_level(indent_level), _cur(0) {
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   103
    for (; (_cur < BUFFER_LEN && _cur < (_indent_level * INDENT_CHARS)); _cur++) {
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   104
      _buffer[_cur] = ' ';
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   105
    }
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   106
  }
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   107
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   108
#ifndef PRODUCT
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   109
  ~LineBuffer() {
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   110
    assert(_cur == _indent_level * INDENT_CHARS, "pending data in buffer - append_and_print_cr() not called?");
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   111
  }
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   112
#endif
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   113
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   114
  void append(const char* format, ...) {
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   115
    va_list ap;
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   116
    va_start(ap, format);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   117
    vappend(format, ap);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   118
    va_end(ap);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   119
  }
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   120
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   121
  void append_and_print_cr(const char* format, ...) {
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   122
    va_list ap;
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   123
    va_start(ap, format);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   124
    vappend(format, ap);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   125
    va_end(ap);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   126
    gclog_or_tty->print_cr("%s", _buffer);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   127
    _cur = _indent_level * INDENT_CHARS;
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   128
  }
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   129
};
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   130
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   131
G1CollectorPolicy::G1CollectorPolicy() :
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
   132
  _parallel_gc_threads(G1CollectedHeap::use_parallel_gc_threads()
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
   133
                        ? ParallelGCThreads : 1),
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
   134
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   135
  _recent_gc_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   136
  _all_pause_times_ms(new NumberSeq()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   137
  _stop_world_start(0.0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   138
  _all_stop_world_times_ms(new NumberSeq()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   139
  _all_yield_times_ms(new NumberSeq()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   140
2344
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2260
diff changeset
   141
  _summary(new Summary()),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   142
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10667
diff changeset
   143
  _cur_clear_ct_time_ms(0.0),
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
   144
  _root_region_scan_wait_time_ms(0.0),
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10667
diff changeset
   145
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10667
diff changeset
   146
  _cur_ref_proc_time_ms(0.0),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10667
diff changeset
   147
  _cur_ref_enq_time_ms(0.0),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10667
diff changeset
   148
3590
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
   149
#ifndef PRODUCT
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
   150
  _min_clear_cc_time_ms(-1.0),
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
   151
  _max_clear_cc_time_ms(-1.0),
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
   152
  _cur_clear_cc_time_ms(0.0),
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
   153
  _cum_clear_cc_time_ms(0.0),
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
   154
  _num_cc_clears(0L),
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
   155
#endif
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   156
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   157
  _aux_num(10),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   158
  _all_aux_times_ms(new NumberSeq[_aux_num]),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   159
  _cur_aux_start_times_ms(new double[_aux_num]),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   160
  _cur_aux_times_ms(new double[_aux_num]),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   161
  _cur_aux_times_set(new bool[_aux_num]),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   162
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   163
  _concurrent_mark_remark_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   164
  _concurrent_mark_cleanup_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   165
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   166
  _alloc_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   167
  _prev_collection_pause_end_ms(0.0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   168
  _pending_card_diff_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   169
  _rs_length_diff_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   170
  _cost_per_card_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   171
  _young_cards_per_entry_ratio_seq(new TruncatedSeq(TruncatedSeqLength)),
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   172
  _mixed_cards_per_entry_ratio_seq(new TruncatedSeq(TruncatedSeqLength)),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   173
  _cost_per_entry_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   174
  _mixed_cost_per_entry_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   175
  _cost_per_byte_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   176
  _cost_per_byte_ms_during_cm_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   177
  _constant_other_time_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   178
  _young_other_cost_per_region_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   179
  _non_young_other_cost_per_region_ms_seq(
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   180
                                         new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   181
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   182
  _pending_cards_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   183
  _rs_lengths_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   184
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
   185
  _pause_time_target_ms((double) MaxGCPauseMillis),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   186
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   187
  _gcs_are_young(true),
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   188
  _young_pause_num(0),
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   189
  _mixed_pause_num(0),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   190
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   191
  _during_marking(false),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   192
  _in_marking_window(false),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   193
  _in_marking_window_im(false),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   194
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   195
  _known_garbage_ratio(0.0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   196
  _known_garbage_bytes(0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   197
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   198
  _young_gc_eff_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   199
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   200
  _recent_prev_end_times_for_all_gcs_sec(
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   201
                                new TruncatedSeq(NumPrevPausesForHeuristics)),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   202
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   203
  _recent_avg_pause_time_ratio(0.0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   204
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   205
  _all_full_gc_times_ms(new NumberSeq()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   206
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
   207
  _initiate_conc_mark_if_possible(false),
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
   208
  _during_initial_mark_pause(false),
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   209
  _last_young_gc(false),
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   210
  _last_gc_was_young(false),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   211
9987
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
   212
  _eden_bytes_before_gc(0),
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
   213
  _survivor_bytes_before_gc(0),
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
   214
  _capacity_before_gc(0),
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
   215
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
   216
  _eden_cset_region_length(0),
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
   217
  _survivor_cset_region_length(0),
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
   218
  _old_cset_region_length(0),
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
   219
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   220
  _collection_set(NULL),
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   221
  _collection_set_bytes_used_before(0),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   222
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   223
  // Incremental CSet attributes
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   224
  _inc_cset_build_state(Inactive),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   225
  _inc_cset_head(NULL),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   226
  _inc_cset_tail(NULL),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   227
  _inc_cset_bytes_used_before(0),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   228
  _inc_cset_max_finger(NULL),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   229
  _inc_cset_recorded_rs_lengths(0),
11395
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
   230
  _inc_cset_recorded_rs_lengths_diffs(0),
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   231
  _inc_cset_predicted_elapsed_time_ms(0.0),
11395
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
   232
  _inc_cset_predicted_elapsed_time_ms_diffs(0.0),
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   233
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   234
#ifdef _MSC_VER // the use of 'this' below gets a warning, make it go away
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   235
#pragma warning( disable:4355 ) // 'this' : used in base member initializer list
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   236
#endif // _MSC_VER
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   237
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   238
  _short_lived_surv_rate_group(new SurvRateGroup(this, "Short Lived",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   239
                                                 G1YoungSurvRateNumRegionsSummary)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   240
  _survivor_surv_rate_group(new SurvRateGroup(this, "Survivor",
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   241
                                              G1YoungSurvRateNumRegionsSummary)),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   242
  // add here any more surv rate groups
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   243
  _recorded_survivor_regions(0),
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   244
  _recorded_survivor_head(NULL),
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   245
  _recorded_survivor_tail(NULL),
5240
3892e01609c6 6937160: G1: should observe GCTimeRatio
tonyp
parents: 5036
diff changeset
   246
  _survivors_age_table(true),
3892e01609c6 6937160: G1: should observe GCTimeRatio
tonyp
parents: 5036
diff changeset
   247
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
   248
  _gc_overhead_perc(0.0) {
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
   249
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3691
diff changeset
   250
  // Set up the region size and associated fields. Given that the
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3691
diff changeset
   251
  // policy is created before the heap, we have to set this up here,
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3691
diff changeset
   252
  // so it's done as soon as possible.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3691
diff changeset
   253
  HeapRegion::setup_heap_region_size(Arguments::min_heap_size());
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4481
diff changeset
   254
  HeapRegionRemSet::setup_remset_size();
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3691
diff changeset
   255
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
   256
  G1ErgoVerbose::initialize();
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
   257
  if (PrintAdaptiveSizePolicy) {
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
   258
    // Currently, we only use a single switch for all the heuristics.
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
   259
    G1ErgoVerbose::set_enabled(true);
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
   260
    // Given that we don't currently have a verboseness level
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
   261
    // parameter, we'll hardcode this to high. This can be easily
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
   262
    // changed in the future.
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
   263
    G1ErgoVerbose::set_level(ErgoHigh);
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
   264
  } else {
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
   265
    G1ErgoVerbose::set_enabled(false);
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
   266
  }
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
   267
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5344
diff changeset
   268
  // Verify PLAB sizes
10677
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10673
diff changeset
   269
  const size_t region_size = HeapRegion::GrainWords;
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5344
diff changeset
   270
  if (YoungPLABSize > region_size || OldPLABSize > region_size) {
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5344
diff changeset
   271
    char buffer[128];
10677
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10673
diff changeset
   272
    jio_snprintf(buffer, sizeof(buffer), "%sPLABSize should be at most "SIZE_FORMAT,
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5344
diff changeset
   273
                 OldPLABSize > region_size ? "Old" : "Young", region_size);
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5344
diff changeset
   274
    vm_exit_during_initialization(buffer);
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5344
diff changeset
   275
  }
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5344
diff changeset
   276
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   277
  _recent_prev_end_times_for_all_gcs_sec->add(os::elapsedTime());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   278
  _prev_collection_pause_end_ms = os::elapsedTime() * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   279
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   280
  _par_last_gc_worker_start_times_ms = new double[_parallel_gc_threads];
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   281
  _par_last_ext_root_scan_times_ms = new double[_parallel_gc_threads];
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11397
diff changeset
   282
  _par_last_satb_filtering_times_ms = new double[_parallel_gc_threads];
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   283
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   284
  _par_last_update_rs_times_ms = new double[_parallel_gc_threads];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   285
  _par_last_update_rs_processed_buffers = new double[_parallel_gc_threads];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   286
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   287
  _par_last_scan_rs_times_ms = new double[_parallel_gc_threads];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   288
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   289
  _par_last_obj_copy_times_ms = new double[_parallel_gc_threads];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   290
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   291
  _par_last_termination_times_ms = new double[_parallel_gc_threads];
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   292
  _par_last_termination_attempts = new double[_parallel_gc_threads];
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   293
  _par_last_gc_worker_end_times_ms = new double[_parallel_gc_threads];
8925
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
   294
  _par_last_gc_worker_times_ms = new double[_parallel_gc_threads];
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
   295
  _par_last_gc_worker_other_times_ms = new double[_parallel_gc_threads];
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   296
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   297
  int index;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   298
  if (ParallelGCThreads == 0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   299
    index = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   300
  else if (ParallelGCThreads > 8)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   301
    index = 7;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   302
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   303
    index = ParallelGCThreads - 1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   304
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   305
  _pending_card_diff_seq->add(0.0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   306
  _rs_length_diff_seq->add(rs_length_diff_defaults[index]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   307
  _cost_per_card_ms_seq->add(cost_per_card_ms_defaults[index]);
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   308
  _young_cards_per_entry_ratio_seq->add(
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   309
                                  young_cards_per_entry_ratio_defaults[index]);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   310
  _cost_per_entry_ms_seq->add(cost_per_entry_ms_defaults[index]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   311
  _cost_per_byte_ms_seq->add(cost_per_byte_ms_defaults[index]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   312
  _constant_other_time_ms_seq->add(constant_other_time_ms_defaults[index]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   313
  _young_other_cost_per_region_ms_seq->add(
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   314
                               young_other_cost_per_region_ms_defaults[index]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   315
  _non_young_other_cost_per_region_ms_seq->add(
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   316
                           non_young_other_cost_per_region_ms_defaults[index]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   317
5890
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   318
  // Below, we might need to calculate the pause time target based on
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   319
  // the pause interval. When we do so we are going to give G1 maximum
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   320
  // flexibility and allow it to do pauses when it needs to. So, we'll
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   321
  // arrange that the pause interval to be pause time target + 1 to
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   322
  // ensure that a) the pause time target is maximized with respect to
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   323
  // the pause interval and b) we maintain the invariant that pause
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   324
  // time target < pause interval. If the user does not want this
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   325
  // maximum flexibility, they will have to set the pause interval
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   326
  // explicitly.
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   327
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   328
  // First make sure that, if either parameter is set, its value is
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   329
  // reasonable.
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   330
  if (!FLAG_IS_DEFAULT(MaxGCPauseMillis)) {
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   331
    if (MaxGCPauseMillis < 1) {
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   332
      vm_exit_during_initialization("MaxGCPauseMillis should be "
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   333
                                    "greater than 0");
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   334
    }
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   335
  }
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   336
  if (!FLAG_IS_DEFAULT(GCPauseIntervalMillis)) {
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   337
    if (GCPauseIntervalMillis < 1) {
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   338
      vm_exit_during_initialization("GCPauseIntervalMillis should be "
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   339
                                    "greater than 0");
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   340
    }
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   341
  }
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   342
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   343
  // Then, if the pause time target parameter was not set, set it to
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   344
  // the default value.
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   345
  if (FLAG_IS_DEFAULT(MaxGCPauseMillis)) {
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   346
    if (FLAG_IS_DEFAULT(GCPauseIntervalMillis)) {
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   347
      // The default pause time target in G1 is 200ms
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   348
      FLAG_SET_DEFAULT(MaxGCPauseMillis, 200);
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   349
    } else {
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   350
      // We do not allow the pause interval to be set without the
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   351
      // pause time target
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   352
      vm_exit_during_initialization("GCPauseIntervalMillis cannot be set "
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   353
                                    "without setting MaxGCPauseMillis");
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   354
    }
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   355
  }
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   356
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   357
  // Then, if the interval parameter was not set, set it according to
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   358
  // the pause time target (this will also deal with the case when the
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   359
  // pause time target is the default value).
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   360
  if (FLAG_IS_DEFAULT(GCPauseIntervalMillis)) {
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   361
    FLAG_SET_DEFAULT(GCPauseIntervalMillis, MaxGCPauseMillis + 1);
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   362
  }
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   363
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   364
  // Finally, make sure that the two parameters are consistent.
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   365
  if (MaxGCPauseMillis >= GCPauseIntervalMillis) {
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   366
    char buffer[256];
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   367
    jio_snprintf(buffer, 256,
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   368
                 "MaxGCPauseMillis (%u) should be less than "
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   369
                 "GCPauseIntervalMillis (%u)",
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   370
                 MaxGCPauseMillis, GCPauseIntervalMillis);
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   371
    vm_exit_during_initialization(buffer);
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   372
  }
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   373
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
   374
  double max_gc_time = (double) MaxGCPauseMillis / 1000.0;
5890
5766abbf8789 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 5702
diff changeset
   375
  double time_slice  = (double) GCPauseIntervalMillis / 1000.0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   376
  _mmu_tracker = new G1MMUTrackerQueue(time_slice, max_gc_time);
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
   377
  _sigma = (double) G1ConfidencePercent / 100.0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   378
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   379
  // start conservatively (around 50ms is about right)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   380
  _concurrent_mark_remark_times_ms->add(0.05);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   381
  _concurrent_mark_cleanup_times_ms->add(0.20);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   382
  _tenuring_threshold = MaxTenuringThreshold;
10281
ad7517425333 7081064: G1: remove develop params G1FixedSurvivorSpaceSize, G1FixedTenuringThreshold, and G1FixedEdenSize
tonyp
parents: 10280
diff changeset
   383
  // _max_survivor_regions will be calculated by
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   384
  // update_young_list_target_length() during initialization.
10281
ad7517425333 7081064: G1: remove develop params G1FixedSurvivorSpaceSize, G1FixedTenuringThreshold, and G1FixedEdenSize
tonyp
parents: 10280
diff changeset
   385
  _max_survivor_regions = 0;
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   386
5240
3892e01609c6 6937160: G1: should observe GCTimeRatio
tonyp
parents: 5036
diff changeset
   387
  assert(GCTimeRatio > 0,
3892e01609c6 6937160: G1: should observe GCTimeRatio
tonyp
parents: 5036
diff changeset
   388
         "we should have set it to a default value set_g1_gc_flags() "
3892e01609c6 6937160: G1: should observe GCTimeRatio
tonyp
parents: 5036
diff changeset
   389
         "if a user set it to 0");
3892e01609c6 6937160: G1: should observe GCTimeRatio
tonyp
parents: 5036
diff changeset
   390
  _gc_overhead_perc = 100.0 * (1.0 / (1.0 + GCTimeRatio));
3892e01609c6 6937160: G1: should observe GCTimeRatio
tonyp
parents: 5036
diff changeset
   391
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   392
  uintx reserve_perc = G1ReservePercent;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   393
  // Put an artificial ceiling on this so that it's not set to a silly value.
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   394
  if (reserve_perc > 50) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   395
    reserve_perc = 50;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   396
    warning("G1ReservePercent is set to a value that is too large, "
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   397
            "it's been updated to %u", reserve_perc);
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   398
  }
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   399
  _reserve_factor = (double) reserve_perc / 100.0;
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
   400
  // This will be set when the heap is expanded
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   401
  // for the first time during initialization.
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   402
  _reserve_regions = 0;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   403
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   404
  initialize_all();
10746
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
   405
  _collectionSetChooser = new CollectionSetChooser();
11397
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   406
  _young_gen_sizer = new G1YoungGenSizer(); // Must be after call to initialize_flags
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   407
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   408
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   409
void G1CollectorPolicy::initialize_flags() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   410
  set_min_alignment(HeapRegion::GrainBytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   411
  set_max_alignment(GenRemSet::max_alignment_constraint(rem_set_name()));
2011
d666454081dd 6802413: G1: G1FixedSurvivorSpaceSize should be converted into regions in calculate_survivors_policy()
apetrusenko
parents: 2009
diff changeset
   412
  if (SurvivorRatio < 1) {
d666454081dd 6802413: G1: G1FixedSurvivorSpaceSize should be converted into regions in calculate_survivors_policy()
apetrusenko
parents: 2009
diff changeset
   413
    vm_exit_during_initialization("Invalid survivor ratio specified");
d666454081dd 6802413: G1: G1FixedSurvivorSpaceSize should be converted into regions in calculate_survivors_policy()
apetrusenko
parents: 2009
diff changeset
   414
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   415
  CollectorPolicy::initialize_flags();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   416
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   417
11397
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   418
G1YoungGenSizer::G1YoungGenSizer() : _sizer_kind(SizerDefaults), _adaptive_size(true) {
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   419
  assert(G1DefaultMinNewGenPercent <= G1DefaultMaxNewGenPercent, "Min larger than max");
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   420
  assert(G1DefaultMinNewGenPercent > 0 && G1DefaultMinNewGenPercent < 100, "Min out of bounds");
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   421
  assert(G1DefaultMaxNewGenPercent > 0 && G1DefaultMaxNewGenPercent < 100, "Max out of bounds");
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   422
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   423
  if (FLAG_IS_CMDLINE(NewRatio)) {
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   424
    if (FLAG_IS_CMDLINE(NewSize) || FLAG_IS_CMDLINE(MaxNewSize)) {
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   425
      warning("-XX:NewSize and -XX:MaxNewSize override -XX:NewRatio");
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   426
    } else {
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   427
      _sizer_kind = SizerNewRatio;
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   428
      _adaptive_size = false;
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   429
      return;
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   430
    }
10667
90a451f6e3eb 7091032: G1: assert failure when NewRatio is used
tonyp
parents: 10535
diff changeset
   431
  }
5036
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   432
11397
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   433
  if (FLAG_IS_CMDLINE(NewSize)) {
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   434
     _min_desired_young_length = MAX2((size_t) 1, NewSize / HeapRegion::GrainBytes);
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   435
    if (FLAG_IS_CMDLINE(MaxNewSize)) {
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   436
      _max_desired_young_length = MAX2((size_t) 1, MaxNewSize / HeapRegion::GrainBytes);
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   437
      _sizer_kind = SizerMaxAndNewSize;
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   438
      _adaptive_size = _min_desired_young_length == _max_desired_young_length;
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   439
    } else {
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   440
      _sizer_kind = SizerNewSizeOnly;
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   441
    }
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   442
  } else if (FLAG_IS_CMDLINE(MaxNewSize)) {
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   443
    _max_desired_young_length = MAX2((size_t) 1, MaxNewSize / HeapRegion::GrainBytes);
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   444
    _sizer_kind = SizerMaxNewSizeOnly;
5036
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   445
  }
11397
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   446
}
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   447
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   448
size_t G1YoungGenSizer::calculate_default_min_length(size_t new_number_of_heap_regions) {
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   449
  size_t default_value = (new_number_of_heap_regions * G1DefaultMinNewGenPercent) / 100;
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   450
  return MAX2((size_t)1, default_value);
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   451
}
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   452
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   453
size_t G1YoungGenSizer::calculate_default_max_length(size_t new_number_of_heap_regions) {
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   454
  size_t default_value = (new_number_of_heap_regions * G1DefaultMaxNewGenPercent) / 100;
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   455
  return MAX2((size_t)1, default_value);
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   456
}
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   457
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   458
void G1YoungGenSizer::heap_size_changed(size_t new_number_of_heap_regions) {
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   459
  assert(new_number_of_heap_regions > 0, "Heap must be initialized");
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   460
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   461
  switch (_sizer_kind) {
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   462
    case SizerDefaults:
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   463
      _min_desired_young_length = calculate_default_min_length(new_number_of_heap_regions);
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   464
      _max_desired_young_length = calculate_default_max_length(new_number_of_heap_regions);
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   465
      break;
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   466
    case SizerNewSizeOnly:
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   467
      _max_desired_young_length = calculate_default_max_length(new_number_of_heap_regions);
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   468
      _max_desired_young_length = MAX2(_min_desired_young_length, _max_desired_young_length);
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   469
      break;
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   470
    case SizerMaxNewSizeOnly:
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   471
      _min_desired_young_length = calculate_default_min_length(new_number_of_heap_regions);
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   472
      _min_desired_young_length = MIN2(_min_desired_young_length, _max_desired_young_length);
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   473
      break;
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   474
    case SizerMaxAndNewSize:
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   475
      // Do nothing. Values set on the command line, don't update them at runtime.
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   476
      break;
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   477
    case SizerNewRatio:
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   478
      _min_desired_young_length = new_number_of_heap_regions / (NewRatio + 1);
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   479
      _max_desired_young_length = _min_desired_young_length;
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   480
      break;
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   481
    default:
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   482
      ShouldNotReachHere();
5036
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   483
  }
11397
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   484
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   485
  assert(_min_desired_young_length <= _max_desired_young_length, "Invalid min/max young gen size values");
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
   486
}
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
   487
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   488
void G1CollectorPolicy::init() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   489
  // Set aside an initial future to_space.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   490
  _g1 = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   491
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   492
  assert(Heap_lock->owned_by_self(), "Locking discipline.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   493
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   494
  initialize_gc_policy_counters();
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   495
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
   496
  if (adaptive_young_list_length()) {
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
   497
    _young_list_fixed_length = 0;
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   498
  } else {
11397
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   499
    _young_list_fixed_length = _young_gen_sizer->min_desired_young_length();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   500
  }
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
   501
  _free_regions_at_end_of_collection = _g1->free_regions();
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   502
  update_young_list_target_length();
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
   503
  _prev_eden_capacity = _young_list_target_length * HeapRegion::GrainBytes;
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   504
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   505
  // We may immediately start allocating regions and placing them on the
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   506
  // collection set list. Initialize the per-collection set info
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   507
  start_incremental_cset_building();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   508
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   509
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   510
// Create the jstat counters for the policy.
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   511
void G1CollectorPolicy::initialize_gc_policy_counters() {
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
   512
  _gc_policy_counters = new GCPolicyCounters("GarbageFirst", 1, 3);
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   513
}
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   514
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   515
bool G1CollectorPolicy::predict_will_fit(size_t young_length,
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   516
                                         double base_time_ms,
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   517
                                         size_t base_free_regions,
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   518
                                         double target_pause_time_ms) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   519
  if (young_length >= base_free_regions) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   520
    // end condition 1: not enough space for the young regions
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   521
    return false;
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   522
  }
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   523
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   524
  double accum_surv_rate = accum_yg_surv_rate_pred((int)(young_length - 1));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   525
  size_t bytes_to_copy =
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   526
               (size_t) (accum_surv_rate * (double) HeapRegion::GrainBytes);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   527
  double copy_time_ms = predict_object_copy_time_ms(bytes_to_copy);
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   528
  double young_other_time_ms = predict_young_other_time_ms(young_length);
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   529
  double pause_time_ms = base_time_ms + copy_time_ms + young_other_time_ms;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   530
  if (pause_time_ms > target_pause_time_ms) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   531
    // end condition 2: prediction is over the target pause time
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   532
    return false;
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   533
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   534
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   535
  size_t free_bytes =
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   536
                  (base_free_regions - young_length) * HeapRegion::GrainBytes;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   537
  if ((2.0 * sigma()) * (double) bytes_to_copy > (double) free_bytes) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   538
    // end condition 3: out-of-space (conservatively!)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   539
    return false;
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   540
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   541
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   542
  // success!
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   543
  return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   544
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   545
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
   546
void G1CollectorPolicy::record_new_heap_size(size_t new_number_of_regions) {
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
   547
  // re-calculate the necessary reserve
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
   548
  double reserve_regions_d = (double) new_number_of_regions * _reserve_factor;
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   549
  // We use ceiling so that if reserve_regions_d is > 0.0 (but
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   550
  // smaller than 1.0) we'll get 1.
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   551
  _reserve_regions = (size_t) ceil(reserve_regions_d);
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
   552
11397
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   553
  _young_gen_sizer->heap_size_changed(new_number_of_regions);
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   554
}
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   555
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   556
size_t G1CollectorPolicy::calculate_young_list_desired_min_length(
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   557
                                                     size_t base_min_length) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   558
  size_t desired_min_length = 0;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   559
  if (adaptive_young_list_length()) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   560
    if (_alloc_rate_ms_seq->num() > 3) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   561
      double now_sec = os::elapsedTime();
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   562
      double when_ms = _mmu_tracker->when_max_gc_sec(now_sec) * 1000.0;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   563
      double alloc_rate_ms = predict_alloc_rate_ms();
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   564
      desired_min_length = (size_t) ceil(alloc_rate_ms * when_ms);
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   565
    } else {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   566
      // otherwise we don't have enough info to make the prediction
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   567
    }
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   568
  }
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
   569
  desired_min_length += base_min_length;
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
   570
  // make sure we don't go below any user-defined minimum bound
11397
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   571
  return MAX2(_young_gen_sizer->min_desired_young_length(), desired_min_length);
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   572
}
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   573
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   574
size_t G1CollectorPolicy::calculate_young_list_desired_max_length() {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   575
  // Here, we might want to also take into account any additional
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   576
  // constraints (i.e., user-defined minimum bound). Currently, we
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   577
  // effectively don't set this bound.
11397
7dc5c8f572b0 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 11396
diff changeset
   578
  return _young_gen_sizer->max_desired_young_length();
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   579
}
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   580
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   581
void G1CollectorPolicy::update_young_list_target_length(size_t rs_lengths) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   582
  if (rs_lengths == (size_t) -1) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   583
    // if it's set to the default value (-1), we should predict it;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   584
    // otherwise, use the given value.
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   585
    rs_lengths = (size_t) get_new_prediction(_rs_lengths_seq);
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   586
  }
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   587
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   588
  // Calculate the absolute and desired min bounds.
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   589
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   590
  // This is how many young regions we already have (currently: the survivors).
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   591
  size_t base_min_length = recorded_survivor_regions();
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   592
  // This is the absolute minimum young length, which ensures that we
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   593
  // can allocate one eden region in the worst-case.
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   594
  size_t absolute_min_length = base_min_length + 1;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   595
  size_t desired_min_length =
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   596
                     calculate_young_list_desired_min_length(base_min_length);
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   597
  if (desired_min_length < absolute_min_length) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   598
    desired_min_length = absolute_min_length;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   599
  }
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   600
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   601
  // Calculate the absolute and desired max bounds.
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   602
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   603
  // We will try our best not to "eat" into the reserve.
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   604
  size_t absolute_max_length = 0;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   605
  if (_free_regions_at_end_of_collection > _reserve_regions) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   606
    absolute_max_length = _free_regions_at_end_of_collection - _reserve_regions;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   607
  }
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   608
  size_t desired_max_length = calculate_young_list_desired_max_length();
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   609
  if (desired_max_length > absolute_max_length) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   610
    desired_max_length = absolute_max_length;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   611
  }
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   612
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   613
  size_t young_list_target_length = 0;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   614
  if (adaptive_young_list_length()) {
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   615
    if (gcs_are_young()) {
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   616
      young_list_target_length =
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   617
                        calculate_young_list_target_length(rs_lengths,
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   618
                                                           base_min_length,
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   619
                                                           desired_min_length,
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   620
                                                           desired_max_length);
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   621
      _rs_lengths_prediction = rs_lengths;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   622
    } else {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   623
      // Don't calculate anything and let the code below bound it to
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   624
      // the desired_min_length, i.e., do the next GC as soon as
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   625
      // possible to maximize how many old regions we can add to it.
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   626
    }
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   627
  } else {
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
   628
    // The user asked for a fixed young gen so we'll fix the young gen
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
   629
    // whether the next GC is young or mixed.
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
   630
    young_list_target_length = _young_list_fixed_length;
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   631
  }
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   632
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   633
  // Make sure we don't go over the desired max length, nor under the
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   634
  // desired min length. In case they clash, desired_min_length wins
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   635
  // which is why that test is second.
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   636
  if (young_list_target_length > desired_max_length) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   637
    young_list_target_length = desired_max_length;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   638
  }
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   639
  if (young_list_target_length < desired_min_length) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   640
    young_list_target_length = desired_min_length;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   641
  }
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   642
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   643
  assert(young_list_target_length > recorded_survivor_regions(),
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   644
         "we should be able to allocate at least one eden region");
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   645
  assert(young_list_target_length >= absolute_min_length, "post-condition");
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   646
  _young_list_target_length = young_list_target_length;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   647
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   648
  update_max_gc_locker_expansion();
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   649
}
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   650
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   651
size_t
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   652
G1CollectorPolicy::calculate_young_list_target_length(size_t rs_lengths,
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   653
                                                   size_t base_min_length,
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   654
                                                   size_t desired_min_length,
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   655
                                                   size_t desired_max_length) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   656
  assert(adaptive_young_list_length(), "pre-condition");
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   657
  assert(gcs_are_young(), "only call this for young GCs");
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   658
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   659
  // In case some edge-condition makes the desired max length too small...
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   660
  if (desired_max_length <= desired_min_length) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   661
    return desired_min_length;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   662
  }
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   663
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   664
  // We'll adjust min_young_length and max_young_length not to include
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   665
  // the already allocated young regions (i.e., so they reflect the
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   666
  // min and max eden regions we'll allocate). The base_min_length
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   667
  // will be reflected in the predictions by the
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   668
  // survivor_regions_evac_time prediction.
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   669
  assert(desired_min_length > base_min_length, "invariant");
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   670
  size_t min_young_length = desired_min_length - base_min_length;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   671
  assert(desired_max_length > base_min_length, "invariant");
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   672
  size_t max_young_length = desired_max_length - base_min_length;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   673
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   674
  double target_pause_time_ms = _mmu_tracker->max_gc_time() * 1000.0;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   675
  double survivor_regions_evac_time = predict_survivor_regions_evac_time();
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   676
  size_t pending_cards = (size_t) get_new_prediction(_pending_cards_seq);
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   677
  size_t adj_rs_lengths = rs_lengths + predict_rs_length_diff();
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   678
  size_t scanned_cards = predict_young_card_num(adj_rs_lengths);
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   679
  double base_time_ms =
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   680
    predict_base_elapsed_time_ms(pending_cards, scanned_cards) +
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   681
    survivor_regions_evac_time;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   682
  size_t available_free_regions = _free_regions_at_end_of_collection;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   683
  size_t base_free_regions = 0;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   684
  if (available_free_regions > _reserve_regions) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   685
    base_free_regions = available_free_regions - _reserve_regions;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   686
  }
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   687
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   688
  // Here, we will make sure that the shortest young length that
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   689
  // makes sense fits within the target pause time.
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   690
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   691
  if (predict_will_fit(min_young_length, base_time_ms,
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   692
                       base_free_regions, target_pause_time_ms)) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   693
    // The shortest young length will fit into the target pause time;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   694
    // we'll now check whether the absolute maximum number of young
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   695
    // regions will fit in the target pause time. If not, we'll do
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   696
    // a binary search between min_young_length and max_young_length.
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   697
    if (predict_will_fit(max_young_length, base_time_ms,
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   698
                         base_free_regions, target_pause_time_ms)) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   699
      // The maximum young length will fit into the target pause time.
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   700
      // We are done so set min young length to the maximum length (as
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   701
      // the result is assumed to be returned in min_young_length).
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   702
      min_young_length = max_young_length;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   703
    } else {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   704
      // The maximum possible number of young regions will not fit within
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   705
      // the target pause time so we'll search for the optimal
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   706
      // length. The loop invariants are:
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   707
      //
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   708
      // min_young_length < max_young_length
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   709
      // min_young_length is known to fit into the target pause time
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   710
      // max_young_length is known not to fit into the target pause time
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   711
      //
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   712
      // Going into the loop we know the above hold as we've just
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   713
      // checked them. Every time around the loop we check whether
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   714
      // the middle value between min_young_length and
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   715
      // max_young_length fits into the target pause time. If it
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   716
      // does, it becomes the new min. If it doesn't, it becomes
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   717
      // the new max. This way we maintain the loop invariants.
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   718
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   719
      assert(min_young_length < max_young_length, "invariant");
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   720
      size_t diff = (max_young_length - min_young_length) / 2;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   721
      while (diff > 0) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   722
        size_t young_length = min_young_length + diff;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   723
        if (predict_will_fit(young_length, base_time_ms,
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   724
                             base_free_regions, target_pause_time_ms)) {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   725
          min_young_length = young_length;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   726
        } else {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   727
          max_young_length = young_length;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   728
        }
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   729
        assert(min_young_length <  max_young_length, "invariant");
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   730
        diff = (max_young_length - min_young_length) / 2;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   731
      }
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   732
      // The results is min_young_length which, according to the
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   733
      // loop invariants, should fit within the target pause time.
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   734
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   735
      // These are the post-conditions of the binary search above:
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   736
      assert(min_young_length < max_young_length,
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   737
             "otherwise we should have discovered that max_young_length "
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   738
             "fits into the pause target and not done the binary search");
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   739
      assert(predict_will_fit(min_young_length, base_time_ms,
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   740
                              base_free_regions, target_pause_time_ms),
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   741
             "min_young_length, the result of the binary search, should "
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   742
             "fit into the pause target");
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   743
      assert(!predict_will_fit(min_young_length + 1, base_time_ms,
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   744
                               base_free_regions, target_pause_time_ms),
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   745
             "min_young_length, the result of the binary search, should be "
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   746
             "optimal, so no larger length should fit into the pause target");
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   747
    }
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   748
  } else {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   749
    // Even the minimum length doesn't fit into the pause time
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   750
    // target, return it as the result nevertheless.
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   751
  }
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   752
  return base_min_length + min_young_length;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   753
}
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   754
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   755
double G1CollectorPolicy::predict_survivor_regions_evac_time() {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   756
  double survivor_regions_evac_time = 0.0;
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   757
  for (HeapRegion * r = _recorded_survivor_head;
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   758
       r != NULL && r != _recorded_survivor_tail->get_next_young_region();
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   759
       r = r->get_next_young_region()) {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   760
    survivor_regions_evac_time += predict_region_elapsed_time_ms(r, true);
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   761
  }
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   762
  return survivor_regions_evac_time;
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   763
}
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   764
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   765
void G1CollectorPolicy::revise_young_list_target_length_if_necessary() {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   766
  guarantee( adaptive_young_list_length(), "should not call this otherwise" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   767
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   768
  size_t rs_lengths = _g1->young_list()->sampled_rs_lengths();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   769
  if (rs_lengths > _rs_lengths_prediction) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   770
    // add 10% to avoid having to recalculate often
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   771
    size_t rs_lengths_prediction = rs_lengths * 1100 / 1000;
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   772
    update_young_list_target_length(rs_lengths_prediction);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   773
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   774
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   775
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   776
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   777
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   778
HeapWord* G1CollectorPolicy::mem_allocate_work(size_t size,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   779
                                               bool is_tlab,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   780
                                               bool* gc_overhead_limit_was_exceeded) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   781
  guarantee(false, "Not using this policy feature yet.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   782
  return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   783
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   784
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   785
// This method controls how a collector handles one or more
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   786
// of its generations being fully allocated.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   787
HeapWord* G1CollectorPolicy::satisfy_failed_allocation(size_t size,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   788
                                                       bool is_tlab) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   789
  guarantee(false, "Not using this policy feature yet.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   790
  return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   791
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   792
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   793
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   794
#ifndef PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   795
bool G1CollectorPolicy::verify_young_ages() {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   796
  HeapRegion* head = _g1->young_list()->first_region();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   797
  return
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   798
    verify_young_ages(head, _short_lived_surv_rate_group);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   799
  // also call verify_young_ages on any additional surv rate groups
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   800
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   801
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   802
bool
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   803
G1CollectorPolicy::verify_young_ages(HeapRegion* head,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   804
                                     SurvRateGroup *surv_rate_group) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   805
  guarantee( surv_rate_group != NULL, "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   806
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   807
  const char* name = surv_rate_group->name();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   808
  bool ret = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   809
  int prev_age = -1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   810
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   811
  for (HeapRegion* curr = head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   812
       curr != NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   813
       curr = curr->get_next_young_region()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   814
    SurvRateGroup* group = curr->surv_rate_group();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   815
    if (group == NULL && !curr->is_survivor()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   816
      gclog_or_tty->print_cr("## %s: encountered NULL surv_rate_group", name);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   817
      ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   818
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   819
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   820
    if (surv_rate_group == group) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   821
      int age = curr->age_in_surv_rate_group();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   822
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   823
      if (age < 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   824
        gclog_or_tty->print_cr("## %s: encountered negative age", name);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   825
        ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   826
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   827
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   828
      if (age <= prev_age) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   829
        gclog_or_tty->print_cr("## %s: region ages are not strictly increasing "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   830
                               "(%d, %d)", name, age, prev_age);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   831
        ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   832
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   833
      prev_age = age;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   834
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   835
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   836
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   837
  return ret;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   838
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   839
#endif // PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   840
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   841
void G1CollectorPolicy::record_full_collection_start() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   842
  _cur_collection_start_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   843
  // Release the future to-space so that it is available for compaction into.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   844
  _g1->set_full_collection();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   845
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   846
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   847
void G1CollectorPolicy::record_full_collection_end() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   848
  // Consider this like a collection pause for the purposes of allocation
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   849
  // since last pause.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   850
  double end_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   851
  double full_gc_time_sec = end_sec - _cur_collection_start_sec;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   852
  double full_gc_time_ms = full_gc_time_sec * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   853
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   854
  _all_full_gc_times_ms->add(full_gc_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   855
2121
0b899b36d991 6804746: G1: guarantee(variance() > -1.0,"variance should be >= 0") (due to evacuation failure)
tonyp
parents: 2011
diff changeset
   856
  update_recent_gc_times(end_sec, full_gc_time_ms);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   857
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   858
  _g1->clear_full_collection();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   859
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   860
  // "Nuke" the heuristics that control the young/mixed GC
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   861
  // transitions and make sure we start with young GCs after the Full GC.
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   862
  set_gcs_are_young(true);
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   863
  _last_young_gc = false;
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
   864
  clear_initiate_conc_mark_if_possible();
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
   865
  clear_during_initial_mark_pause();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   866
  _known_garbage_bytes = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   867
  _known_garbage_ratio = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   868
  _in_marking_window = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   869
  _in_marking_window_im = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   870
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   871
  _short_lived_surv_rate_group->start_adding_regions();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   872
  // also call this on any additional surv rate groups
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   873
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   874
  record_survivor_regions(0, NULL, NULL);
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   875
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   876
  _free_regions_at_end_of_collection = _g1->free_regions();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   877
  // Reset survivors SurvRateGroup.
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   878
  _survivor_surv_rate_group->reset();
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   879
  update_young_list_target_length();
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
   880
  _collectionSetChooser->clearMarkedHeapRegions();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   881
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   882
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   883
void G1CollectorPolicy::record_stop_world_start() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   884
  _stop_world_start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   885
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   886
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   887
void G1CollectorPolicy::record_collection_pause_start(double start_time_sec,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   888
                                                      size_t start_used) {
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
   889
  if (G1Log::finer()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   890
    gclog_or_tty->stamp(PrintGCTimeStamps);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   891
    gclog_or_tty->print("[GC pause");
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   892
    gclog_or_tty->print(" (%s)", gcs_are_young() ? "young" : "mixed");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   893
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   894
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
   895
  // We only need to do this here as the policy will only be applied
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
   896
  // to the GC we're about to start. so, no point is calculating this
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
   897
  // every time we calculate / recalculate the target young length.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
   898
  update_survivors_policy();
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
   899
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   900
  assert(_g1->used() == _g1->recalculate_used(),
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   901
         err_msg("sanity, used: "SIZE_FORMAT" recalculate_used: "SIZE_FORMAT,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   902
                 _g1->used(), _g1->recalculate_used()));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   903
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   904
  double s_w_t_ms = (start_time_sec - _stop_world_start) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   905
  _all_stop_world_times_ms->add(s_w_t_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   906
  _stop_world_start = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   907
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   908
  _cur_collection_start_sec = start_time_sec;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   909
  _cur_collection_pause_used_at_start_bytes = start_used;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   910
  _cur_collection_pause_used_regions_at_start = _g1->used_regions();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   911
  _pending_cards = _g1->pending_card_num();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   912
  _max_pending_cards = _g1->max_pending_card_num();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   913
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   914
  _bytes_in_collection_set_before_gc = 0;
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10236
diff changeset
   915
  _bytes_copied_during_gc = 0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   916
9987
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
   917
  YoungList* young_list = _g1->young_list();
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
   918
  _eden_bytes_before_gc = young_list->eden_used_bytes();
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
   919
  _survivor_bytes_before_gc = young_list->survivor_used_bytes();
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
   920
  _capacity_before_gc = _g1->capacity();
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
   921
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   922
#ifdef DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   923
  // initialise these to something well known so that we can spot
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   924
  // if they are not set properly
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   925
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   926
  for (int i = 0; i < _parallel_gc_threads; ++i) {
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   927
    _par_last_gc_worker_start_times_ms[i] = -1234.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   928
    _par_last_ext_root_scan_times_ms[i] = -1234.0;
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11397
diff changeset
   929
    _par_last_satb_filtering_times_ms[i] = -1234.0;
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   930
    _par_last_update_rs_times_ms[i] = -1234.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   931
    _par_last_update_rs_processed_buffers[i] = -1234.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   932
    _par_last_scan_rs_times_ms[i] = -1234.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   933
    _par_last_obj_copy_times_ms[i] = -1234.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   934
    _par_last_termination_times_ms[i] = -1234.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   935
    _par_last_termination_attempts[i] = -1234.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   936
    _par_last_gc_worker_end_times_ms[i] = -1234.0;
8925
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
   937
    _par_last_gc_worker_times_ms[i] = -1234.0;
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
   938
    _par_last_gc_worker_other_times_ms[i] = -1234.0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   939
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   940
#endif
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   941
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   942
  for (int i = 0; i < _aux_num; ++i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   943
    _cur_aux_times_ms[i] = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   944
    _cur_aux_times_set[i] = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   945
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   946
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
   947
  // This is initialized to zero here and is set during the evacuation
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
   948
  // pause if we actually waited for the root region scanning to finish.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
   949
  _root_region_scan_wait_time_ms = 0.0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   950
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   951
  _last_gc_was_young = false;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   952
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   953
  // do that for any other surv rate groups
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   954
  _short_lived_surv_rate_group->stop_adding_regions();
5033
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
   955
  _survivors_age_table.clear();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   956
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   957
  assert( verify_young_ages(), "region age verification" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   958
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   959
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
   960
void G1CollectorPolicy::record_concurrent_mark_init_end(double
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   961
                                                   mark_init_elapsed_time_ms) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   962
  _during_marking = true;
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
   963
  assert(!initiate_conc_mark_if_possible(), "we should have cleared it by now");
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
   964
  clear_during_initial_mark_pause();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   965
  _cur_mark_stop_world_time_ms = mark_init_elapsed_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   966
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   967
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   968
void G1CollectorPolicy::record_concurrent_mark_remark_start() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   969
  _mark_remark_start_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   970
  _during_marking = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   971
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   972
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   973
void G1CollectorPolicy::record_concurrent_mark_remark_end() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   974
  double end_time_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   975
  double elapsed_time_ms = (end_time_sec - _mark_remark_start_sec)*1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   976
  _concurrent_mark_remark_times_ms->add(elapsed_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   977
  _cur_mark_stop_world_time_ms += elapsed_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   978
  _prev_collection_pause_end_ms += elapsed_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   979
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   980
  _mmu_tracker->add_pause(_mark_remark_start_sec, end_time_sec, true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   981
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   982
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   983
void G1CollectorPolicy::record_concurrent_mark_cleanup_start() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   984
  _mark_cleanup_start_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   985
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   986
10746
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
   987
void G1CollectorPolicy::record_concurrent_mark_cleanup_completed() {
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
   988
  _last_young_gc = true;
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
   989
  _in_marking_window = false;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   990
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   991
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   992
void G1CollectorPolicy::record_concurrent_pause() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   993
  if (_stop_world_start > 0.0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   994
    double yield_ms = (os::elapsedTime() - _stop_world_start) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   995
    _all_yield_times_ms->add(yield_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   996
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   997
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   998
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   999
void G1CollectorPolicy::record_concurrent_pause_end() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1000
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1001
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1002
template<class T>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1003
T sum_of(T* sum_arr, int start, int n, int N) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1004
  T sum = (T)0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1005
  for (int i = 0; i < n; i++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1006
    int j = (start + i) % N;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1007
    sum += sum_arr[j];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1008
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1009
  return sum;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1010
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1011
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
  1012
void G1CollectorPolicy::print_par_stats(int level,
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
  1013
                                        const char* str,
8925
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1014
                                        double* data) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1015
  double min = data[0], max = data[0];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1016
  double total = 0.0;
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1017
  LineBuffer buf(level);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1018
  buf.append("[%s (ms):", str);
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  1019
  for (uint i = 0; i < no_of_gc_threads(); ++i) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1020
    double val = data[i];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1021
    if (val < min)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1022
      min = val;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1023
    if (val > max)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1024
      max = val;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1025
    total += val;
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1026
    if (G1Log::finest()) {
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1027
      buf.append("  %.1lf", val);
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1028
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1029
  }
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1030
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1031
  if (G1Log::finest()) {
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1032
    buf.append_and_print_cr("");
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1033
  }
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  1034
  double avg = total / (double) no_of_gc_threads();
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1035
  buf.append_and_print_cr(" Avg: %.1lf Min: %.1lf Max: %.1lf Diff: %.1lf]",
8925
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1036
    avg, min, max, max - min);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1037
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1038
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
  1039
void G1CollectorPolicy::print_par_sizes(int level,
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
  1040
                                        const char* str,
8925
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1041
                                        double* data) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1042
  double min = data[0], max = data[0];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1043
  double total = 0.0;
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1044
  LineBuffer buf(level);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1045
  buf.append("[%s :", str);
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  1046
  for (uint i = 0; i < no_of_gc_threads(); ++i) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1047
    double val = data[i];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1048
    if (val < min)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1049
      min = val;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1050
    if (val > max)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1051
      max = val;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1052
    total += val;
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1053
    buf.append(" %d", (int) val);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1054
  }
8925
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1055
  buf.append_and_print_cr("");
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  1056
  double avg = total / (double) no_of_gc_threads();
8925
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1057
  buf.append_and_print_cr(" Sum: %d, Avg: %d, Min: %d, Max: %d, Diff: %d]",
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1058
    (int)total, (int)avg, (int)min, (int)max, (int)max - (int)min);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1059
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1060
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1061
void G1CollectorPolicy::print_stats(int level,
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1062
                                    const char* str,
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1063
                                    double value) {
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1064
  LineBuffer(level).append_and_print_cr("[%s: %5.1lf ms]", str, value);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1065
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1066
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1067
void G1CollectorPolicy::print_stats(int level,
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1068
                                    const char* str,
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1069
                                    int value) {
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1070
  LineBuffer(level).append_and_print_cr("[%s: %d]", str, value);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1071
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1072
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1073
double G1CollectorPolicy::avg_value(double* data) {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
  1074
  if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1075
    double ret = 0.0;
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  1076
    for (uint i = 0; i < no_of_gc_threads(); ++i) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1077
      ret += data[i];
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1078
    }
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  1079
    return ret / (double) no_of_gc_threads();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1080
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1081
    return data[0];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1082
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1083
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1084
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1085
double G1CollectorPolicy::max_value(double* data) {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
  1086
  if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1087
    double ret = data[0];
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  1088
    for (uint i = 1; i < no_of_gc_threads(); ++i) {
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1089
      if (data[i] > ret) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1090
        ret = data[i];
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1091
      }
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1092
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1093
    return ret;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1094
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1095
    return data[0];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1096
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1097
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1098
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1099
double G1CollectorPolicy::sum_of_values(double* data) {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
  1100
  if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1101
    double sum = 0.0;
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  1102
    for (uint i = 0; i < no_of_gc_threads(); i++) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1103
      sum += data[i];
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1104
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1105
    return sum;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1106
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1107
    return data[0];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1108
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1109
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1110
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1111
double G1CollectorPolicy::max_sum(double* data1, double* data2) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1112
  double ret = data1[0] + data2[0];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1113
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
  1114
  if (G1CollectedHeap::use_parallel_gc_threads()) {
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  1115
    for (uint i = 1; i < no_of_gc_threads(); ++i) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1116
      double data = data1[i] + data2[i];
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1117
      if (data > ret) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1118
        ret = data;
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1119
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1120
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1121
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1122
  return ret;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1123
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1124
11581
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11576
diff changeset
  1125
bool G1CollectorPolicy::need_to_start_conc_mark(const char* source, size_t alloc_word_size) {
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11576
diff changeset
  1126
  if (_g1->concurrent_mark()->cmThread()->during_cycle()) {
11576
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1127
    return false;
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1128
  }
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1129
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1130
  size_t marking_initiating_used_threshold =
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1131
    (_g1->capacity() / 100) * InitiatingHeapOccupancyPercent;
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1132
  size_t cur_used_bytes = _g1->non_young_capacity_bytes();
11581
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11576
diff changeset
  1133
  size_t alloc_byte_size = alloc_word_size * HeapWordSize;
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11576
diff changeset
  1134
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11576
diff changeset
  1135
  if ((cur_used_bytes + alloc_byte_size) > marking_initiating_used_threshold) {
11576
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1136
    if (gcs_are_young()) {
11581
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11576
diff changeset
  1137
      ergo_verbose5(ErgoConcCycles,
11576
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1138
        "request concurrent cycle initiation",
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1139
        ergo_format_reason("occupancy higher than threshold")
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1140
        ergo_format_byte("occupancy")
11581
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11576
diff changeset
  1141
        ergo_format_byte("allocation request")
11576
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1142
        ergo_format_byte_perc("threshold")
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1143
        ergo_format_str("source"),
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1144
        cur_used_bytes,
11581
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11576
diff changeset
  1145
        alloc_byte_size,
11576
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1146
        marking_initiating_used_threshold,
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1147
        (double) InitiatingHeapOccupancyPercent,
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1148
        source);
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1149
      return true;
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1150
    } else {
11581
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11576
diff changeset
  1151
      ergo_verbose5(ErgoConcCycles,
11576
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1152
        "do not request concurrent cycle initiation",
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1153
        ergo_format_reason("still doing mixed collections")
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1154
        ergo_format_byte("occupancy")
11581
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11576
diff changeset
  1155
        ergo_format_byte("allocation request")
11576
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1156
        ergo_format_byte_perc("threshold")
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1157
        ergo_format_str("source"),
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1158
        cur_used_bytes,
11581
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11576
diff changeset
  1159
        alloc_byte_size,
11576
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1160
        marking_initiating_used_threshold,
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1161
        (double) InitiatingHeapOccupancyPercent,
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1162
        source);
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1163
    }
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1164
  }
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1165
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1166
  return false;
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1167
}
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1168
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1169
// Anything below that is considered to be zero
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1170
#define MIN_TIMER_GRANULARITY 0.0000001
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1171
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  1172
void G1CollectorPolicy::record_collection_pause_end(int no_of_gc_threads) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1173
  double end_time_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1174
  double elapsed_ms = _last_pause_time_ms;
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
  1175
  bool parallel = G1CollectedHeap::use_parallel_gc_threads();
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1176
  assert(_cur_collection_pause_used_regions_at_start >= cset_region_length(),
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1177
         "otherwise, the subtraction below does not make sense");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1178
  size_t rs_size =
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1179
            _cur_collection_pause_used_regions_at_start - cset_region_length();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1180
  size_t cur_used_bytes = _g1->used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1181
  assert(cur_used_bytes == _g1->recalculate_used(), "It should!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1182
  bool last_pause_included_initial_mark = false;
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1183
  bool update_stats = !_g1->evacuation_failed();
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  1184
  set_no_of_gc_threads(no_of_gc_threads);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1185
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1186
#ifndef PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1187
  if (G1YoungSurvRateVerbose) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1188
    gclog_or_tty->print_cr("");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1189
    _short_lived_surv_rate_group->print();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1190
    // do that for any other surv rate groups too
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1191
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1192
#endif // PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1193
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  1194
  last_pause_included_initial_mark = during_initial_mark_pause();
11576
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1195
  if (last_pause_included_initial_mark) {
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  1196
    record_concurrent_mark_init_end(0.0);
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  1197
  } else if (!_last_young_gc && need_to_start_conc_mark("end of GC")) {
11576
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1198
    // Note: this might have already been set, if during the last
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1199
    // pause we decided to start a cycle but at the beginning of
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1200
    // this pause we decided to postpone it. That's OK.
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1201
    set_initiate_conc_mark_if_possible();
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1202
  }
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  1203
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1204
  _mmu_tracker->add_pause(end_time_sec - elapsed_ms/1000.0,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1205
                          end_time_sec, false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1206
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1207
  // This assert is exempted when we're doing parallel collection pauses,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1208
  // because the fragmentation caused by the parallel GC allocation buffers
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1209
  // can lead to more memory being used during collection than was used
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1210
  // before. Best leave this out until the fragmentation problem is fixed.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1211
  // Pauses in which evacuation failed can also lead to negative
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1212
  // collections, since no space is reclaimed from a region containing an
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1213
  // object whose evacuation failed.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1214
  // Further, we're now always doing parallel collection.  But I'm still
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1215
  // leaving this here as a placeholder for a more precise assertion later.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1216
  // (DLD, 10/05.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1217
  assert((true || parallel) // Always using GC LABs now.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1218
         || _g1->evacuation_failed()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1219
         || _cur_collection_pause_used_at_start_bytes >= cur_used_bytes,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1220
         "Negative collection");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1221
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1222
  size_t freed_bytes =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1223
    _cur_collection_pause_used_at_start_bytes - cur_used_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1224
  size_t surviving_bytes = _collection_set_bytes_used_before - freed_bytes;
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1225
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1226
  double survival_fraction =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1227
    (double)surviving_bytes/
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1228
    (double)_collection_set_bytes_used_before;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1229
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1230
  // These values are used to update the summary information that is
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1231
  // displayed when TraceGen0Time is enabled, and are output as part
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1232
  // of the "finer" output, in the non-parallel case.
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1233
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1234
  double ext_root_scan_time = avg_value(_par_last_ext_root_scan_times_ms);
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11397
diff changeset
  1235
  double satb_filtering_time = avg_value(_par_last_satb_filtering_times_ms);
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1236
  double update_rs_time = avg_value(_par_last_update_rs_times_ms);
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1237
  double update_rs_processed_buffers =
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1238
    sum_of_values(_par_last_update_rs_processed_buffers);
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1239
  double scan_rs_time = avg_value(_par_last_scan_rs_times_ms);
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1240
  double obj_copy_time = avg_value(_par_last_obj_copy_times_ms);
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1241
  double termination_time = avg_value(_par_last_termination_times_ms);
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1242
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1243
  double known_time = ext_root_scan_time +
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11397
diff changeset
  1244
                      satb_filtering_time +
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1245
                      update_rs_time +
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1246
                      scan_rs_time +
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1247
                      obj_copy_time;
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1248
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1249
  double other_time_ms = elapsed_ms;
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1250
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
  1251
  // Subtract the root region scanning wait time. It's initialized to
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
  1252
  // zero at the start of the pause.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
  1253
  other_time_ms -= _root_region_scan_wait_time_ms;
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
  1254
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1255
  if (parallel) {
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1256
    other_time_ms -= _cur_collection_par_time_ms;
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1257
  } else {
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1258
    other_time_ms -= known_time;
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1259
  }
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1260
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12228
diff changeset
  1261
  // Now subtract the time taken to fix up roots in generated code
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12228
diff changeset
  1262
  other_time_ms -= _cur_collection_code_root_fixup_time_ms;
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12228
diff changeset
  1263
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1264
  // Subtract the time taken to clean the card table from the
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1265
  // current value of "other time"
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1266
  other_time_ms -= _cur_clear_ct_time_ms;
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1267
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1268
  // TraceGen0Time and TraceGen1Time summary info updating.
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1269
  _all_pause_times_ms->add(elapsed_ms);
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1270
2121
0b899b36d991 6804746: G1: guarantee(variance() > -1.0,"variance should be >= 0") (due to evacuation failure)
tonyp
parents: 2011
diff changeset
  1271
  if (update_stats) {
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1272
    _summary->record_total_time_ms(elapsed_ms);
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1273
    _summary->record_other_time_ms(other_time_ms);
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1274
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1275
    MainBodySummary* body_summary = _summary->main_body_summary();
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1276
    assert(body_summary != NULL, "should not be null!");
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1277
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
  1278
    body_summary->record_root_region_scan_wait_time_ms(
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
  1279
                                               _root_region_scan_wait_time_ms);
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1280
    body_summary->record_ext_root_scan_time_ms(ext_root_scan_time);
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11397
diff changeset
  1281
    body_summary->record_satb_filtering_time_ms(satb_filtering_time);
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1282
    body_summary->record_update_rs_time_ms(update_rs_time);
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1283
    body_summary->record_scan_rs_time_ms(scan_rs_time);
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1284
    body_summary->record_obj_copy_time_ms(obj_copy_time);
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1285
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1286
    if (parallel) {
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1287
      body_summary->record_parallel_time_ms(_cur_collection_par_time_ms);
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1288
      body_summary->record_termination_time_ms(termination_time);
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1289
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1290
      double parallel_known_time = known_time + termination_time;
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1291
      double parallel_other_time = _cur_collection_par_time_ms - parallel_known_time;
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1292
      body_summary->record_parallel_other_time_ms(parallel_other_time);
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1293
    }
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1294
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1295
    body_summary->record_clear_ct_time_ms(_cur_clear_ct_time_ms);
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1296
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1297
    // We exempt parallel collection from this check because Alloc Buffer
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1298
    // fragmentation can produce negative collections.  Same with evac
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1299
    // failure.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1300
    // Further, we're now always doing parallel collection.  But I'm still
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1301
    // leaving this here as a placeholder for a more precise assertion later.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1302
    // (DLD, 10/05.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1303
    assert((true || parallel)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1304
           || _g1->evacuation_failed()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1305
           || surviving_bytes <= _collection_set_bytes_used_before,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1306
           "Or else negative collection!");
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1307
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1308
    // this is where we update the allocation rate of the application
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1309
    double app_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1310
      (_cur_collection_start_sec * 1000.0 - _prev_collection_pause_end_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1311
    if (app_time_ms < MIN_TIMER_GRANULARITY) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1312
      // This usually happens due to the timer not having the required
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1313
      // granularity. Some Linuxes are the usual culprits.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1314
      // We'll just set it to something (arbitrarily) small.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1315
      app_time_ms = 1.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1316
    }
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1317
    // We maintain the invariant that all objects allocated by mutator
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1318
    // threads will be allocated out of eden regions. So, we can use
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1319
    // the eden region number allocated since the previous GC to
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1320
    // calculate the application's allocate rate. The only exception
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1321
    // to that is humongous objects that are allocated separately. But
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1322
    // given that humongous object allocations do not really affect
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1323
    // either the pause's duration nor when the next pause will take
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1324
    // place we can safely ignore them here.
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1325
    size_t regions_allocated = eden_cset_region_length();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1326
    double alloc_rate_ms = (double) regions_allocated / app_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1327
    _alloc_rate_ms_seq->add(alloc_rate_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1328
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1329
    double interval_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1330
      (end_time_sec - _recent_prev_end_times_for_all_gcs_sec->oldest()) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1331
    update_recent_gc_times(end_time_sec, elapsed_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1332
    _recent_avg_pause_time_ratio = _recent_gc_times_ms->sum()/interval_ms;
4456
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1333
    if (recent_avg_pause_time_ratio() < 0.0 ||
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1334
        (recent_avg_pause_time_ratio() - 1.0 > 0.0)) {
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1335
#ifndef PRODUCT
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1336
      // Dump info to allow post-facto debugging
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1337
      gclog_or_tty->print_cr("recent_avg_pause_time_ratio() out of bounds");
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1338
      gclog_or_tty->print_cr("-------------------------------------------");
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1339
      gclog_or_tty->print_cr("Recent GC Times (ms):");
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1340
      _recent_gc_times_ms->dump();
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1341
      gclog_or_tty->print_cr("(End Time=%3.3f) Recent GC End Times (s):", end_time_sec);
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1342
      _recent_prev_end_times_for_all_gcs_sec->dump();
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1343
      gclog_or_tty->print_cr("GC = %3.3f, Interval = %3.3f, Ratio = %3.3f",
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1344
                             _recent_gc_times_ms->sum(), interval_ms, recent_avg_pause_time_ratio());
4457
f05d2dc1c332 6902701: G1: protect debugging code related to 6898948 with a debug flag
ysr
parents: 4456
diff changeset
  1345
      // In debug mode, terminate the JVM if the user wants to debug at this point.
f05d2dc1c332 6902701: G1: protect debugging code related to 6898948 with a debug flag
ysr
parents: 4456
diff changeset
  1346
      assert(!G1FailOnFPError, "Debugging data for CR 6898948 has been dumped above");
f05d2dc1c332 6902701: G1: protect debugging code related to 6898948 with a debug flag
ysr
parents: 4456
diff changeset
  1347
#endif  // !PRODUCT
f05d2dc1c332 6902701: G1: protect debugging code related to 6898948 with a debug flag
ysr
parents: 4456
diff changeset
  1348
      // Clip ratio between 0.0 and 1.0, and continue. This will be fixed in
f05d2dc1c332 6902701: G1: protect debugging code related to 6898948 with a debug flag
ysr
parents: 4456
diff changeset
  1349
      // CR 6902692 by redoing the manner in which the ratio is incrementally computed.
4456
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1350
      if (_recent_avg_pause_time_ratio < 0.0) {
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1351
        _recent_avg_pause_time_ratio = 0.0;
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1352
      } else {
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1353
        assert(_recent_avg_pause_time_ratio - 1.0 > 0.0, "Ctl-point invariant");
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1354
        _recent_avg_pause_time_ratio = 1.0;
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1355
      }
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1356
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1357
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1358
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1359
  for (int i = 0; i < _aux_num; ++i) {
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1360
    if (_cur_aux_times_set[i]) {
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1361
      _all_aux_times_ms[i].add(_cur_aux_times_ms[i]);
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1362
    }
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1363
  }
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1364
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1365
  if (G1Log::finer()) {
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1366
    bool print_marking_info =
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1367
      _g1->mark_in_progress() && !last_pause_included_initial_mark;
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1368
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1369
    gclog_or_tty->print_cr("%s, %1.8lf secs]",
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1370
                           (last_pause_included_initial_mark) ? " (initial-mark)" : "",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1371
                           elapsed_ms / 1000.0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1372
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
  1373
    if (_root_region_scan_wait_time_ms > 0.0) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
  1374
      print_stats(1, "Root Region Scan Waiting", _root_region_scan_wait_time_ms);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
  1375
    }
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1376
    if (parallel) {
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1377
      print_stats(1, "Parallel Time", _cur_collection_par_time_ms);
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1378
      print_par_stats(2, "GC Worker Start", _par_last_gc_worker_start_times_ms);
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1379
      print_par_stats(2, "Ext Root Scanning", _par_last_ext_root_scan_times_ms);
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1380
      if (print_marking_info) {
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11397
diff changeset
  1381
        print_par_stats(2, "SATB Filtering", _par_last_satb_filtering_times_ms);
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1382
      }
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1383
      print_par_stats(2, "Update RS", _par_last_update_rs_times_ms);
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1384
      if (G1Log::finest()) {
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1385
        print_par_sizes(3, "Processed Buffers", _par_last_update_rs_processed_buffers);
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1386
      }
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1387
      print_par_stats(2, "Scan RS", _par_last_scan_rs_times_ms);
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1388
      print_par_stats(2, "Object Copy", _par_last_obj_copy_times_ms);
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1389
      print_par_stats(2, "Termination", _par_last_termination_times_ms);
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1390
      if (G1Log::finest()) {
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1391
        print_par_sizes(3, "Termination Attempts", _par_last_termination_attempts);
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1392
      }
8925
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1393
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1394
      for (int i = 0; i < _parallel_gc_threads; i++) {
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12228
diff changeset
  1395
        _par_last_gc_worker_times_ms[i] = _par_last_gc_worker_end_times_ms[i] -
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12228
diff changeset
  1396
                                          _par_last_gc_worker_start_times_ms[i];
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1397
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1398
        double worker_known_time = _par_last_ext_root_scan_times_ms[i] +
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11397
diff changeset
  1399
                                   _par_last_satb_filtering_times_ms[i] +
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1400
                                   _par_last_update_rs_times_ms[i] +
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1401
                                   _par_last_scan_rs_times_ms[i] +
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1402
                                   _par_last_obj_copy_times_ms[i] +
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1403
                                   _par_last_termination_times_ms[i];
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1404
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12228
diff changeset
  1405
        _par_last_gc_worker_other_times_ms[i] = _par_last_gc_worker_times_ms[i] -
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12228
diff changeset
  1406
                                                worker_known_time;
8925
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1407
      }
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12228
diff changeset
  1408
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1409
      print_par_stats(2, "GC Worker Other", _par_last_gc_worker_other_times_ms);
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12228
diff changeset
  1410
      print_par_stats(2, "GC Worker Total", _par_last_gc_worker_times_ms);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12228
diff changeset
  1411
      print_par_stats(2, "GC Worker End", _par_last_gc_worker_end_times_ms);
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1412
    } else {
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1413
      print_stats(1, "Ext Root Scanning", ext_root_scan_time);
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1414
      if (print_marking_info) {
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11397
diff changeset
  1415
        print_stats(1, "SATB Filtering", satb_filtering_time);
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1416
      }
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1417
      print_stats(1, "Update RS", update_rs_time);
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1418
      if (G1Log::finest()) {
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1419
        print_stats(2, "Processed Buffers", (int)update_rs_processed_buffers);
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1420
      }
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1421
      print_stats(1, "Scan RS", scan_rs_time);
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1422
      print_stats(1, "Object Copying", obj_copy_time);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1423
    }
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12228
diff changeset
  1424
    print_stats(1, "Code Root Fixup", _cur_collection_code_root_fixup_time_ms);
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1425
    print_stats(1, "Clear CT", _cur_clear_ct_time_ms);
3590
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
  1426
#ifndef PRODUCT
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
  1427
    print_stats(1, "Cur Clear CC", _cur_clear_cc_time_ms);
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
  1428
    print_stats(1, "Cum Clear CC", _cum_clear_cc_time_ms);
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
  1429
    print_stats(1, "Min Clear CC", _min_clear_cc_time_ms);
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
  1430
    print_stats(1, "Max Clear CC", _max_clear_cc_time_ms);
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
  1431
    if (_num_cc_clears > 0) {
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
  1432
      print_stats(1, "Avg Clear CC", _cum_clear_cc_time_ms / ((double)_num_cc_clears));
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
  1433
    }
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
  1434
#endif
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1435
    print_stats(1, "Other", other_time_ms);
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11175
diff changeset
  1436
    print_stats(2, "Choose CSet",
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11175
diff changeset
  1437
                   (_recorded_young_cset_choice_time_ms +
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11175
diff changeset
  1438
                    _recorded_non_young_cset_choice_time_ms));
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10667
diff changeset
  1439
    print_stats(2, "Ref Proc", _cur_ref_proc_time_ms);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10667
diff changeset
  1440
    print_stats(2, "Ref Enq", _cur_ref_enq_time_ms);
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11175
diff changeset
  1441
    print_stats(2, "Free CSet",
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11175
diff changeset
  1442
                   (_recorded_young_free_cset_time_ms +
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11175
diff changeset
  1443
                    _recorded_non_young_free_cset_time_ms));
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1444
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1445
    for (int i = 0; i < _aux_num; ++i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1446
      if (_cur_aux_times_set[i]) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1447
        char buffer[96];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1448
        sprintf(buffer, "Aux%d", i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1449
        print_stats(1, buffer, _cur_aux_times_ms[i]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1450
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1451
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1452
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1453
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1454
  // Update the efficiency-since-mark vars.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1455
  double proc_ms = elapsed_ms * (double) _parallel_gc_threads;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1456
  if (elapsed_ms < MIN_TIMER_GRANULARITY) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1457
    // This usually happens due to the timer not having the required
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1458
    // granularity. Some Linuxes are the usual culprits.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1459
    // We'll just set it to something (arbitrarily) small.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1460
    proc_ms = 1.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1461
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1462
  double cur_efficiency = (double) freed_bytes / proc_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1463
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1464
  bool new_in_marking_window = _in_marking_window;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1465
  bool new_in_marking_window_im = false;
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1466
  if (during_initial_mark_pause()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1467
    new_in_marking_window = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1468
    new_in_marking_window_im = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1469
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1470
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1471
  if (_last_young_gc) {
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  1472
    // This is supposed to to be the "last young GC" before we start
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  1473
    // doing mixed GCs. Here we decide whether to start mixed GCs or not.
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  1474
10673
8235e1a1b41b 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 10670
diff changeset
  1475
    if (!last_pause_included_initial_mark) {
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  1476
      if (next_gc_should_be_mixed("start mixed GCs",
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  1477
                                  "do not start mixed GCs")) {
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  1478
        set_gcs_are_young(false);
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  1479
      }
10673
8235e1a1b41b 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 10670
diff changeset
  1480
    } else {
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1481
      ergo_verbose0(ErgoMixedGCs,
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1482
                    "do not start mixed GCs",
10673
8235e1a1b41b 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 10670
diff changeset
  1483
                    ergo_format_reason("concurrent cycle is about to start"));
8235e1a1b41b 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 10670
diff changeset
  1484
    }
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1485
    _last_young_gc = false;
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  1486
  }
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  1487
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1488
  if (!_last_gc_was_young) {
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  1489
    // This is a mixed GC. Here we decide whether to continue doing
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  1490
    // mixed GCs or not.
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  1491
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  1492
    if (!next_gc_should_be_mixed("continue mixed GCs",
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  1493
                                 "do not continue mixed GCs")) {
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1494
      set_gcs_are_young(true);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1495
    }
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  1496
  }
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1497
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1498
  if (_last_gc_was_young && !_during_marking) {
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  1499
    _young_gc_eff_seq->add(cur_efficiency);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1500
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1501
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1502
  _short_lived_surv_rate_group->start_adding_regions();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1503
  // do that for any other surv rate groupsx
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1504
2344
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2260
diff changeset
  1505
  if (update_stats) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1506
    double pause_time_ms = elapsed_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1507
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1508
    size_t diff = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1509
    if (_max_pending_cards >= _pending_cards)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1510
      diff = _max_pending_cards - _pending_cards;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1511
    _pending_card_diff_seq->add((double) diff);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1512
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1513
    double cost_per_card_ms = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1514
    if (_pending_cards > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1515
      cost_per_card_ms = update_rs_time / (double) _pending_cards;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1516
      _cost_per_card_ms_seq->add(cost_per_card_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1517
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1518
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1519
    size_t cards_scanned = _g1->cards_scanned();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1520
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1521
    double cost_per_entry_ms = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1522
    if (cards_scanned > 10) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1523
      cost_per_entry_ms = scan_rs_time / (double) cards_scanned;
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1524
      if (_last_gc_was_young) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1525
        _cost_per_entry_ms_seq->add(cost_per_entry_ms);
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1526
      } else {
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1527
        _mixed_cost_per_entry_ms_seq->add(cost_per_entry_ms);
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1528
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1529
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1530
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1531
    if (_max_rs_lengths > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1532
      double cards_per_entry_ratio =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1533
        (double) cards_scanned / (double) _max_rs_lengths;
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1534
      if (_last_gc_was_young) {
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1535
        _young_cards_per_entry_ratio_seq->add(cards_per_entry_ratio);
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1536
      } else {
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1537
        _mixed_cards_per_entry_ratio_seq->add(cards_per_entry_ratio);
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1538
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1539
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1540
11395
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  1541
    // This is defensive. For a while _max_rs_lengths could get
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  1542
    // smaller than _recorded_rs_lengths which was causing
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  1543
    // rs_length_diff to get very large and mess up the RSet length
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  1544
    // predictions. The reason was unsafe concurrent updates to the
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  1545
    // _inc_cset_recorded_rs_lengths field which the code below guards
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  1546
    // against (see CR 7118202). This bug has now been fixed (see CR
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  1547
    // 7119027). However, I'm still worried that
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  1548
    // _inc_cset_recorded_rs_lengths might still end up somewhat
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  1549
    // inaccurate. The concurrent refinement thread calculates an
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  1550
    // RSet's length concurrently with other CR threads updating it
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  1551
    // which might cause it to calculate the length incorrectly (if,
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  1552
    // say, it's in mid-coarsening). So I'll leave in the defensive
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  1553
    // conditional below just in case.
11206
040c80ccd07f 7118202: G1: eden size unnecessarily drops to a minimum
tonyp
parents: 11176
diff changeset
  1554
    size_t rs_length_diff = 0;
040c80ccd07f 7118202: G1: eden size unnecessarily drops to a minimum
tonyp
parents: 11176
diff changeset
  1555
    if (_max_rs_lengths > _recorded_rs_lengths) {
040c80ccd07f 7118202: G1: eden size unnecessarily drops to a minimum
tonyp
parents: 11176
diff changeset
  1556
      rs_length_diff = _max_rs_lengths - _recorded_rs_lengths;
040c80ccd07f 7118202: G1: eden size unnecessarily drops to a minimum
tonyp
parents: 11176
diff changeset
  1557
    }
040c80ccd07f 7118202: G1: eden size unnecessarily drops to a minimum
tonyp
parents: 11176
diff changeset
  1558
    _rs_length_diff_seq->add((double) rs_length_diff);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1559
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1560
    size_t copied_bytes = surviving_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1561
    double cost_per_byte_ms = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1562
    if (copied_bytes > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1563
      cost_per_byte_ms = obj_copy_time / (double) copied_bytes;
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1564
      if (_in_marking_window) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1565
        _cost_per_byte_ms_during_cm_seq->add(cost_per_byte_ms);
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1566
      } else {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1567
        _cost_per_byte_ms_seq->add(cost_per_byte_ms);
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1568
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1569
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1570
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1571
    double all_other_time_ms = pause_time_ms -
12272
f87fd1292095 7127697: G1: remove dead code after recent concurrent mark changes
tonyp
parents: 12270
diff changeset
  1572
      (update_rs_time + scan_rs_time + obj_copy_time + termination_time);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1573
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1574
    double young_other_time_ms = 0.0;
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1575
    if (young_cset_region_length() > 0) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1576
      young_other_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1577
        _recorded_young_cset_choice_time_ms +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1578
        _recorded_young_free_cset_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1579
      _young_other_cost_per_region_ms_seq->add(young_other_time_ms /
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1580
                                          (double) young_cset_region_length());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1581
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1582
    double non_young_other_time_ms = 0.0;
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1583
    if (old_cset_region_length() > 0) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1584
      non_young_other_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1585
        _recorded_non_young_cset_choice_time_ms +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1586
        _recorded_non_young_free_cset_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1587
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1588
      _non_young_other_cost_per_region_ms_seq->add(non_young_other_time_ms /
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1589
                                            (double) old_cset_region_length());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1590
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1591
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1592
    double constant_other_time_ms = all_other_time_ms -
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1593
      (young_other_time_ms + non_young_other_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1594
    _constant_other_time_ms_seq->add(constant_other_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1595
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1596
    double survival_ratio = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1597
    if (_bytes_in_collection_set_before_gc > 0) {
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10236
diff changeset
  1598
      survival_ratio = (double) _bytes_copied_during_gc /
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10236
diff changeset
  1599
                                   (double) _bytes_in_collection_set_before_gc;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1600
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1601
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1602
    _pending_cards_seq->add((double) _pending_cards);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1603
    _rs_lengths_seq->add((double) _max_rs_lengths);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1604
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1605
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1606
  _in_marking_window = new_in_marking_window;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1607
  _in_marking_window_im = new_in_marking_window_im;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1608
  _free_regions_at_end_of_collection = _g1->free_regions();
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
  1609
  update_young_list_target_length();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1610
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1611
  // Note that _mmu_tracker->max_gc_time() returns the time in seconds.
5033
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
  1612
  double update_rs_time_goal_ms = _mmu_tracker->max_gc_time() * MILLIUNITS * G1RSetUpdatingPauseTimePercent / 100.0;
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1613
  adjust_concurrent_refinement(update_rs_time, update_rs_processed_buffers, update_rs_time_goal_ms);
10746
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  1614
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  1615
  assert(assertMarkedBytesDataOK(), "Marked regions not OK at pause end.");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1616
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1617
9987
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1618
#define EXT_SIZE_FORMAT "%d%s"
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1619
#define EXT_SIZE_PARAMS(bytes)                                  \
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1620
  byte_size_in_proper_unit((bytes)),                            \
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1621
  proper_unit_for_byte_size((bytes))
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1622
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1623
void G1CollectorPolicy::print_heap_transition() {
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1624
  if (G1Log::finer()) {
9987
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1625
    YoungList* young_list = _g1->young_list();
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1626
    size_t eden_bytes = young_list->eden_used_bytes();
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1627
    size_t survivor_bytes = young_list->survivor_used_bytes();
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1628
    size_t used_before_gc = _cur_collection_pause_used_at_start_bytes;
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1629
    size_t used = _g1->used();
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1630
    size_t capacity = _g1->capacity();
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1631
    size_t eden_capacity =
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1632
      (_young_list_target_length * HeapRegion::GrainBytes) - survivor_bytes;
9987
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1633
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1634
    gclog_or_tty->print_cr(
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1635
      "   [Eden: "EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")->"EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT") "
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1636
      "Survivors: "EXT_SIZE_FORMAT"->"EXT_SIZE_FORMAT" "
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1637
      "Heap: "EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")->"
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1638
      EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")]",
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1639
      EXT_SIZE_PARAMS(_eden_bytes_before_gc),
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1640
      EXT_SIZE_PARAMS(_prev_eden_capacity),
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1641
      EXT_SIZE_PARAMS(eden_bytes),
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1642
      EXT_SIZE_PARAMS(eden_capacity),
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1643
      EXT_SIZE_PARAMS(_survivor_bytes_before_gc),
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1644
      EXT_SIZE_PARAMS(survivor_bytes),
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1645
      EXT_SIZE_PARAMS(used_before_gc),
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1646
      EXT_SIZE_PARAMS(_capacity_before_gc),
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1647
      EXT_SIZE_PARAMS(used),
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1648
      EXT_SIZE_PARAMS(capacity));
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1649
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1650
    _prev_eden_capacity = eden_capacity;
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12272
diff changeset
  1651
  } else if (G1Log::fine()) {
9987
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1652
    _g1->print_size_transition(gclog_or_tty,
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1653
                               _cur_collection_pause_used_at_start_bytes,
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1654
                               _g1->used(), _g1->capacity());
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1655
  }
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1656
}
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1657
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1658
void G1CollectorPolicy::adjust_concurrent_refinement(double update_rs_time,
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1659
                                                     double update_rs_processed_buffers,
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1660
                                                     double goal_ms) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1661
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1662
  ConcurrentG1Refine *cg1r = G1CollectedHeap::heap()->concurrent_g1_refine();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1663
5033
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
  1664
  if (G1UseAdaptiveConcRefinement) {
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1665
    const int k_gy = 3, k_gr = 6;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1666
    const double inc_k = 1.1, dec_k = 0.9;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1667
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1668
    int g = cg1r->green_zone();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1669
    if (update_rs_time > goal_ms) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1670
      g = (int)(g * dec_k);  // Can become 0, that's OK. That would mean a mutator-only processing.
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1671
    } else {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1672
      if (update_rs_time < goal_ms && update_rs_processed_buffers > g) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1673
        g = (int)MAX2(g * inc_k, g + 1.0);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1674
      }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1675
    }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1676
    // Change the refinement threads params
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1677
    cg1r->set_green_zone(g);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1678
    cg1r->set_yellow_zone(g * k_gy);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1679
    cg1r->set_red_zone(g * k_gr);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1680
    cg1r->reinitialize_threads();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1681
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1682
    int processing_threshold_delta = MAX2((int)(cg1r->green_zone() * sigma()), 1);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1683
    int processing_threshold = MIN2(cg1r->green_zone() + processing_threshold_delta,
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1684
                                    cg1r->yellow_zone());
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1685
    // Change the barrier params
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1686
    dcqs.set_process_completed_threshold(processing_threshold);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1687
    dcqs.set_max_completed_queue(cg1r->red_zone());
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1688
  }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1689
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1690
  int curr_queue_size = dcqs.completed_buffers_num();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1691
  if (curr_queue_size >= cg1r->yellow_zone()) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1692
    dcqs.set_completed_queue_padding(curr_queue_size);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1693
  } else {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1694
    dcqs.set_completed_queue_padding(0);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1695
  }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1696
  dcqs.notify_if_necessary();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1697
}
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1698
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1699
double
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1700
G1CollectorPolicy::predict_base_elapsed_time_ms(size_t pending_cards) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1701
  size_t rs_length = predict_rs_length_diff();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1702
  size_t card_num;
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1703
  if (gcs_are_young()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1704
    card_num = predict_young_card_num(rs_length);
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1705
  } else {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1706
    card_num = predict_non_young_card_num(rs_length);
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1707
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1708
  return predict_base_elapsed_time_ms(pending_cards, card_num);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1709
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1710
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1711
double
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1712
G1CollectorPolicy::predict_base_elapsed_time_ms(size_t pending_cards,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1713
                                                size_t scanned_cards) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1714
  return
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1715
    predict_rs_update_time_ms(pending_cards) +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1716
    predict_rs_scan_time_ms(scanned_cards) +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1717
    predict_constant_other_time_ms();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1718
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1719
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1720
double
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1721
G1CollectorPolicy::predict_region_elapsed_time_ms(HeapRegion* hr,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1722
                                                  bool young) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1723
  size_t rs_length = hr->rem_set()->occupied();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1724
  size_t card_num;
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1725
  if (gcs_are_young()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1726
    card_num = predict_young_card_num(rs_length);
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1727
  } else {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1728
    card_num = predict_non_young_card_num(rs_length);
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1729
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1730
  size_t bytes_to_copy = predict_bytes_to_copy(hr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1731
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1732
  double region_elapsed_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1733
    predict_rs_scan_time_ms(card_num) +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1734
    predict_object_copy_time_ms(bytes_to_copy);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1735
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1736
  if (young)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1737
    region_elapsed_time_ms += predict_young_other_time_ms(1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1738
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1739
    region_elapsed_time_ms += predict_non_young_other_time_ms(1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1740
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1741
  return region_elapsed_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1742
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1743
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1744
size_t
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1745
G1CollectorPolicy::predict_bytes_to_copy(HeapRegion* hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1746
  size_t bytes_to_copy;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1747
  if (hr->is_marked())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1748
    bytes_to_copy = hr->max_live_bytes();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1749
  else {
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  1750
    assert(hr->is_young() && hr->age_in_surv_rate_group() != -1, "invariant");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1751
    int age = hr->age_in_surv_rate_group();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  1752
    double yg_surv_rate = predict_yg_surv_rate(age, hr->surv_rate_group());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1753
    bytes_to_copy = (size_t) ((double) hr->used() * yg_surv_rate);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1754
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1755
  return bytes_to_copy;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1756
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1757
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1758
void
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1759
G1CollectorPolicy::init_cset_region_lengths(size_t eden_cset_region_length,
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1760
                                          size_t survivor_cset_region_length) {
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1761
  _eden_cset_region_length     = eden_cset_region_length;
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1762
  _survivor_cset_region_length = survivor_cset_region_length;
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  1763
  _old_cset_region_length      = 0;
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1764
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1765
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1766
void G1CollectorPolicy::set_recorded_rs_lengths(size_t rs_lengths) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1767
  _recorded_rs_lengths = rs_lengths;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1768
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1769
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1770
void G1CollectorPolicy::update_recent_gc_times(double end_time_sec,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1771
                                               double elapsed_ms) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1772
  _recent_gc_times_ms->add(elapsed_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1773
  _recent_prev_end_times_for_all_gcs_sec->add(end_time_sec);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1774
  _prev_collection_pause_end_ms = end_time_sec * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1775
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1776
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1777
size_t G1CollectorPolicy::expansion_amount() {
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  1778
  double recent_gc_overhead = recent_avg_pause_time_ratio() * 100.0;
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  1779
  double threshold = _gc_overhead_perc;
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  1780
  if (recent_gc_overhead > threshold) {
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
  1781
    // We will double the existing space, or take
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
  1782
    // G1ExpandByPercentOfAvailable % of the available expansion
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
  1783
    // space, whichever is smaller, bounded below by a minimum
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
  1784
    // expansion (unless that's all that's left.)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1785
    const size_t min_expand_bytes = 1*M;
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 7923
diff changeset
  1786
    size_t reserved_bytes = _g1->max_capacity();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1787
    size_t committed_bytes = _g1->capacity();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1788
    size_t uncommitted_bytes = reserved_bytes - committed_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1789
    size_t expand_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1790
    size_t expand_bytes_via_pct =
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
  1791
      uncommitted_bytes * G1ExpandByPercentOfAvailable / 100;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1792
    expand_bytes = MIN2(expand_bytes_via_pct, committed_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1793
    expand_bytes = MAX2(expand_bytes, min_expand_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1794
    expand_bytes = MIN2(expand_bytes, uncommitted_bytes);
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  1795
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  1796
    ergo_verbose5(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  1797
                  "attempt heap expansion",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  1798
                  ergo_format_reason("recent GC overhead higher than "
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  1799
                                     "threshold after GC")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  1800
                  ergo_format_perc("recent GC overhead")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  1801
                  ergo_format_perc("threshold")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  1802
                  ergo_format_byte("uncommitted")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  1803
                  ergo_format_byte_perc("calculated expansion amount"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  1804
                  recent_gc_overhead, threshold,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  1805
                  uncommitted_bytes,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  1806
                  expand_bytes_via_pct, (double) G1ExpandByPercentOfAvailable);
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  1807
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1808
    return expand_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1809
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1810
    return 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1811
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1812
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1813
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1814
class CountCSClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1815
  G1CollectorPolicy* _g1_policy;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1816
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1817
  CountCSClosure(G1CollectorPolicy* g1_policy) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1818
    _g1_policy(g1_policy) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1819
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1820
    _g1_policy->_bytes_in_collection_set_before_gc += r->used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1821
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1822
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1823
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1824
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1825
void G1CollectorPolicy::count_CS_bytes_used() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1826
  CountCSClosure cs_closure(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1827
  _g1->collection_set_iterate(&cs_closure);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1828
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1829
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1830
void G1CollectorPolicy::print_summary(int level,
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1831
                                      const char* str,
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1832
                                      NumberSeq* seq) const {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1833
  double sum = seq->sum();
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1834
  LineBuffer(level + 1).append_and_print_cr("%-24s = %8.2lf s (avg = %8.2lf ms)",
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1835
                str, sum / 1000.0, seq->avg());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1836
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1837
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1838
void G1CollectorPolicy::print_summary_sd(int level,
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1839
                                         const char* str,
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1840
                                         NumberSeq* seq) const {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1841
  print_summary(level, str, seq);
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1842
  LineBuffer(level + 6).append_and_print_cr("(num = %5d, std dev = %8.2lf ms, max = %8.2lf ms)",
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1843
                seq->num(), seq->sd(), seq->maximum());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1844
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1845
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1846
void G1CollectorPolicy::check_other_times(int level,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1847
                                        NumberSeq* other_times_ms,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1848
                                        NumberSeq* calc_other_times_ms) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1849
  bool should_print = false;
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1850
  LineBuffer buf(level + 2);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1851
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1852
  double max_sum = MAX2(fabs(other_times_ms->sum()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1853
                        fabs(calc_other_times_ms->sum()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1854
  double min_sum = MIN2(fabs(other_times_ms->sum()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1855
                        fabs(calc_other_times_ms->sum()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1856
  double sum_ratio = max_sum / min_sum;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1857
  if (sum_ratio > 1.1) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1858
    should_print = true;
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1859
    buf.append_and_print_cr("## CALCULATED OTHER SUM DOESN'T MATCH RECORDED ###");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1860
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1861
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1862
  double max_avg = MAX2(fabs(other_times_ms->avg()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1863
                        fabs(calc_other_times_ms->avg()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1864
  double min_avg = MIN2(fabs(other_times_ms->avg()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1865
                        fabs(calc_other_times_ms->avg()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1866
  double avg_ratio = max_avg / min_avg;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1867
  if (avg_ratio > 1.1) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1868
    should_print = true;
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1869
    buf.append_and_print_cr("## CALCULATED OTHER AVG DOESN'T MATCH RECORDED ###");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1870
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1871
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1872
  if (other_times_ms->sum() < -0.01) {
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1873
    buf.append_and_print_cr("## RECORDED OTHER SUM IS NEGATIVE ###");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1874
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1875
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1876
  if (other_times_ms->avg() < -0.01) {
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1877
    buf.append_and_print_cr("## RECORDED OTHER AVG IS NEGATIVE ###");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1878
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1879
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1880
  if (calc_other_times_ms->sum() < -0.01) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1881
    should_print = true;
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1882
    buf.append_and_print_cr("## CALCULATED OTHER SUM IS NEGATIVE ###");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1883
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1884
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1885
  if (calc_other_times_ms->avg() < -0.01) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1886
    should_print = true;
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1887
    buf.append_and_print_cr("## CALCULATED OTHER AVG IS NEGATIVE ###");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1888
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1889
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1890
  if (should_print)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1891
    print_summary(level, "Other(Calc)", calc_other_times_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1892
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1893
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1894
void G1CollectorPolicy::print_summary(PauseSummary* summary) const {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
  1895
  bool parallel = G1CollectedHeap::use_parallel_gc_threads();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1896
  MainBodySummary*    body_summary = summary->main_body_summary();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1897
  if (summary->get_total_seq()->num() > 0) {
2344
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2260
diff changeset
  1898
    print_summary_sd(0, "Evacuation Pauses", summary->get_total_seq());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1899
    if (body_summary != NULL) {
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
  1900
      print_summary(1, "Root Region Scan Wait", body_summary->get_root_region_scan_wait_seq());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1901
      if (parallel) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1902
        print_summary(1, "Parallel Time", body_summary->get_parallel_seq());
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1903
        print_summary(2, "Ext Root Scanning", body_summary->get_ext_root_scan_seq());
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11397
diff changeset
  1904
        print_summary(2, "SATB Filtering", body_summary->get_satb_filtering_seq());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1905
        print_summary(2, "Update RS", body_summary->get_update_rs_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1906
        print_summary(2, "Scan RS", body_summary->get_scan_rs_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1907
        print_summary(2, "Object Copy", body_summary->get_obj_copy_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1908
        print_summary(2, "Termination", body_summary->get_termination_seq());
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1909
        print_summary(2, "Parallel Other", body_summary->get_parallel_other_seq());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1910
        {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1911
          NumberSeq* other_parts[] = {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1912
            body_summary->get_ext_root_scan_seq(),
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11397
diff changeset
  1913
            body_summary->get_satb_filtering_seq(),
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1914
            body_summary->get_update_rs_seq(),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1915
            body_summary->get_scan_rs_seq(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1916
            body_summary->get_obj_copy_seq(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1917
            body_summary->get_termination_seq()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1918
          };
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1919
          NumberSeq calc_other_times_ms(body_summary->get_parallel_seq(),
6449
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1920
                                        6, other_parts);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1921
          check_other_times(2, body_summary->get_parallel_other_seq(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1922
                            &calc_other_times_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1923
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1924
      } else {
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1925
        print_summary(1, "Ext Root Scanning", body_summary->get_ext_root_scan_seq());
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11397
diff changeset
  1926
        print_summary(1, "SATB Filtering", body_summary->get_satb_filtering_seq());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1927
        print_summary(1, "Update RS", body_summary->get_update_rs_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1928
        print_summary(1, "Scan RS", body_summary->get_scan_rs_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1929
        print_summary(1, "Object Copy", body_summary->get_obj_copy_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1930
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1931
    }
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10746
diff changeset
  1932
    print_summary(1, "Clear CT", body_summary->get_clear_ct_seq());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1933
    print_summary(1, "Other", summary->get_other_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1934
    {
6449
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1935
      if (body_summary != NULL) {
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1936
        NumberSeq calc_other_times_ms;
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1937
        if (parallel) {
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1938
          // parallel
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1939
          NumberSeq* other_parts[] = {
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
  1940
            body_summary->get_root_region_scan_wait_seq(),
6449
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1941
            body_summary->get_parallel_seq(),
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1942
            body_summary->get_clear_ct_seq()
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1943
          };
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1944
          calc_other_times_ms = NumberSeq(summary->get_total_seq(),
12272
f87fd1292095 7127697: G1: remove dead code after recent concurrent mark changes
tonyp
parents: 12270
diff changeset
  1945
                                          3, other_parts);
6449
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1946
        } else {
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1947
          // serial
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1948
          NumberSeq* other_parts[] = {
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11581
diff changeset
  1949
            body_summary->get_root_region_scan_wait_seq(),
6449
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1950
            body_summary->get_update_rs_seq(),
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1951
            body_summary->get_ext_root_scan_seq(),
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11397
diff changeset
  1952
            body_summary->get_satb_filtering_seq(),
6449
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1953
            body_summary->get_scan_rs_seq(),
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1954
            body_summary->get_obj_copy_seq()
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1955
          };
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1956
          calc_other_times_ms = NumberSeq(summary->get_total_seq(),
12272
f87fd1292095 7127697: G1: remove dead code after recent concurrent mark changes
tonyp
parents: 12270
diff changeset
  1957
                                          6, other_parts);
6449
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1958
        }
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  1959
        check_other_times(1,  summary->get_other_seq(), &calc_other_times_ms);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1960
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1961
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1962
  } else {
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1963
    LineBuffer(1).append_and_print_cr("none");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1964
  }
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1965
  LineBuffer(0).append_and_print_cr("");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1966
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1967
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1968
void G1CollectorPolicy::print_tracing_info() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1969
  if (TraceGen0Time) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1970
    gclog_or_tty->print_cr("ALL PAUSES");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1971
    print_summary_sd(0, "Total", _all_pause_times_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1972
    gclog_or_tty->print_cr("");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1973
    gclog_or_tty->print_cr("");
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1974
    gclog_or_tty->print_cr("   Young GC Pauses: %8d", _young_pause_num);
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  1975
    gclog_or_tty->print_cr("   Mixed GC Pauses: %8d", _mixed_pause_num);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1976
    gclog_or_tty->print_cr("");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1977
2344
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2260
diff changeset
  1978
    gclog_or_tty->print_cr("EVACUATION PAUSES");
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2260
diff changeset
  1979
    print_summary(_summary);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1980
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1981
    gclog_or_tty->print_cr("MISC");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1982
    print_summary_sd(0, "Stop World", _all_stop_world_times_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1983
    print_summary_sd(0, "Yields", _all_yield_times_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1984
    for (int i = 0; i < _aux_num; ++i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1985
      if (_all_aux_times_ms[i].num() > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1986
        char buffer[96];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1987
        sprintf(buffer, "Aux%d", i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1988
        print_summary_sd(0, buffer, &_all_aux_times_ms[i]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1989
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1990
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1991
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1992
  if (TraceGen1Time) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1993
    if (_all_full_gc_times_ms->num() > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1994
      gclog_or_tty->print("\n%4d full_gcs: total time = %8.2f s",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1995
                 _all_full_gc_times_ms->num(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1996
                 _all_full_gc_times_ms->sum() / 1000.0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1997
      gclog_or_tty->print_cr(" (avg = %8.2fms).", _all_full_gc_times_ms->avg());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1998
      gclog_or_tty->print_cr("                     [std. dev = %8.2f ms, max = %8.2f ms]",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1999
                    _all_full_gc_times_ms->sd(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2000
                    _all_full_gc_times_ms->maximum());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2001
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2002
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2003
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2004
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2005
void G1CollectorPolicy::print_yg_surv_rate_info() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2006
#ifndef PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2007
  _short_lived_surv_rate_group->print_surv_rate_summary();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2008
  // add this call for any other surv rate groups
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2009
#endif // PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2010
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2011
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2012
#ifndef PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2013
// for debugging, bit of a hack...
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2014
static char*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2015
region_num_to_mbs(int length) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2016
  static char buffer[64];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2017
  double bytes = (double) (length * HeapRegion::GrainBytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2018
  double mbs = bytes / (double) (1024 * 1024);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2019
  sprintf(buffer, "%7.2lfMB", mbs);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2020
  return buffer;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2021
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2022
#endif // PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2023
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2024
size_t G1CollectorPolicy::max_regions(int purpose) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2025
  switch (purpose) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2026
    case GCAllocForSurvived:
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2027
      return _max_survivor_regions;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2028
    case GCAllocForTenured:
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2029
      return REGIONS_UNLIMITED;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2030
    default:
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2031
      ShouldNotReachHere();
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2032
      return REGIONS_UNLIMITED;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2033
  };
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2034
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2035
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
  2036
void G1CollectorPolicy::update_max_gc_locker_expansion() {
7416
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2037
  size_t expansion_region_num = 0;
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2038
  if (GCLockerEdenExpansionPercent > 0) {
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2039
    double perc = (double) GCLockerEdenExpansionPercent / 100.0;
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2040
    double expansion_region_num_d = perc * (double) _young_list_target_length;
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2041
    // We use ceiling so that if expansion_region_num_d is > 0.0 (but
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2042
    // less than 1.0) we'll get 1.
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2043
    expansion_region_num = (size_t) ceil(expansion_region_num_d);
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2044
  } else {
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2045
    assert(expansion_region_num == 0, "sanity");
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2046
  }
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2047
  _young_list_max_length = _young_list_target_length + expansion_region_num;
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2048
  assert(_young_list_target_length <= _young_list_max_length, "post-condition");
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2049
}
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2050
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2051
// Calculates survivor space parameters.
10528
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
  2052
void G1CollectorPolicy::update_survivors_policy() {
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
  2053
  double max_survivor_regions_d =
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
  2054
                 (double) _young_list_target_length / (double) SurvivorRatio;
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
  2055
  // We use ceiling so that if max_survivor_regions_d is > 0.0 (but
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
  2056
  // smaller than 1.0) we'll get 1.
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
  2057
  _max_survivor_regions = (size_t) ceil(max_survivor_regions_d);
06fab03478df 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 10523
diff changeset
  2058
10281
ad7517425333 7081064: G1: remove develop params G1FixedSurvivorSpaceSize, G1FixedTenuringThreshold, and G1FixedEdenSize
tonyp
parents: 10280
diff changeset
  2059
  _tenuring_threshold = _survivors_age_table.compute_tenuring_threshold(
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2060
        HeapRegion::GrainWords * _max_survivor_regions);
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2061
}
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2062
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2063
#ifndef PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2064
class HRSortIndexIsOKClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2065
  CollectionSetChooser* _chooser;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2066
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2067
  HRSortIndexIsOKClosure(CollectionSetChooser* chooser) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2068
    _chooser(chooser) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2069
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2070
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2071
    if (!r->continuesHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2072
      assert(_chooser->regionProperlyOrdered(r), "Ought to be.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2073
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2074
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2075
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2076
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2077
10746
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2078
bool G1CollectorPolicy::assertMarkedBytesDataOK() {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2079
  HRSortIndexIsOKClosure cl(_collectionSetChooser);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2080
  _g1->heap_region_iterate(&cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2081
  return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2082
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2083
#endif
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2084
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2085
bool G1CollectorPolicy::force_initial_mark_if_outside_cycle(
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2086
                                                     GCCause::Cause gc_cause) {
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2087
  bool during_cycle = _g1->concurrent_mark()->cmThread()->during_cycle();
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2088
  if (!during_cycle) {
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2089
    ergo_verbose1(ErgoConcCycles,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2090
                  "request concurrent cycle initiation",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2091
                  ergo_format_reason("requested by GC cause")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2092
                  ergo_format_str("GC cause"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2093
                  GCCause::to_string(gc_cause));
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2094
    set_initiate_conc_mark_if_possible();
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2095
    return true;
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2096
  } else {
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2097
    ergo_verbose1(ErgoConcCycles,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2098
                  "do not request concurrent cycle initiation",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2099
                  ergo_format_reason("concurrent cycle already in progress")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2100
                  ergo_format_str("GC cause"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2101
                  GCCause::to_string(gc_cause));
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2102
    return false;
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2103
  }
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2104
}
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2105
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2106
void
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2107
G1CollectorPolicy::decide_on_conc_mark_initiation() {
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2108
  // We are about to decide on whether this pause will be an
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2109
  // initial-mark pause.
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2110
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2111
  // First, during_initial_mark_pause() should not be already set. We
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2112
  // will set it here if we have to. However, it should be cleared by
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2113
  // the end of the pause (it's only set for the duration of an
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2114
  // initial-mark pause).
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2115
  assert(!during_initial_mark_pause(), "pre-condition");
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2116
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2117
  if (initiate_conc_mark_if_possible()) {
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2118
    // We had noticed on a previous pause that the heap occupancy has
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2119
    // gone over the initiating threshold and we should start a
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2120
    // concurrent marking cycle. So we might initiate one.
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2121
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2122
    bool during_cycle = _g1->concurrent_mark()->cmThread()->during_cycle();
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2123
    if (!during_cycle) {
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2124
      // The concurrent marking thread is not "during a cycle", i.e.,
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2125
      // it has completed the last one. So we can go ahead and
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2126
      // initiate a new cycle.
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2127
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2128
      set_during_initial_mark_pause();
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  2129
      // We do not allow mixed GCs during marking.
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  2130
      if (!gcs_are_young()) {
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  2131
        set_gcs_are_young(true);
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  2132
        ergo_verbose0(ErgoMixedGCs,
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  2133
                      "end mixed GCs",
10673
8235e1a1b41b 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 10670
diff changeset
  2134
                      ergo_format_reason("concurrent cycle is about to start"));
8235e1a1b41b 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 10670
diff changeset
  2135
      }
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2136
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2137
      // And we can now clear initiate_conc_mark_if_possible() as
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2138
      // we've already acted on it.
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2139
      clear_initiate_conc_mark_if_possible();
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2140
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2141
      ergo_verbose0(ErgoConcCycles,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2142
                  "initiate concurrent cycle",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2143
                  ergo_format_reason("concurrent cycle initiation requested"));
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2144
    } else {
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2145
      // The concurrent marking thread is still finishing up the
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2146
      // previous cycle. If we start one right now the two cycles
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2147
      // overlap. In particular, the concurrent marking thread might
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2148
      // be in the process of clearing the next marking bitmap (which
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2149
      // we will use for the next cycle if we start one). Starting a
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2150
      // cycle now will be bad given that parts of the marking
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2151
      // information might get cleared by the marking thread. And we
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2152
      // cannot wait for the marking thread to finish the cycle as it
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2153
      // periodically yields while clearing the next marking bitmap
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2154
      // and, if it's in a yield point, it's waiting for us to
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2155
      // finish. So, at this point we will not start a cycle and we'll
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2156
      // let the concurrent marking thread complete the last one.
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2157
      ergo_verbose0(ErgoConcCycles,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2158
                    "do not initiate concurrent cycle",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2159
                    ergo_format_reason("concurrent cycle already in progress"));
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2160
    }
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2161
  }
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2162
}
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2163
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2164
class KnownGarbageClosure: public HeapRegionClosure {
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2165
  G1CollectedHeap* _g1h;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2166
  CollectionSetChooser* _hrSorted;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2167
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2168
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2169
  KnownGarbageClosure(CollectionSetChooser* hrSorted) :
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2170
    _g1h(G1CollectedHeap::heap()), _hrSorted(hrSorted) { }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2171
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2172
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2173
    // We only include humongous regions in collection
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2174
    // sets when concurrent mark shows that their contained object is
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2175
    // unreachable.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2176
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2177
    // Do we have any marking information for this region?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2178
    if (r->is_marked()) {
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2179
      // We will skip any region that's currently used as an old GC
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2180
      // alloc region (we should not consider those for collection
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2181
      // before we fill them up).
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2182
      if (_hrSorted->shouldAdd(r) && !_g1h->is_old_gc_alloc_region(r)) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2183
        _hrSorted->addMarkedHeapRegion(r);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2184
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2185
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2186
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2187
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2188
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2189
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2190
class ParKnownGarbageHRClosure: public HeapRegionClosure {
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2191
  G1CollectedHeap* _g1h;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2192
  CollectionSetChooser* _hrSorted;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2193
  jint _marked_regions_added;
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2194
  size_t _reclaimable_bytes_added;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2195
  jint _chunk_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2196
  jint _cur_chunk_idx;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2197
  jint _cur_chunk_end; // Cur chunk [_cur_chunk_idx, _cur_chunk_end)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2198
  int _worker;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2199
  int _invokes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2200
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2201
  void get_new_chunk() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2202
    _cur_chunk_idx = _hrSorted->getParMarkedHeapRegionChunk(_chunk_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2203
    _cur_chunk_end = _cur_chunk_idx + _chunk_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2204
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2205
  void add_region(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2206
    if (_cur_chunk_idx == _cur_chunk_end) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2207
      get_new_chunk();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2208
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2209
    assert(_cur_chunk_idx < _cur_chunk_end, "postcondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2210
    _hrSorted->setMarkedHeapRegion(_cur_chunk_idx, r);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2211
    _marked_regions_added++;
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2212
    _reclaimable_bytes_added += r->reclaimable_bytes();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2213
    _cur_chunk_idx++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2214
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2215
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2216
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2217
  ParKnownGarbageHRClosure(CollectionSetChooser* hrSorted,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2218
                           jint chunk_size,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2219
                           int worker) :
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2220
      _g1h(G1CollectedHeap::heap()),
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2221
      _hrSorted(hrSorted), _chunk_size(chunk_size), _worker(worker),
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2222
      _marked_regions_added(0), _reclaimable_bytes_added(0),
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2223
      _cur_chunk_idx(0), _cur_chunk_end(0), _invokes(0) { }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2224
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2225
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2226
    // We only include humongous regions in collection
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2227
    // sets when concurrent mark shows that their contained object is
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2228
    // unreachable.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2229
    _invokes++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2230
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2231
    // Do we have any marking information for this region?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2232
    if (r->is_marked()) {
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2233
      // We will skip any region that's currently used as an old GC
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2234
      // alloc region (we should not consider those for collection
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2235
      // before we fill them up).
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2236
      if (_hrSorted->shouldAdd(r) && !_g1h->is_old_gc_alloc_region(r)) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2237
        add_region(r);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2238
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2239
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2240
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2241
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2242
  jint marked_regions_added() { return _marked_regions_added; }
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2243
  size_t reclaimable_bytes_added() { return _reclaimable_bytes_added; }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2244
  int invokes() { return _invokes; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2245
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2246
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2247
class ParKnownGarbageTask: public AbstractGangTask {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2248
  CollectionSetChooser* _hrSorted;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2249
  jint _chunk_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2250
  G1CollectedHeap* _g1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2251
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2252
  ParKnownGarbageTask(CollectionSetChooser* hrSorted, jint chunk_size) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2253
    AbstractGangTask("ParKnownGarbageTask"),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2254
    _hrSorted(hrSorted), _chunk_size(chunk_size),
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2255
    _g1(G1CollectedHeap::heap()) { }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2256
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11395
diff changeset
  2257
  void work(uint worker_id) {
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11395
diff changeset
  2258
    ParKnownGarbageHRClosure parKnownGarbageCl(_hrSorted,
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11395
diff changeset
  2259
                                               _chunk_size,
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11395
diff changeset
  2260
                                               worker_id);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2261
    // Back to zero for the claim value.
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11395
diff changeset
  2262
    _g1->heap_region_par_iterate_chunked(&parKnownGarbageCl, worker_id,
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2263
                                         _g1->workers()->active_workers(),
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
  2264
                                         HeapRegion::InitialClaimValue);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2265
    jint regions_added = parKnownGarbageCl.marked_regions_added();
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2266
    size_t reclaimable_bytes_added =
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2267
                                   parKnownGarbageCl.reclaimable_bytes_added();
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2268
    _hrSorted->updateTotals(regions_added, reclaimable_bytes_added);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2269
    if (G1PrintParCleanupStats) {
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  2270
      gclog_or_tty->print_cr("     Thread %d called %d times, added %d regions to list.",
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11395
diff changeset
  2271
                 worker_id, parKnownGarbageCl.invokes(), regions_added);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2272
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2273
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2274
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2275
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2276
void
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2277
G1CollectorPolicy::record_concurrent_mark_cleanup_end(int no_of_gc_threads) {
10746
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2278
  double start_sec;
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2279
  if (G1PrintParCleanupStats) {
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2280
    start_sec = os::elapsedTime();
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2281
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2282
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2283
  _collectionSetChooser->clearMarkedHeapRegions();
10746
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2284
  double clear_marked_end_sec;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2285
  if (G1PrintParCleanupStats) {
10746
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2286
    clear_marked_end_sec = os::elapsedTime();
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2287
    gclog_or_tty->print_cr("  clear marked regions: %8.3f ms.",
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2288
                           (clear_marked_end_sec - start_sec) * 1000.0);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2289
  }
10746
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2290
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
  2291
  if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2292
    const size_t OverpartitionFactor = 4;
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2293
    size_t WorkUnit;
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2294
    // The use of MinChunkSize = 8 in the original code
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2295
    // causes some assertion failures when the total number of
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2296
    // region is less than 8.  The code here tries to fix that.
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2297
    // Should the original code also be fixed?
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2298
    if (no_of_gc_threads > 0) {
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2299
      const size_t MinWorkUnit =
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2300
        MAX2(_g1->n_regions() / no_of_gc_threads, (size_t) 1U);
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2301
      WorkUnit =
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2302
        MAX2(_g1->n_regions() / (no_of_gc_threads * OverpartitionFactor),
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2303
             MinWorkUnit);
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2304
    } else {
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2305
      assert(no_of_gc_threads > 0,
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2306
        "The active gc workers should be greater than 0");
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2307
      // In a product build do something reasonable to avoid a crash.
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2308
      const size_t MinWorkUnit =
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2309
        MAX2(_g1->n_regions() / ParallelGCThreads, (size_t) 1U);
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2310
      WorkUnit =
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2311
        MAX2(_g1->n_regions() / (ParallelGCThreads * OverpartitionFactor),
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2312
             MinWorkUnit);
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2313
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2314
    _collectionSetChooser->prepareForAddMarkedHeapRegionsPar(_g1->n_regions(),
5694
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5350
diff changeset
  2315
                                                             WorkUnit);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2316
    ParKnownGarbageTask parKnownGarbageTask(_collectionSetChooser,
5694
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5350
diff changeset
  2317
                                            (int) WorkUnit);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2318
    _g1->workers()->run_task(&parKnownGarbageTask);
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
  2319
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
  2320
    assert(_g1->check_heap_region_claim_values(HeapRegion::InitialClaimValue),
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
  2321
           "sanity check");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2322
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2323
    KnownGarbageClosure knownGarbagecl(_collectionSetChooser);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2324
    _g1->heap_region_iterate(&knownGarbagecl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2325
  }
10746
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2326
  double known_garbage_end_sec;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2327
  if (G1PrintParCleanupStats) {
10746
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2328
    known_garbage_end_sec = os::elapsedTime();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2329
    gclog_or_tty->print_cr("  compute known garbage: %8.3f ms.",
10746
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2330
                      (known_garbage_end_sec - clear_marked_end_sec) * 1000.0);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2331
  }
10746
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2332
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2333
  _collectionSetChooser->sortMarkedHeapRegions();
10746
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2334
  double end_sec = os::elapsedTime();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2335
  if (G1PrintParCleanupStats) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2336
    gclog_or_tty->print_cr("  sorting: %8.3f ms.",
10746
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2337
                           (end_sec - known_garbage_end_sec) * 1000.0);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2338
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2339
10746
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2340
  double elapsed_time_ms = (end_sec - _mark_cleanup_start_sec) * 1000.0;
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2341
  _concurrent_mark_cleanup_times_ms->add(elapsed_time_ms);
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2342
  _cur_mark_stop_world_time_ms += elapsed_time_ms;
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2343
  _prev_collection_pause_end_ms += elapsed_time_ms;
96f50959f650 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 10677
diff changeset
  2344
  _mmu_tracker->add_pause(_mark_cleanup_start_sec, end_sec, true);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2345
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2346
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2347
// Add the heap region at the head of the non-incremental collection set
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  2348
void G1CollectorPolicy::add_old_region_to_cset(HeapRegion* hr) {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2349
  assert(_inc_cset_build_state == Active, "Precondition");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2350
  assert(!hr->is_young(), "non-incremental add of young region");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2351
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2352
  assert(!hr->in_collection_set(), "should not already be in the CSet");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2353
  hr->set_in_collection_set(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2354
  hr->set_next_in_collection_set(_collection_set);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2355
  _collection_set = hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2356
  _collection_set_bytes_used_before += hr->used();
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1623
diff changeset
  2357
  _g1->register_region_with_in_cset_fast_test(hr);
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  2358
  size_t rs_length = hr->rem_set()->occupied();
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  2359
  _recorded_rs_lengths += rs_length;
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  2360
  _old_cset_region_length += 1;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2361
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2362
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2363
// Initialize the per-collection-set information
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2364
void G1CollectorPolicy::start_incremental_cset_building() {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2365
  assert(_inc_cset_build_state == Inactive, "Precondition");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2366
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2367
  _inc_cset_head = NULL;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2368
  _inc_cset_tail = NULL;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2369
  _inc_cset_bytes_used_before = 0;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2370
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2371
  _inc_cset_max_finger = 0;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2372
  _inc_cset_recorded_rs_lengths = 0;
11395
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2373
  _inc_cset_recorded_rs_lengths_diffs = 0;
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2374
  _inc_cset_predicted_elapsed_time_ms = 0.0;
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2375
  _inc_cset_predicted_elapsed_time_ms_diffs = 0.0;
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2376
  _inc_cset_build_state = Active;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2377
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2378
11395
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2379
void G1CollectorPolicy::finalize_incremental_cset_building() {
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2380
  assert(_inc_cset_build_state == Active, "Precondition");
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2381
  assert(SafepointSynchronize::is_at_safepoint(), "should be at a safepoint");
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2382
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2383
  // The two "main" fields, _inc_cset_recorded_rs_lengths and
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2384
  // _inc_cset_predicted_elapsed_time_ms, are updated by the thread
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2385
  // that adds a new region to the CSet. Further updates by the
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2386
  // concurrent refinement thread that samples the young RSet lengths
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2387
  // are accumulated in the *_diffs fields. Here we add the diffs to
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2388
  // the "main" fields.
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2389
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2390
  if (_inc_cset_recorded_rs_lengths_diffs >= 0) {
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2391
    _inc_cset_recorded_rs_lengths += _inc_cset_recorded_rs_lengths_diffs;
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2392
  } else {
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2393
    // This is defensive. The diff should in theory be always positive
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2394
    // as RSets can only grow between GCs. However, given that we
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2395
    // sample their size concurrently with other threads updating them
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2396
    // it's possible that we might get the wrong size back, which
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2397
    // could make the calculations somewhat inaccurate.
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2398
    size_t diffs = (size_t) (-_inc_cset_recorded_rs_lengths_diffs);
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2399
    if (_inc_cset_recorded_rs_lengths >= diffs) {
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2400
      _inc_cset_recorded_rs_lengths -= diffs;
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2401
    } else {
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2402
      _inc_cset_recorded_rs_lengths = 0;
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2403
    }
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2404
  }
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2405
  _inc_cset_predicted_elapsed_time_ms +=
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2406
                                     _inc_cset_predicted_elapsed_time_ms_diffs;
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2407
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2408
  _inc_cset_recorded_rs_lengths_diffs = 0;
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2409
  _inc_cset_predicted_elapsed_time_ms_diffs = 0.0;
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2410
}
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2411
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2412
void G1CollectorPolicy::add_to_incremental_cset_info(HeapRegion* hr, size_t rs_length) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2413
  // This routine is used when:
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2414
  // * adding survivor regions to the incremental cset at the end of an
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2415
  //   evacuation pause,
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2416
  // * adding the current allocation region to the incremental cset
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2417
  //   when it is retired, and
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2418
  // * updating existing policy information for a region in the
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2419
  //   incremental cset via young list RSet sampling.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2420
  // Therefore this routine may be called at a safepoint by the
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2421
  // VM thread, or in-between safepoints by mutator threads (when
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2422
  // retiring the current allocation region) or a concurrent
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2423
  // refine thread (RSet sampling).
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2424
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2425
  double region_elapsed_time_ms = predict_region_elapsed_time_ms(hr, true);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2426
  size_t used_bytes = hr->used();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2427
  _inc_cset_recorded_rs_lengths += rs_length;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2428
  _inc_cset_predicted_elapsed_time_ms += region_elapsed_time_ms;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2429
  _inc_cset_bytes_used_before += used_bytes;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2430
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2431
  // Cache the values we have added to the aggregated informtion
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2432
  // in the heap region in case we have to remove this region from
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2433
  // the incremental collection set, or it is updated by the
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2434
  // rset sampling code
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2435
  hr->set_recorded_rs_length(rs_length);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2436
  hr->set_predicted_elapsed_time_ms(region_elapsed_time_ms);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2437
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2438
11395
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2439
void G1CollectorPolicy::update_incremental_cset_info(HeapRegion* hr,
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2440
                                                     size_t new_rs_length) {
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2441
  // Update the CSet information that is dependent on the new RS length
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2442
  assert(hr->is_young(), "Precondition");
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2443
  assert(!SafepointSynchronize::is_at_safepoint(),
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2444
                                               "should not be at a safepoint");
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2445
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2446
  // We could have updated _inc_cset_recorded_rs_lengths and
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2447
  // _inc_cset_predicted_elapsed_time_ms directly but we'd need to do
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2448
  // that atomically, as this code is executed by a concurrent
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2449
  // refinement thread, potentially concurrently with a mutator thread
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2450
  // allocating a new region and also updating the same fields. To
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2451
  // avoid the atomic operations we accumulate these updates on two
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2452
  // separate fields (*_diffs) and we'll just add them to the "main"
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2453
  // fields at the start of a GC.
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2454
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2455
  ssize_t old_rs_length = (ssize_t) hr->recorded_rs_length();
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2456
  ssize_t rs_lengths_diff = (ssize_t) new_rs_length - old_rs_length;
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2457
  _inc_cset_recorded_rs_lengths_diffs += rs_lengths_diff;
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2458
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2459
  double old_elapsed_time_ms = hr->predicted_elapsed_time_ms();
11395
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2460
  double new_region_elapsed_time_ms = predict_region_elapsed_time_ms(hr, true);
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2461
  double elapsed_ms_diff = new_region_elapsed_time_ms - old_elapsed_time_ms;
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2462
  _inc_cset_predicted_elapsed_time_ms_diffs += elapsed_ms_diff;
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2463
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2464
  hr->set_recorded_rs_length(new_rs_length);
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2465
  hr->set_predicted_elapsed_time_ms(new_region_elapsed_time_ms);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2466
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2467
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2468
void G1CollectorPolicy::add_region_to_incremental_cset_common(HeapRegion* hr) {
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  2469
  assert(hr->is_young(), "invariant");
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  2470
  assert(hr->young_index_in_cset() > -1, "should have already been set");
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2471
  assert(_inc_cset_build_state == Active, "Precondition");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2472
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2473
  // We need to clear and set the cached recorded/cached collection set
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2474
  // information in the heap region here (before the region gets added
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2475
  // to the collection set). An individual heap region's cached values
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2476
  // are calculated, aggregated with the policy collection set info,
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2477
  // and cached in the heap region here (initially) and (subsequently)
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2478
  // by the Young List sampling code.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2479
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2480
  size_t rs_length = hr->rem_set()->occupied();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2481
  add_to_incremental_cset_info(hr, rs_length);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2482
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2483
  HeapWord* hr_end = hr->end();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2484
  _inc_cset_max_finger = MAX2(_inc_cset_max_finger, hr_end);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2485
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2486
  assert(!hr->in_collection_set(), "invariant");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2487
  hr->set_in_collection_set(true);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2488
  assert( hr->next_in_collection_set() == NULL, "invariant");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2489
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2490
  _g1->register_region_with_in_cset_fast_test(hr);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2491
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2492
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2493
// Add the region at the RHS of the incremental cset
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2494
void G1CollectorPolicy::add_region_to_incremental_cset_rhs(HeapRegion* hr) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2495
  // We should only ever be appending survivors at the end of a pause
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2496
  assert( hr->is_survivor(), "Logic");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2497
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2498
  // Do the 'common' stuff
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2499
  add_region_to_incremental_cset_common(hr);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2500
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2501
  // Now add the region at the right hand side
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2502
  if (_inc_cset_tail == NULL) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2503
    assert(_inc_cset_head == NULL, "invariant");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2504
    _inc_cset_head = hr;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2505
  } else {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2506
    _inc_cset_tail->set_next_in_collection_set(hr);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2507
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2508
  _inc_cset_tail = hr;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2509
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2510
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2511
// Add the region to the LHS of the incremental cset
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2512
void G1CollectorPolicy::add_region_to_incremental_cset_lhs(HeapRegion* hr) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2513
  // Survivors should be added to the RHS at the end of a pause
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2514
  assert(!hr->is_survivor(), "Logic");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2515
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2516
  // Do the 'common' stuff
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2517
  add_region_to_incremental_cset_common(hr);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2518
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2519
  // Add the region at the left hand side
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2520
  hr->set_next_in_collection_set(_inc_cset_head);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2521
  if (_inc_cset_head == NULL) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2522
    assert(_inc_cset_tail == NULL, "Invariant");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2523
    _inc_cset_tail = hr;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2524
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2525
  _inc_cset_head = hr;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2526
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2527
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2528
#ifndef PRODUCT
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2529
void G1CollectorPolicy::print_collection_set(HeapRegion* list_head, outputStream* st) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2530
  assert(list_head == inc_cset_head() || list_head == collection_set(), "must be");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2531
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2532
  st->print_cr("\nCollection_set:");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2533
  HeapRegion* csr = list_head;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2534
  while (csr != NULL) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2535
    HeapRegion* next = csr->next_in_collection_set();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2536
    assert(csr->in_collection_set(), "bad CS");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2537
    st->print_cr("  [%08x-%08x], t: %08x, P: %08x, N: %08x, C: %08x, "
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2538
                 "age: %4d, y: %d, surv: %d",
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2539
                        csr->bottom(), csr->end(),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2540
                        csr->top(),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2541
                        csr->prev_top_at_mark_start(),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2542
                        csr->next_top_at_mark_start(),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2543
                        csr->top_at_conc_mark_count(),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2544
                        csr->age_in_surv_rate_group_cond(),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2545
                        csr->is_young(),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2546
                        csr->is_survivor());
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2547
    csr = next;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2548
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2549
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2550
#endif // !PRODUCT
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2551
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2552
bool G1CollectorPolicy::next_gc_should_be_mixed(const char* true_action_str,
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2553
                                                const char* false_action_str) {
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2554
  CollectionSetChooser* cset_chooser = _collectionSetChooser;
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2555
  if (cset_chooser->isEmpty()) {
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2556
    ergo_verbose0(ErgoMixedGCs,
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2557
                  false_action_str,
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2558
                  ergo_format_reason("candidate old regions not available"));
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2559
    return false;
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2560
  }
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2561
  size_t reclaimable_bytes = cset_chooser->remainingReclaimableBytes();
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2562
  size_t capacity_bytes = _g1->capacity();
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2563
  double perc = (double) reclaimable_bytes * 100.0 / (double) capacity_bytes;
12228
15ffdb8224fe 7146246: G1: expose some of the -XX flags that drive which old regions to collect during mixed GCs
tonyp
parents: 11756
diff changeset
  2564
  double threshold = (double) G1HeapWastePercent;
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2565
  if (perc < threshold) {
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2566
    ergo_verbose4(ErgoMixedGCs,
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2567
              false_action_str,
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2568
              ergo_format_reason("reclaimable percentage lower than threshold")
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2569
              ergo_format_region("candidate old regions")
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2570
              ergo_format_byte_perc("reclaimable")
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2571
              ergo_format_perc("threshold"),
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2572
              cset_chooser->remainingRegions(),
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2573
              reclaimable_bytes, perc, threshold);
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2574
    return false;
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2575
  }
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2576
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2577
  ergo_verbose4(ErgoMixedGCs,
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2578
                true_action_str,
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2579
                ergo_format_reason("candidate old regions available")
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2580
                ergo_format_region("candidate old regions")
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2581
                ergo_format_byte_perc("reclaimable")
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2582
                ergo_format_perc("threshold"),
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2583
                cset_chooser->remainingRegions(),
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2584
                reclaimable_bytes, perc, threshold);
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2585
  return true;
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2586
}
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2587
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2588
void G1CollectorPolicy::finalize_cset(double target_pause_time_ms) {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2589
  // Set this here - in case we're not doing young collections.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2590
  double non_young_start_time_sec = os::elapsedTime();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2591
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2592
  YoungList* young_list = _g1->young_list();
11395
33260c27554b 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 11249
diff changeset
  2593
  finalize_incremental_cset_building();
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2594
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2595
  guarantee(target_pause_time_ms > 0.0,
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2596
            err_msg("target_pause_time_ms = %1.6lf should be positive",
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2597
                    target_pause_time_ms));
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2598
  guarantee(_collection_set == NULL, "Precondition");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2599
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2600
  double base_time_ms = predict_base_elapsed_time_ms(_pending_cards);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2601
  double predicted_pause_time_ms = base_time_ms;
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2602
  double time_remaining_ms = target_pause_time_ms - base_time_ms;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2603
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2604
  ergo_verbose3(ErgoCSetConstruction | ErgoHigh,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2605
                "start choosing CSet",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2606
                ergo_format_ms("predicted base time")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2607
                ergo_format_ms("remaining time")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2608
                ergo_format_ms("target pause time"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2609
                base_time_ms, time_remaining_ms, target_pause_time_ms);
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2610
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2611
  HeapRegion* hr;
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2612
  double young_start_time_sec = os::elapsedTime();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2613
2344
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2260
diff changeset
  2614
  _collection_set_bytes_used_before = 0;
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  2615
  _last_gc_was_young = gcs_are_young() ? true : false;
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  2616
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  2617
  if (_last_gc_was_young) {
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  2618
    ++_young_pause_num;
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2619
  } else {
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  2620
    ++_mixed_pause_num;
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2621
  }
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2622
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2623
  // The young list is laid with the survivor regions from the previous
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2624
  // pause are appended to the RHS of the young list, i.e.
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2625
  //   [Newly Young Regions ++ Survivors from last pause].
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2626
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  2627
  size_t survivor_region_length = young_list->survivor_length();
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  2628
  size_t eden_region_length = young_list->length() - survivor_region_length;
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  2629
  init_cset_region_lengths(eden_region_length, survivor_region_length);
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2630
  hr = young_list->first_survivor_region();
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2631
  while (hr != NULL) {
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2632
    assert(hr->is_survivor(), "badly formed young list");
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2633
    hr->set_young();
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2634
    hr = hr->get_next_young_region();
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2635
  }
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2636
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2637
  // Clear the fields that point to the survivor list - they are all young now.
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2638
  young_list->clear_survivors();
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2639
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2640
  _collection_set = _inc_cset_head;
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2641
  _collection_set_bytes_used_before = _inc_cset_bytes_used_before;
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2642
  time_remaining_ms -= _inc_cset_predicted_elapsed_time_ms;
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2643
  predicted_pause_time_ms += _inc_cset_predicted_elapsed_time_ms;
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2644
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2645
  ergo_verbose3(ErgoCSetConstruction | ErgoHigh,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2646
                "add young regions to CSet",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2647
                ergo_format_region("eden")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2648
                ergo_format_region("survivors")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2649
                ergo_format_ms("predicted young region time"),
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  2650
                eden_region_length, survivor_region_length,
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2651
                _inc_cset_predicted_elapsed_time_ms);
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2652
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2653
  // The number of recorded young regions is the incremental
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2654
  // collection set's current size
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2655
  set_recorded_rs_lengths(_inc_cset_recorded_rs_lengths);
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2656
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2657
  double young_end_time_sec = os::elapsedTime();
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2658
  _recorded_young_cset_choice_time_ms =
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2659
    (young_end_time_sec - young_start_time_sec) * 1000.0;
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2660
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2661
  // We are doing young collections so reset this.
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2662
  non_young_start_time_sec = young_end_time_sec;
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  2663
11249
b0c1cc35cafe 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 11206
diff changeset
  2664
  if (!gcs_are_young()) {
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2665
    CollectionSetChooser* cset_chooser = _collectionSetChooser;
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2666
    assert(cset_chooser->verify(), "CSet Chooser verification - pre");
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2667
    const size_t min_old_cset_length = cset_chooser->calcMinOldCSetLength();
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2668
    const size_t max_old_cset_length = cset_chooser->calcMaxOldCSetLength();
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2669
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2670
    size_t expensive_region_num = 0;
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2671
    bool check_time_remaining = adaptive_young_list_length();
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2672
    HeapRegion* hr = cset_chooser->peek();
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2673
    while (hr != NULL) {
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2674
      if (old_cset_region_length() >= max_old_cset_length) {
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2675
        // Added maximum number of old regions to the CSet.
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2676
        ergo_verbose2(ErgoCSetConstruction,
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2677
                      "finish adding old regions to CSet",
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2678
                      ergo_format_reason("old CSet region num reached max")
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2679
                      ergo_format_region("old")
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2680
                      ergo_format_region("max"),
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2681
                      old_cset_region_length(), max_old_cset_length);
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2682
        break;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2683
      }
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2684
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2685
      double predicted_time_ms = predict_region_elapsed_time_ms(hr, false);
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2686
      if (check_time_remaining) {
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2687
        if (predicted_time_ms > time_remaining_ms) {
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2688
          // Too expensive for the current CSet.
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2689
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2690
          if (old_cset_region_length() >= min_old_cset_length) {
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2691
            // We have added the minimum number of old regions to the CSet,
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2692
            // we are done with this CSet.
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2693
            ergo_verbose4(ErgoCSetConstruction,
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2694
                          "finish adding old regions to CSet",
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2695
                          ergo_format_reason("predicted time is too high")
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2696
                          ergo_format_ms("predicted time")
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2697
                          ergo_format_ms("remaining time")
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2698
                          ergo_format_region("old")
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2699
                          ergo_format_region("min"),
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2700
                          predicted_time_ms, time_remaining_ms,
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2701
                          old_cset_region_length(), min_old_cset_length);
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2702
            break;
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2703
          }
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2704
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2705
          // We'll add it anyway given that we haven't reached the
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2706
          // minimum number of old regions.
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2707
          expensive_region_num += 1;
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2708
        }
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2709
      } else {
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2710
        if (old_cset_region_length() >= min_old_cset_length) {
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2711
          // In the non-auto-tuning case, we'll finish adding regions
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2712
          // to the CSet if we reach the minimum.
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2713
          ergo_verbose2(ErgoCSetConstruction,
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2714
                        "finish adding old regions to CSet",
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2715
                        ergo_format_reason("old CSet region num reached min")
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2716
                        ergo_format_region("old")
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2717
                        ergo_format_region("min"),
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2718
                        old_cset_region_length(), min_old_cset_length);
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2719
          break;
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2720
        }
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2721
      }
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2722
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2723
      // We will add this region to the CSet.
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2724
      time_remaining_ms -= predicted_time_ms;
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2725
      predicted_pause_time_ms += predicted_time_ms;
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2726
      cset_chooser->remove_and_move_to_next(hr);
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2727
      _g1->old_set_remove(hr);
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2728
      add_old_region_to_cset(hr);
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2729
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2730
      hr = cset_chooser->peek();
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2731
    }
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2732
    if (hr == NULL) {
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2733
      ergo_verbose0(ErgoCSetConstruction,
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2734
                    "finish adding old regions to CSet",
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2735
                    ergo_format_reason("candidate old regions not available"));
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2736
    }
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2737
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2738
    if (expensive_region_num > 0) {
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2739
      // We print the information once here at the end, predicated on
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2740
      // whether we added any apparently expensive regions or not, to
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2741
      // avoid generating output per region.
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2742
      ergo_verbose4(ErgoCSetConstruction,
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2743
                    "added expensive regions to CSet",
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2744
                    ergo_format_reason("old CSet region num not reached min")
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2745
                    ergo_format_region("old")
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2746
                    ergo_format_region("expensive")
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2747
                    ergo_format_region("min")
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2748
                    ergo_format_ms("remaining time"),
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2749
                    old_cset_region_length(),
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2750
                    expensive_region_num,
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2751
                    min_old_cset_length,
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2752
                    time_remaining_ms);
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2753
    }
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2754
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11584
diff changeset
  2755
    assert(cset_chooser->verify(), "CSet Chooser verification - post");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2756
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2757
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2758
  stop_incremental_cset_building();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2759
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2760
  count_CS_bytes_used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2761
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2762
  ergo_verbose5(ErgoCSetConstruction,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2763
                "finish choosing CSet",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2764
                ergo_format_region("eden")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2765
                ergo_format_region("survivors")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2766
                ergo_format_region("old")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2767
                ergo_format_ms("predicted pause time")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2768
                ergo_format_ms("target pause time"),
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  2769
                eden_region_length, survivor_region_length,
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10996
diff changeset
  2770
                old_cset_region_length(),
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2771
                predicted_pause_time_ms, target_pause_time_ms);
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10281
diff changeset
  2772
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2773
  double non_young_end_time_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2774
  _recorded_non_young_cset_choice_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2775
    (non_young_end_time_sec - non_young_start_time_sec) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2776
}