hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp
author tonyp
Fri, 12 Aug 2011 11:31:06 -0400
changeset 10243 d00a21009f1f
parent 10236 c4256e927bed
child 10280 3463715b5ef7
permissions -rw-r--r--
7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally Summary: Refactor the allocation code during GC to use the G1AllocRegion abstraction. Use separate subclasses of G1AllocRegion for survivor and old regions. Avoid BOT updates and dirty survivor cards incrementally for the former. Reviewed-by: brutisso, johnc, ysr
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
/*
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7416
diff changeset
     2
 * Copyright (c) 2001, 2011, 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"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    31
#include "gc_implementation/g1/heapRegionRemSet.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    32
#include "gc_implementation/shared/gcPolicyCounters.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    33
#include "runtime/arguments.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    34
#include "runtime/java.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    35
#include "runtime/mutexLocker.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6759
diff changeset
    36
#include "utilities/debug.hpp"
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    37
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    38
#define PREDICTIONS_VERBOSE 0
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
// <NEW PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    41
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    42
// Different defaults for different number of GC threads
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    43
// 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
    44
//   numbers of GC threads and choosing them based on the results
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    45
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    46
// all the same
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    47
static double rs_length_diff_defaults[] = {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    48
  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
    49
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    50
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    51
static double cost_per_card_ms_defaults[] = {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    52
  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
    53
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    54
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    55
// all the same
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    56
static double fully_young_cards_per_entry_ratio_defaults[] = {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    57
  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
    58
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    59
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    60
static double cost_per_entry_ms_defaults[] = {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    61
  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
    62
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    63
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    64
static double cost_per_byte_ms_defaults[] = {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    65
  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
    66
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    67
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    68
// these should be pretty consistent
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    69
static double constant_other_time_ms_defaults[] = {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    70
  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
    71
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    72
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    73
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    74
static double young_other_cost_per_region_ms_defaults[] = {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    75
  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
    76
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    77
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    78
static double non_young_other_cost_per_region_ms_defaults[] = {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    79
  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
    80
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    81
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    82
// </NEW PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    83
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    84
// Help class for avoiding interleaved logging
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    85
class LineBuffer: public StackObj {
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    86
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    87
private:
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    88
  static const int BUFFER_LEN = 1024;
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    89
  static const int INDENT_CHARS = 3;
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    90
  char _buffer[BUFFER_LEN];
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    91
  int _indent_level;
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    92
  int _cur;
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    93
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    94
  void vappend(const char* format, va_list ap) {
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    95
    int res = vsnprintf(&_buffer[_cur], BUFFER_LEN - _cur, format, ap);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    96
    if (res != -1) {
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    97
      _cur += res;
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    98
    } else {
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
    99
      DEBUG_ONLY(warning("buffer too small in LineBuffer");)
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   100
      _buffer[BUFFER_LEN -1] = 0;
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   101
      _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
   102
    }
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   103
  }
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   104
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   105
public:
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   106
  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
   107
    for (; (_cur < BUFFER_LEN && _cur < (_indent_level * INDENT_CHARS)); _cur++) {
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   108
      _buffer[_cur] = ' ';
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   109
    }
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   110
  }
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
#ifndef PRODUCT
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   113
  ~LineBuffer() {
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   114
    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
   115
  }
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   116
#endif
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   117
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   118
  void append(const char* format, ...) {
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   119
    va_list ap;
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   120
    va_start(ap, format);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   121
    vappend(format, ap);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   122
    va_end(ap);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   123
  }
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   124
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   125
  void append_and_print_cr(const char* format, ...) {
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   126
    va_list ap;
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   127
    va_start(ap, format);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   128
    vappend(format, ap);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   129
    va_end(ap);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   130
    gclog_or_tty->print_cr("%s", _buffer);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   131
    _cur = _indent_level * INDENT_CHARS;
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   132
  }
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   133
};
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
   134
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   135
G1CollectorPolicy::G1CollectorPolicy() :
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
   136
  _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
   137
                        ? ParallelGCThreads : 1),
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
   138
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   139
  _n_pauses(0),
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
   140
  _recent_rs_scan_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   141
  _recent_pause_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   142
  _recent_rs_sizes(new TruncatedSeq(NumPrevPausesForHeuristics)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   143
  _recent_gc_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   144
  _all_pause_times_ms(new NumberSeq()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   145
  _stop_world_start(0.0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   146
  _all_stop_world_times_ms(new NumberSeq()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   147
  _all_yield_times_ms(new NumberSeq()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   148
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   149
  _all_mod_union_times_ms(new NumberSeq()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   150
2344
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2260
diff changeset
   151
  _summary(new Summary()),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   152
3590
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
   153
#ifndef PRODUCT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   154
  _cur_clear_ct_time_ms(0.0),
3590
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
   155
  _min_clear_cc_time_ms(-1.0),
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
   156
  _max_clear_cc_time_ms(-1.0),
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
   157
  _cur_clear_cc_time_ms(0.0),
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
   158
  _cum_clear_cc_time_ms(0.0),
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
   159
  _num_cc_clears(0L),
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
   160
#endif
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   161
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   162
  _region_num_young(0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   163
  _region_num_tenured(0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   164
  _prev_region_num_young(0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   165
  _prev_region_num_tenured(0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   166
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   167
  _aux_num(10),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   168
  _all_aux_times_ms(new NumberSeq[_aux_num]),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   169
  _cur_aux_start_times_ms(new double[_aux_num]),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   170
  _cur_aux_times_ms(new double[_aux_num]),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   171
  _cur_aux_times_set(new bool[_aux_num]),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   172
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   173
  _concurrent_mark_init_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   174
  _concurrent_mark_remark_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   175
  _concurrent_mark_cleanup_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   176
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   177
  // <NEW PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   178
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   179
  _alloc_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   180
  _prev_collection_pause_end_ms(0.0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   181
  _pending_card_diff_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   182
  _rs_length_diff_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   183
  _cost_per_card_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   184
  _fully_young_cards_per_entry_ratio_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   185
  _partially_young_cards_per_entry_ratio_seq(
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   186
                                         new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   187
  _cost_per_entry_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   188
  _partially_young_cost_per_entry_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   189
  _cost_per_byte_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   190
  _cost_per_byte_ms_during_cm_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   191
  _constant_other_time_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   192
  _young_other_cost_per_region_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   193
  _non_young_other_cost_per_region_ms_seq(
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   194
                                         new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   195
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   196
  _pending_cards_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   197
  _scanned_cards_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   198
  _rs_lengths_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   199
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
   200
  _pause_time_target_ms((double) MaxGCPauseMillis),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   201
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   202
  // </NEW PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   203
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   204
  _in_young_gc_mode(false),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   205
  _full_young_gcs(true),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   206
  _full_young_pause_num(0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   207
  _partial_young_pause_num(0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   208
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   209
  _during_marking(false),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   210
  _in_marking_window(false),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   211
  _in_marking_window_im(false),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   212
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   213
  _known_garbage_ratio(0.0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   214
  _known_garbage_bytes(0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   215
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   216
  _young_gc_eff_seq(new TruncatedSeq(TruncatedSeqLength)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   217
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   218
   _recent_prev_end_times_for_all_gcs_sec(new TruncatedSeq(NumPrevPausesForHeuristics)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   219
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   220
  _recent_CS_bytes_used_before(new TruncatedSeq(NumPrevPausesForHeuristics)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   221
  _recent_CS_bytes_surviving(new TruncatedSeq(NumPrevPausesForHeuristics)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   222
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   223
  _recent_avg_pause_time_ratio(0.0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   224
  _num_markings(0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   225
  _n_marks(0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   226
  _n_pauses_at_mark_end(0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   227
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   228
  _all_full_gc_times_ms(new NumberSeq()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   229
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   230
  // G1PausesBtwnConcMark defaults to -1
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   231
  // so the hack is to do the cast  QQQ FIXME
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   232
  _pauses_btwn_concurrent_mark((size_t)G1PausesBtwnConcMark),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   233
  _n_marks_since_last_pause(0),
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
   234
  _initiate_conc_mark_if_possible(false),
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
   235
  _during_initial_mark_pause(false),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   236
  _should_revert_to_full_young_gcs(false),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   237
  _last_full_young_gc(false),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   238
9987
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
   239
  _eden_bytes_before_gc(0),
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
   240
  _survivor_bytes_before_gc(0),
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
   241
  _capacity_before_gc(0),
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
   242
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   243
  _prev_collection_pause_used_at_end_bytes(0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   244
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   245
  _collection_set(NULL),
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   246
  _collection_set_size(0),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   247
  _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
   248
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   249
  // Incremental CSet attributes
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   250
  _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
   251
  _inc_cset_head(NULL),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   252
  _inc_cset_tail(NULL),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   253
  _inc_cset_size(0),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   254
  _inc_cset_young_index(0),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   255
  _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
   256
  _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
   257
  _inc_cset_recorded_young_bytes(0),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   258
  _inc_cset_recorded_rs_lengths(0),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   259
  _inc_cset_predicted_elapsed_time_ms(0.0),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   260
  _inc_cset_predicted_bytes_to_copy(0),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   261
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   262
#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
   263
#pragma warning( disable:4355 ) // 'this' : used in base member initializer list
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   264
#endif // _MSC_VER
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   265
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   266
  _short_lived_surv_rate_group(new SurvRateGroup(this, "Short Lived",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   267
                                                 G1YoungSurvRateNumRegionsSummary)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   268
  _survivor_surv_rate_group(new SurvRateGroup(this, "Survivor",
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   269
                                              G1YoungSurvRateNumRegionsSummary)),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   270
  // add here any more surv rate groups
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   271
  _recorded_survivor_regions(0),
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   272
  _recorded_survivor_head(NULL),
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   273
  _recorded_survivor_tail(NULL),
5240
3892e01609c6 6937160: G1: should observe GCTimeRatio
tonyp
parents: 5036
diff changeset
   274
  _survivors_age_table(true),
3892e01609c6 6937160: G1: should observe GCTimeRatio
tonyp
parents: 5036
diff changeset
   275
3892e01609c6 6937160: G1: should observe GCTimeRatio
tonyp
parents: 5036
diff changeset
   276
  _gc_overhead_perc(0.0)
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   277
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   278
{
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3691
diff changeset
   279
  // 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
   280
  // 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
   281
  // so it's done as soon as possible.
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3691
diff changeset
   282
  HeapRegion::setup_heap_region_size(Arguments::min_heap_size());
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4481
diff changeset
   283
  HeapRegionRemSet::setup_remset_size();
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3691
diff changeset
   284
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5344
diff changeset
   285
  // Verify PLAB sizes
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5344
diff changeset
   286
  const uint region_size = HeapRegion::GrainWords;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5344
diff changeset
   287
  if (YoungPLABSize > region_size || OldPLABSize > region_size) {
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5344
diff changeset
   288
    char buffer[128];
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5344
diff changeset
   289
    jio_snprintf(buffer, sizeof(buffer), "%sPLABSize should be at most %u",
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5344
diff changeset
   290
                 OldPLABSize > region_size ? "Old" : "Young", region_size);
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5344
diff changeset
   291
    vm_exit_during_initialization(buffer);
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5344
diff changeset
   292
  }
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5344
diff changeset
   293
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   294
  _recent_prev_end_times_for_all_gcs_sec->add(os::elapsedTime());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   295
  _prev_collection_pause_end_ms = os::elapsedTime() * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   296
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   297
  _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
   298
  _par_last_ext_root_scan_times_ms = new double[_parallel_gc_threads];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   299
  _par_last_mark_stack_scan_times_ms = new double[_parallel_gc_threads];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   300
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   301
  _par_last_update_rs_times_ms = new double[_parallel_gc_threads];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   302
  _par_last_update_rs_processed_buffers = new double[_parallel_gc_threads];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   303
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   304
  _par_last_scan_rs_times_ms = new double[_parallel_gc_threads];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   305
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   306
  _par_last_obj_copy_times_ms = new double[_parallel_gc_threads];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   307
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   308
  _par_last_termination_times_ms = new double[_parallel_gc_threads];
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   309
  _par_last_termination_attempts = new double[_parallel_gc_threads];
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   310
  _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
   311
  _par_last_gc_worker_times_ms = new double[_parallel_gc_threads];
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   312
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   313
  // start conservatively
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
   314
  _expensive_region_limit_ms = 0.5 * (double) MaxGCPauseMillis;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   315
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   316
  // <NEW PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   317
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   318
  int index;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   319
  if (ParallelGCThreads == 0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   320
    index = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   321
  else if (ParallelGCThreads > 8)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   322
    index = 7;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   323
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   324
    index = ParallelGCThreads - 1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   325
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   326
  _pending_card_diff_seq->add(0.0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   327
  _rs_length_diff_seq->add(rs_length_diff_defaults[index]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   328
  _cost_per_card_ms_seq->add(cost_per_card_ms_defaults[index]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   329
  _fully_young_cards_per_entry_ratio_seq->add(
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   330
                            fully_young_cards_per_entry_ratio_defaults[index]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   331
  _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
   332
  _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
   333
  _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
   334
  _young_other_cost_per_region_ms_seq->add(
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   335
                               young_other_cost_per_region_ms_defaults[index]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   336
  _non_young_other_cost_per_region_ms_seq->add(
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   337
                           non_young_other_cost_per_region_ms_defaults[index]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   338
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   339
  // </NEW PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   340
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
   341
  // 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
   342
  // 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
   343
  // 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
   344
  // 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
   345
  // 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
   346
  // 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
   347
  // 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
   348
  // 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
   349
  // 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
   350
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
  // 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
   352
  // 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
   353
  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
   354
    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
   355
      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
   356
                                    "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
   357
    }
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
  }
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
  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
   360
    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
   361
      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
   362
                                    "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
   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
  }
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
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
  // 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
   367
  // 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
   368
  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
   369
    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
   370
      // 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
   371
      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
   372
    } 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
   373
      // 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
   374
      // 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
   375
      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
   376
                                    "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
   377
    }
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
   378
  }
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
   379
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
   380
  // 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
   381
  // 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
   382
  // 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
   383
  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
   384
    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
   385
  }
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
   386
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
   387
  // 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
   388
  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
   389
    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
   390
    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
   391
                 "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
   392
                 "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
   393
                 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
   394
    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
   395
  }
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
   396
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
   397
  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
   398
  double time_slice  = (double) GCPauseIntervalMillis / 1000.0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   399
  _mmu_tracker = new G1MMUTrackerQueue(time_slice, max_gc_time);
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
   400
  _sigma = (double) G1ConfidencePercent / 100.0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   401
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   402
  // start conservatively (around 50ms is about right)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   403
  _concurrent_mark_init_times_ms->add(0.05);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   404
  _concurrent_mark_remark_times_ms->add(0.05);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   405
  _concurrent_mark_cleanup_times_ms->add(0.20);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   406
  _tenuring_threshold = MaxTenuringThreshold;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   407
5033
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
   408
  // if G1FixedSurvivorSpaceSize is 0 which means the size is not
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
   409
  // fixed, then _max_survivor_regions will be calculated at
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   410
  // calculate_young_list_target_length during initialization
5033
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
   411
  _max_survivor_regions = G1FixedSurvivorSpaceSize / HeapRegion::GrainBytes;
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   412
5240
3892e01609c6 6937160: G1: should observe GCTimeRatio
tonyp
parents: 5036
diff changeset
   413
  assert(GCTimeRatio > 0,
3892e01609c6 6937160: G1: should observe GCTimeRatio
tonyp
parents: 5036
diff changeset
   414
         "we should have set it to a default value set_g1_gc_flags() "
3892e01609c6 6937160: G1: should observe GCTimeRatio
tonyp
parents: 5036
diff changeset
   415
         "if a user set it to 0");
3892e01609c6 6937160: G1: should observe GCTimeRatio
tonyp
parents: 5036
diff changeset
   416
  _gc_overhead_perc = 100.0 * (1.0 / (1.0 + GCTimeRatio));
3892e01609c6 6937160: G1: should observe GCTimeRatio
tonyp
parents: 5036
diff changeset
   417
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   418
  initialize_all();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   419
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   420
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   421
// Increment "i", mod "len"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   422
static void inc_mod(int& i, int len) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   423
  i++; if (i == len) i = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   424
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   425
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   426
void G1CollectorPolicy::initialize_flags() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   427
  set_min_alignment(HeapRegion::GrainBytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   428
  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
   429
  if (SurvivorRatio < 1) {
d666454081dd 6802413: G1: G1FixedSurvivorSpaceSize should be converted into regions in calculate_survivors_policy()
apetrusenko
parents: 2009
diff changeset
   430
    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
   431
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   432
  CollectorPolicy::initialize_flags();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   433
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   434
5036
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   435
// The easiest way to deal with the parsing of the NewSize /
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   436
// MaxNewSize / etc. parameteres is to re-use the code in the
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   437
// TwoGenerationCollectorPolicy class. This is similar to what
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   438
// ParallelScavenge does with its GenerationSizer class (see
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   439
// ParallelScavengeHeap::initialize()). We might change this in the
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   440
// future, but it's a good start.
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   441
class G1YoungGenSizer : public TwoGenerationCollectorPolicy {
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   442
  size_t size_to_region_num(size_t byte_size) {
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   443
    return MAX2((size_t) 1, byte_size / HeapRegion::GrainBytes);
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   444
  }
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   445
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   446
public:
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   447
  G1YoungGenSizer() {
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   448
    initialize_flags();
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   449
    initialize_size_info();
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   450
  }
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   451
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   452
  size_t min_young_region_num() {
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   453
    return size_to_region_num(_min_gen0_size);
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   454
  }
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   455
  size_t initial_young_region_num() {
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   456
    return size_to_region_num(_initial_gen0_size);
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   457
  }
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   458
  size_t max_young_region_num() {
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   459
    return size_to_region_num(_max_gen0_size);
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   460
  }
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   461
};
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   462
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   463
void G1CollectorPolicy::init() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   464
  // Set aside an initial future to_space.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   465
  _g1 = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   466
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   467
  assert(Heap_lock->owned_by_self(), "Locking discipline.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   468
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   469
  initialize_gc_policy_counters();
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   470
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   471
  if (G1Gen) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   472
    _in_young_gc_mode = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   473
5036
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   474
    G1YoungGenSizer sizer;
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   475
    size_t initial_region_num = sizer.initial_young_region_num();
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   476
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   477
    if (UseAdaptiveSizePolicy) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   478
      set_adaptive_young_list_length(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   479
      _young_list_fixed_length = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   480
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   481
      set_adaptive_young_list_length(false);
5036
7b652cd72d65 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 5034
diff changeset
   482
      _young_list_fixed_length = initial_region_num;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   483
    }
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   484
    _free_regions_at_end_of_collection = _g1->free_regions();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   485
    calculate_young_list_min_length();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   486
    guarantee( _young_list_min_length == 0, "invariant, not enough info" );
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   487
    calculate_young_list_target_length();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   488
  } else {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   489
     _young_list_fixed_length = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   490
    _in_young_gc_mode = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   491
  }
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   492
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   493
  // 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
   494
  // 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
   495
  start_incremental_cset_building();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   496
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   497
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   498
// Create the jstat counters for the policy.
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   499
void G1CollectorPolicy::initialize_gc_policy_counters()
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   500
{
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   501
  _gc_policy_counters = new GCPolicyCounters("GarbageFirst", 1, 2 + G1Gen);
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   502
}
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   503
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   504
void G1CollectorPolicy::calculate_young_list_min_length() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   505
  _young_list_min_length = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   506
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   507
  if (!adaptive_young_list_length())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   508
    return;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   509
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   510
  if (_alloc_rate_ms_seq->num() > 3) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   511
    double now_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   512
    double when_ms = _mmu_tracker->when_max_gc_sec(now_sec) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   513
    double alloc_rate_ms = predict_alloc_rate_ms();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   514
    size_t min_regions = (size_t) ceil(alloc_rate_ms * when_ms);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   515
    size_t current_region_num = _g1->young_list()->length();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   516
    _young_list_min_length = min_regions + current_region_num;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   517
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   518
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   519
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   520
void G1CollectorPolicy::calculate_young_list_target_length() {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   521
  if (adaptive_young_list_length()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   522
    size_t rs_lengths = (size_t) get_new_prediction(_rs_lengths_seq);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   523
    calculate_young_list_target_length(rs_lengths);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   524
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   525
    if (full_young_gcs())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   526
      _young_list_target_length = _young_list_fixed_length;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   527
    else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   528
      _young_list_target_length = _young_list_fixed_length / 2;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   529
  }
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   530
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   531
  // Make sure we allow the application to allocate at least one
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   532
  // region before we need to do a collection again.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   533
  size_t min_length = _g1->young_list()->length() + 1;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   534
  _young_list_target_length = MAX2(_young_list_target_length, min_length);
7416
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
   535
  calculate_max_gc_locker_expansion();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   536
  calculate_survivors_policy();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   537
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   538
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   539
void G1CollectorPolicy::calculate_young_list_target_length(size_t rs_lengths) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   540
  guarantee( adaptive_young_list_length(), "pre-condition" );
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   541
  guarantee( !_in_marking_window || !_last_full_young_gc, "invariant" );
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   542
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   543
  double start_time_sec = os::elapsedTime();
5033
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
   544
  size_t min_reserve_perc = MAX2((size_t)2, (size_t)G1ReservePercent);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   545
  min_reserve_perc = MIN2((size_t) 50, min_reserve_perc);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   546
  size_t reserve_regions =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   547
    (size_t) ((double) min_reserve_perc * (double) _g1->n_regions() / 100.0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   548
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   549
  if (full_young_gcs() && _free_regions_at_end_of_collection > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   550
    // we are in fully-young mode and there are free regions in the heap
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   551
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   552
    double survivor_regions_evac_time =
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   553
        predict_survivor_regions_evac_time();
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   554
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   555
    double target_pause_time_ms = _mmu_tracker->max_gc_time() * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   556
    size_t pending_cards = (size_t) get_new_prediction(_pending_cards_seq);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   557
    size_t adj_rs_lengths = rs_lengths + predict_rs_length_diff();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   558
    size_t scanned_cards = predict_young_card_num(adj_rs_lengths);
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   559
    double base_time_ms = predict_base_elapsed_time_ms(pending_cards, scanned_cards)
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   560
                          + survivor_regions_evac_time;
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   561
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   562
    // the result
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   563
    size_t final_young_length = 0;
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   564
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   565
    size_t init_free_regions =
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   566
      MAX2((size_t)0, _free_regions_at_end_of_collection - reserve_regions);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   567
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   568
    // if we're still under the pause target...
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   569
    if (base_time_ms <= target_pause_time_ms) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   570
      // We make sure that the shortest young length that makes sense
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   571
      // fits within the target pause time.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   572
      size_t min_young_length = 1;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   573
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   574
      if (predict_will_fit(min_young_length, base_time_ms,
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   575
                                     init_free_regions, target_pause_time_ms)) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   576
        // The shortest young length will fit within the target pause time;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   577
        // we'll now check whether the absolute maximum number of young
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   578
        // regions will fit in the target pause time. If not, we'll do
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   579
        // a binary search between min_young_length and max_young_length
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   580
        size_t abs_max_young_length = _free_regions_at_end_of_collection - 1;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   581
        size_t max_young_length = abs_max_young_length;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   582
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   583
        if (max_young_length > min_young_length) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   584
          // Let's check if the initial max young length will fit within the
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   585
          // target pause. If so then there is no need to search for a maximal
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   586
          // young length - we'll return the initial maximum
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   587
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   588
          if (predict_will_fit(max_young_length, base_time_ms,
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   589
                                init_free_regions, target_pause_time_ms)) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   590
            // The maximum young length will satisfy the target pause time.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   591
            // We are done so set min young length to this maximum length.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   592
            // The code after the loop will then set final_young_length using
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   593
            // the value cached in the minimum length.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   594
            min_young_length = max_young_length;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   595
          } else {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   596
            // The maximum possible number of young regions will not fit within
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   597
            // the target pause time so let's search....
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   598
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   599
            size_t diff = (max_young_length - min_young_length) / 2;
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   600
            max_young_length = min_young_length + diff;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   601
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   602
            while (max_young_length > min_young_length) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   603
              if (predict_will_fit(max_young_length, base_time_ms,
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   604
                                        init_free_regions, target_pause_time_ms)) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   605
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   606
                // The current max young length will fit within the target
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   607
                // pause time. Note we do not exit the loop here. By setting
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   608
                // min = max, and then increasing the max below means that
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   609
                // we will continue searching for an upper bound in the
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   610
                // range [max..max+diff]
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   611
                min_young_length = max_young_length;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   612
              }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   613
              diff = (max_young_length - min_young_length) / 2;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   614
              max_young_length = min_young_length + diff;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   615
            }
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   616
            // the above loop found a maximal young length that will fit
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   617
            // within the target pause time.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   618
          }
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   619
          assert(min_young_length <= abs_max_young_length, "just checking");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   620
        }
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   621
        final_young_length = min_young_length;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   622
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   623
    }
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   624
    // and we're done!
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   625
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   626
    // we should have at least one region in the target young length
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   627
    _young_list_target_length =
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   628
                              final_young_length + _recorded_survivor_regions;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   629
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   630
    // let's keep an eye of how long we spend on this calculation
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   631
    // right now, I assume that we'll print it when we need it; we
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   632
    // should really adde it to the breakdown of a pause
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   633
    double end_time_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   634
    double elapsed_time_ms = (end_time_sec - start_time_sec) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   635
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   636
#ifdef TRACE_CALC_YOUNG_LENGTH
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   637
    // leave this in for debugging, just in case
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   638
    gclog_or_tty->print_cr("target = %1.1lf ms, young = " SIZE_FORMAT ", "
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   639
                           "elapsed %1.2lf ms, (%s%s) " SIZE_FORMAT SIZE_FORMAT,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   640
                           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
   641
                           _young_list_target_length
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   642
                           elapsed_time_ms,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   643
                           full_young_gcs() ? "full" : "partial",
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
   644
                           during_initial_mark_pause() ? " i-m" : "",
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   645
                           _in_marking_window,
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   646
                           _in_marking_window_im);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   647
#endif // TRACE_CALC_YOUNG_LENGTH
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   648
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   649
    if (_young_list_target_length < _young_list_min_length) {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   650
      // bummer; this means that, if we do a pause when the maximal
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   651
      // length dictates, we'll violate the pause spacing target (the
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   652
      // min length was calculate based on the application's current
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   653
      // alloc rate);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   654
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   655
      // so, we have to bite the bullet, and allocate the minimum
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   656
      // number. We'll violate our target, but we just can't meet it.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   657
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   658
#ifdef TRACE_CALC_YOUNG_LENGTH
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   659
      // leave this in for debugging, just in case
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   660
      gclog_or_tty->print_cr("adjusted target length from "
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   661
                             SIZE_FORMAT " to " SIZE_FORMAT,
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   662
                             _young_list_target_length, _young_list_min_length);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   663
#endif // TRACE_CALC_YOUNG_LENGTH
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   664
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   665
      _young_list_target_length = _young_list_min_length;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   666
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   667
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   668
    // we are in a partially-young mode or we've run out of regions (due
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   669
    // to evacuation failure)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   670
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   671
#ifdef TRACE_CALC_YOUNG_LENGTH
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   672
    // leave this in for debugging, just in case
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   673
    gclog_or_tty->print_cr("(partial) setting target to " SIZE_FORMAT
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   674
                           _young_list_min_length);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   675
#endif // TRACE_CALC_YOUNG_LENGTH
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   676
    // we'll do the pause as soon as possible by choosing the minimum
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   677
    _young_list_target_length = _young_list_min_length;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   678
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   679
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   680
  _rs_lengths_prediction = rs_lengths;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   681
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   682
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   683
// This is used by: calculate_young_list_target_length(rs_length). It
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   684
// returns true iff:
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   685
//   the predicted pause time for the given young list will not overflow
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   686
//   the target pause time
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   687
// and:
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   688
//   the predicted amount of surviving data will not overflow the
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   689
//   the amount of free space available for survivor regions.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   690
//
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   691
bool
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   692
G1CollectorPolicy::predict_will_fit(size_t young_length,
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   693
                                    double base_time_ms,
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   694
                                    size_t init_free_regions,
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   695
                                    double target_pause_time_ms) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   696
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   697
  if (young_length >= init_free_regions)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   698
    // end condition 1: not enough space for the young regions
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   699
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   700
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   701
  double accum_surv_rate_adj = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   702
  double accum_surv_rate =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   703
    accum_yg_surv_rate_pred((int)(young_length - 1)) - accum_surv_rate_adj;
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   704
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   705
  size_t bytes_to_copy =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   706
    (size_t) (accum_surv_rate * (double) HeapRegion::GrainBytes);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   707
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   708
  double copy_time_ms = predict_object_copy_time_ms(bytes_to_copy);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   709
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   710
  double young_other_time_ms =
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   711
                       predict_young_other_time_ms(young_length);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   712
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   713
  double pause_time_ms =
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   714
                   base_time_ms + copy_time_ms + young_other_time_ms;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   715
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   716
  if (pause_time_ms > target_pause_time_ms)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   717
    // end condition 2: over the target pause time
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   718
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   719
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   720
  size_t free_bytes =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   721
                 (init_free_regions - young_length) * HeapRegion::GrainBytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   722
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   723
  if ((2.0 + sigma()) * (double) bytes_to_copy > (double) free_bytes)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   724
    // end condition 3: out of to-space (conservatively)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   725
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   726
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   727
  // success!
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   728
  return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   729
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   730
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   731
double G1CollectorPolicy::predict_survivor_regions_evac_time() {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   732
  double survivor_regions_evac_time = 0.0;
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   733
  for (HeapRegion * r = _recorded_survivor_head;
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   734
       r != NULL && r != _recorded_survivor_tail->get_next_young_region();
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   735
       r = r->get_next_young_region()) {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   736
    survivor_regions_evac_time += predict_region_elapsed_time_ms(r, true);
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   737
  }
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   738
  return survivor_regions_evac_time;
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   739
}
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   740
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   741
void G1CollectorPolicy::check_prediction_validity() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   742
  guarantee( adaptive_young_list_length(), "should not call this otherwise" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   743
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   744
  size_t rs_lengths = _g1->young_list()->sampled_rs_lengths();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   745
  if (rs_lengths > _rs_lengths_prediction) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   746
    // add 10% to avoid having to recalculate often
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   747
    size_t rs_lengths_prediction = rs_lengths * 1100 / 1000;
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   748
    calculate_young_list_target_length(rs_lengths_prediction);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   749
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   750
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   751
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   752
HeapWord* G1CollectorPolicy::mem_allocate_work(size_t size,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   753
                                               bool is_tlab,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   754
                                               bool* gc_overhead_limit_was_exceeded) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   755
  guarantee(false, "Not using this policy feature yet.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   756
  return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   757
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   758
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   759
// This method controls how a collector handles one or more
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   760
// of its generations being fully allocated.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   761
HeapWord* G1CollectorPolicy::satisfy_failed_allocation(size_t size,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   762
                                                       bool is_tlab) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   763
  guarantee(false, "Not using this policy feature yet.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   764
  return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   765
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   766
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   767
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   768
#ifndef PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   769
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
   770
  HeapRegion* head = _g1->young_list()->first_region();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   771
  return
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   772
    verify_young_ages(head, _short_lived_surv_rate_group);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   773
  // also call verify_young_ages on any additional surv rate groups
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   776
bool
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   777
G1CollectorPolicy::verify_young_ages(HeapRegion* head,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   778
                                     SurvRateGroup *surv_rate_group) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   779
  guarantee( surv_rate_group != NULL, "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   780
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   781
  const char* name = surv_rate_group->name();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   782
  bool ret = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   783
  int prev_age = -1;
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
  for (HeapRegion* curr = head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   786
       curr != NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   787
       curr = curr->get_next_young_region()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   788
    SurvRateGroup* group = curr->surv_rate_group();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   789
    if (group == NULL && !curr->is_survivor()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   790
      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
   791
      ret = false;
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
    if (surv_rate_group == group) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   795
      int age = curr->age_in_surv_rate_group();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   796
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   797
      if (age < 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   798
        gclog_or_tty->print_cr("## %s: encountered negative age", name);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   799
        ret = false;
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
      if (age <= prev_age) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   803
        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
   804
                               "(%d, %d)", name, age, prev_age);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   805
        ret = false;
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
      prev_age = age;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   808
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   809
  }
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
  return ret;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   812
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   813
#endif // PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   814
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   815
void G1CollectorPolicy::record_full_collection_start() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   816
  _cur_collection_start_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   817
  // 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
   818
  _g1->set_full_collection();
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   821
void G1CollectorPolicy::record_full_collection_end() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   822
  // Consider this like a collection pause for the purposes of allocation
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   823
  // since last pause.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   824
  double end_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   825
  double full_gc_time_sec = end_sec - _cur_collection_start_sec;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   826
  double full_gc_time_ms = full_gc_time_sec * 1000.0;
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
  _all_full_gc_times_ms->add(full_gc_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   829
2121
0b899b36d991 6804746: G1: guarantee(variance() > -1.0,"variance should be >= 0") (due to evacuation failure)
tonyp
parents: 2011
diff changeset
   830
  update_recent_gc_times(end_sec, full_gc_time_ms);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   831
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   832
  _g1->clear_full_collection();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   833
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   834
  // "Nuke" the heuristics that control the fully/partially young GC
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   835
  // transitions and make sure we start with fully young GCs after the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   836
  // Full GC.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   837
  set_full_young_gcs(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   838
  _last_full_young_gc = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   839
  _should_revert_to_full_young_gcs = false;
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
   840
  clear_initiate_conc_mark_if_possible();
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
   841
  clear_during_initial_mark_pause();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   842
  _known_garbage_bytes = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   843
  _known_garbage_ratio = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   844
  _in_marking_window = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   845
  _in_marking_window_im = false;
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
  _short_lived_surv_rate_group->start_adding_regions();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   848
  // also call this on any additional surv rate groups
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   849
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   850
  record_survivor_regions(0, NULL, NULL);
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   851
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   852
  _prev_region_num_young   = _region_num_young;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   853
  _prev_region_num_tenured = _region_num_tenured;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   854
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   855
  _free_regions_at_end_of_collection = _g1->free_regions();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   856
  // Reset survivors SurvRateGroup.
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   857
  _survivor_surv_rate_group->reset();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   858
  calculate_young_list_min_length();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   859
  calculate_young_list_target_length();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   860
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   861
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   862
void G1CollectorPolicy::record_stop_world_start() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   863
  _stop_world_start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   864
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   865
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   866
void G1CollectorPolicy::record_collection_pause_start(double start_time_sec,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   867
                                                      size_t start_used) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   868
  if (PrintGCDetails) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   869
    gclog_or_tty->stamp(PrintGCTimeStamps);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   870
    gclog_or_tty->print("[GC pause");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   871
    if (in_young_gc_mode())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   872
      gclog_or_tty->print(" (%s)", full_young_gcs() ? "young" : "partial");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   873
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   874
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   875
  assert(_g1->used() == _g1->recalculate_used(),
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   876
         err_msg("sanity, used: "SIZE_FORMAT" recalculate_used: "SIZE_FORMAT,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   877
                 _g1->used(), _g1->recalculate_used()));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   878
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   879
  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
   880
  _all_stop_world_times_ms->add(s_w_t_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   881
  _stop_world_start = 0.0;
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
  _cur_collection_start_sec = start_time_sec;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   884
  _cur_collection_pause_used_at_start_bytes = start_used;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   885
  _cur_collection_pause_used_regions_at_start = _g1->used_regions();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   886
  _pending_cards = _g1->pending_card_num();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   887
  _max_pending_cards = _g1->max_pending_card_num();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   888
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   889
  _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
   890
  _bytes_copied_during_gc = 0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   891
9987
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
   892
  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
   893
  _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
   894
  _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
   895
  _capacity_before_gc = _g1->capacity();
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
   896
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   897
#ifdef DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   898
  // initialise these to something well known so that we can spot
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   899
  // if they are not set properly
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   900
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   901
  for (int i = 0; i < _parallel_gc_threads; ++i) {
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   902
    _par_last_gc_worker_start_times_ms[i] = -1234.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   903
    _par_last_ext_root_scan_times_ms[i] = -1234.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   904
    _par_last_mark_stack_scan_times_ms[i] = -1234.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   905
    _par_last_update_rs_times_ms[i] = -1234.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   906
    _par_last_update_rs_processed_buffers[i] = -1234.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   907
    _par_last_scan_rs_times_ms[i] = -1234.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   908
    _par_last_obj_copy_times_ms[i] = -1234.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   909
    _par_last_termination_times_ms[i] = -1234.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   910
    _par_last_termination_attempts[i] = -1234.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
   911
    _par_last_gc_worker_end_times_ms[i] = -1234.0;
8925
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
   912
    _par_last_gc_worker_times_ms[i] = -1234.0;
1374
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
#endif
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   915
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   916
  for (int i = 0; i < _aux_num; ++i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   917
    _cur_aux_times_ms[i] = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   918
    _cur_aux_times_set[i] = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   919
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   920
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   921
  _satb_drain_time_set = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   922
  _last_satb_drain_processed_buffers = -1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   923
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   924
  if (in_young_gc_mode())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   925
    _last_young_gc_full = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   926
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   927
  // do that for any other surv rate groups
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   928
  _short_lived_surv_rate_group->stop_adding_regions();
5033
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
   929
  _survivors_age_table.clear();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   930
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   931
  assert( verify_young_ages(), "region age verification" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   932
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   933
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   934
void G1CollectorPolicy::record_mark_closure_time(double mark_closure_time_ms) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   935
  _mark_closure_time_ms = mark_closure_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   936
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   937
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   938
void G1CollectorPolicy::record_concurrent_mark_init_start() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   939
  _mark_init_start_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   940
  guarantee(!in_young_gc_mode(), "should not do be here in young GC mode");
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   943
void G1CollectorPolicy::record_concurrent_mark_init_end_pre(double
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   944
                                                   mark_init_elapsed_time_ms) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   945
  _during_marking = true;
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
   946
  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
   947
  clear_during_initial_mark_pause();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   948
  _cur_mark_stop_world_time_ms = mark_init_elapsed_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   949
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   950
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   951
void G1CollectorPolicy::record_concurrent_mark_init_end() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   952
  double end_time_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   953
  double elapsed_time_ms = (end_time_sec - _mark_init_start_sec) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   954
  _concurrent_mark_init_times_ms->add(elapsed_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   955
  record_concurrent_mark_init_end_pre(elapsed_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   956
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   957
  _mmu_tracker->add_pause(_mark_init_start_sec, end_time_sec, true);
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   960
void G1CollectorPolicy::record_concurrent_mark_remark_start() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   961
  _mark_remark_start_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   962
  _during_marking = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   963
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   964
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   965
void G1CollectorPolicy::record_concurrent_mark_remark_end() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   966
  double end_time_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   967
  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
   968
  _concurrent_mark_remark_times_ms->add(elapsed_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   969
  _cur_mark_stop_world_time_ms += elapsed_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   970
  _prev_collection_pause_end_ms += elapsed_time_ms;
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
  _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
   973
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   974
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   975
void G1CollectorPolicy::record_concurrent_mark_cleanup_start() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   976
  _mark_cleanup_start_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   977
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   978
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   979
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   980
G1CollectorPolicy::record_concurrent_mark_cleanup_end(size_t freed_bytes,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   981
                                                      size_t max_live_bytes) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   982
  record_concurrent_mark_cleanup_end_work1(freed_bytes, max_live_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   983
  record_concurrent_mark_cleanup_end_work2();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   984
}
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
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   987
G1CollectorPolicy::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   988
record_concurrent_mark_cleanup_end_work1(size_t freed_bytes,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   989
                                         size_t max_live_bytes) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   990
  if (_n_marks < 2) _n_marks++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   991
  if (G1PolicyVerbose > 0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   992
    gclog_or_tty->print_cr("At end of marking, max_live is " SIZE_FORMAT " MB "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   993
                           " (of " SIZE_FORMAT " MB heap).",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   994
                           max_live_bytes/M, _g1->capacity()/M);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   995
}
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
// The important thing about this is that it includes "os::elapsedTime".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   998
void G1CollectorPolicy::record_concurrent_mark_cleanup_end_work2() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   999
  double end_time_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1000
  double elapsed_time_ms = (end_time_sec - _mark_cleanup_start_sec)*1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1001
  _concurrent_mark_cleanup_times_ms->add(elapsed_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1002
  _cur_mark_stop_world_time_ms += elapsed_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1003
  _prev_collection_pause_end_ms += elapsed_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1004
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1005
  _mmu_tracker->add_pause(_mark_cleanup_start_sec, end_time_sec, true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1006
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1007
  _num_markings++;
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
  // We did a marking, so reset the "since_last_mark" variables.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1010
  double considerConcMarkCost = 1.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1011
  // If there are available processors, concurrent activity is free...
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1012
  if (Threads::number_of_non_daemon_threads() * 2 <
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1013
      os::active_processor_count()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1014
    considerConcMarkCost = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1015
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1016
  _n_pauses_at_mark_end = _n_pauses;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1017
  _n_marks_since_last_pause++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1018
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1019
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1020
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1021
G1CollectorPolicy::record_concurrent_mark_cleanup_completed() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1022
  if (in_young_gc_mode()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1023
    _should_revert_to_full_young_gcs = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1024
    _last_full_young_gc = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1025
    _in_marking_window = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1026
    if (adaptive_young_list_length())
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1027
      calculate_young_list_target_length();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1028
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1029
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1030
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1031
void G1CollectorPolicy::record_concurrent_pause() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1032
  if (_stop_world_start > 0.0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1033
    double yield_ms = (os::elapsedTime() - _stop_world_start) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1034
    _all_yield_times_ms->add(yield_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1035
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1036
}
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
void G1CollectorPolicy::record_concurrent_pause_end() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1039
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1040
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1041
template<class T>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1042
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
  1043
  T sum = (T)0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1044
  for (int i = 0; i < n; i++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1045
    int j = (start + i) % N;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1046
    sum += sum_arr[j];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1047
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1048
  return sum;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1049
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1050
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
  1051
void G1CollectorPolicy::print_par_stats(int level,
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
  1052
                                        const char* str,
8925
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1053
                                        double* data) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1054
  double min = data[0], max = data[0];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1055
  double total = 0.0;
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1056
  LineBuffer buf(level);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1057
  buf.append("[%s (ms):", str);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1058
  for (uint i = 0; i < ParallelGCThreads; ++i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1059
    double val = data[i];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1060
    if (val < min)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1061
      min = val;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1062
    if (val > max)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1063
      max = val;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1064
    total += val;
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1065
    buf.append("  %3.1lf", val);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1066
  }
8925
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1067
  buf.append_and_print_cr("");
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1068
  double avg = total / (double) ParallelGCThreads;
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1069
  buf.append_and_print_cr(" Avg: %5.1lf, Min: %5.1lf, Max: %5.1lf, Diff: %5.1lf]",
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1070
    avg, min, max, max - min);
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
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
  1073
void G1CollectorPolicy::print_par_sizes(int level,
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5890
diff changeset
  1074
                                        const char* str,
8925
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1075
                                        double* data) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1076
  double min = data[0], max = data[0];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1077
  double total = 0.0;
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1078
  LineBuffer buf(level);
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1079
  buf.append("[%s :", str);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1080
  for (uint i = 0; i < ParallelGCThreads; ++i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1081
    double val = data[i];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1082
    if (val < min)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1083
      min = val;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1084
    if (val > max)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1085
      max = val;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1086
    total += val;
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1087
    buf.append(" %d", (int) val);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1088
  }
8925
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1089
  buf.append_and_print_cr("");
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1090
  double avg = total / (double) ParallelGCThreads;
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1091
  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
  1092
    (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
  1093
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1094
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1095
void G1CollectorPolicy::print_stats (int level,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1096
                                     const char* str,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1097
                                     double value) {
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1098
  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
  1099
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1100
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1101
void G1CollectorPolicy::print_stats (int level,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1102
                                     const char* str,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1103
                                     int value) {
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  1104
  LineBuffer(level).append_and_print_cr("[%s: %d]", str, value);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1105
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1106
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1107
double G1CollectorPolicy::avg_value (double* data) {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
  1108
  if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1109
    double ret = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1110
    for (uint i = 0; i < ParallelGCThreads; ++i)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1111
      ret += data[i];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1112
    return ret / (double) ParallelGCThreads;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1113
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1114
    return data[0];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1115
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1116
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1117
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1118
double G1CollectorPolicy::max_value (double* data) {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
  1119
  if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1120
    double ret = data[0];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1121
    for (uint i = 1; i < ParallelGCThreads; ++i)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1122
      if (data[i] > ret)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1123
        ret = data[i];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1124
    return ret;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1125
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1126
    return data[0];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1127
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1128
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1129
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1130
double G1CollectorPolicy::sum_of_values (double* data) {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
  1131
  if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1132
    double sum = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1133
    for (uint i = 0; i < ParallelGCThreads; i++)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1134
      sum += data[i];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1135
    return sum;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1136
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1137
    return data[0];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1138
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1139
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1140
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1141
double G1CollectorPolicy::max_sum (double* data1,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1142
                                   double* data2) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1143
  double ret = data1[0] + data2[0];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1144
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
  1145
  if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1146
    for (uint i = 1; i < ParallelGCThreads; ++i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1147
      double data = data1[i] + data2[i];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1148
      if (data > ret)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1149
        ret = data;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1150
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1151
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1152
  return ret;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1153
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1154
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1155
// Anything below that is considered to be zero
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1156
#define MIN_TIMER_GRANULARITY 0.0000001
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1157
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1158
void G1CollectorPolicy::record_collection_pause_end() {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1159
  double end_time_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1160
  double elapsed_ms = _last_pause_time_ms;
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
  1161
  bool parallel = G1CollectedHeap::use_parallel_gc_threads();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1162
  size_t rs_size =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1163
    _cur_collection_pause_used_regions_at_start - collection_set_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1164
  size_t cur_used_bytes = _g1->used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1165
  assert(cur_used_bytes == _g1->recalculate_used(), "It should!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1166
  bool last_pause_included_initial_mark = false;
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1167
  bool update_stats = !_g1->evacuation_failed();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1168
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1169
#ifndef PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1170
  if (G1YoungSurvRateVerbose) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1171
    gclog_or_tty->print_cr("");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1172
    _short_lived_surv_rate_group->print();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1173
    // do that for any other surv rate groups too
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1174
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1175
#endif // PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1176
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1177
  if (in_young_gc_mode()) {
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1178
    last_pause_included_initial_mark = during_initial_mark_pause();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1179
    if (last_pause_included_initial_mark)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1180
      record_concurrent_mark_init_end_pre(0.0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1181
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1182
    size_t min_used_targ =
5034
a1cec6310394 6928073: G1: use existing command line parameters for marking cycle initiation
tonyp
parents: 5033
diff changeset
  1183
      (_g1->capacity() / 100) * InitiatingHeapOccupancyPercent;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1184
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1185
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1186
    if (!_g1->mark_in_progress() && !_last_full_young_gc) {
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1187
      assert(!last_pause_included_initial_mark, "invariant");
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1188
      if (cur_used_bytes > min_used_targ &&
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1189
          cur_used_bytes > _prev_collection_pause_used_at_end_bytes) {
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1190
        assert(!during_initial_mark_pause(), "we should not see this here");
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1191
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1192
        // Note: this might have already been set, if during the last
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1193
        // pause we decided to start a cycle but at the beginning of
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1194
        // this pause we decided to postpone it. That's OK.
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1195
        set_initiate_conc_mark_if_possible();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1196
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1197
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1198
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1199
    _prev_collection_pause_used_at_end_bytes = cur_used_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1200
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1201
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1202
  _mmu_tracker->add_pause(end_time_sec - elapsed_ms/1000.0,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1203
                          end_time_sec, false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1204
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1205
  guarantee(_cur_collection_pause_used_regions_at_start >=
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1206
            collection_set_size(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1207
            "Negative RS size?");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1208
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1209
  // This assert is exempted when we're doing parallel collection pauses,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1210
  // because the fragmentation caused by the parallel GC allocation buffers
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1211
  // 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
  1212
  // before. Best leave this out until the fragmentation problem is fixed.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1213
  // Pauses in which evacuation failed can also lead to negative
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1214
  // collections, since no space is reclaimed from a region containing an
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1215
  // object whose evacuation failed.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1216
  // 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
  1217
  // 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
  1218
  // (DLD, 10/05.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1219
  assert((true || parallel) // Always using GC LABs now.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1220
         || _g1->evacuation_failed()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1221
         || _cur_collection_pause_used_at_start_bytes >= cur_used_bytes,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1222
         "Negative collection");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1223
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1224
  size_t freed_bytes =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1225
    _cur_collection_pause_used_at_start_bytes - cur_used_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1226
  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
  1227
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1228
  double survival_fraction =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1229
    (double)surviving_bytes/
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1230
    (double)_collection_set_bytes_used_before;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1231
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1232
  _n_pauses++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
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);
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1235
  double mark_stack_scan_time = avg_value(_par_last_mark_stack_scan_times_ms);
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
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1243
  double parallel_known_time = update_rs_time +
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1244
                               ext_root_scan_time +
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1245
                               mark_stack_scan_time +
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1246
                               scan_rs_time +
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1247
                               obj_copy_time +
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1248
                               termination_time;
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1249
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1250
  double parallel_other_time = _cur_collection_par_time_ms - parallel_known_time;
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1251
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1252
  PauseSummary* summary = _summary;
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1253
2121
0b899b36d991 6804746: G1: guarantee(variance() > -1.0,"variance should be >= 0") (due to evacuation failure)
tonyp
parents: 2011
diff changeset
  1254
  if (update_stats) {
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1255
    _recent_rs_scan_times_ms->add(scan_rs_time);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1256
    _recent_pause_times_ms->add(elapsed_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1257
    _recent_rs_sizes->add(rs_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1258
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1259
    MainBodySummary* body_summary = summary->main_body_summary();
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1260
    guarantee(body_summary != NULL, "should not be null!");
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1261
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1262
    if (_satb_drain_time_set)
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1263
      body_summary->record_satb_drain_time_ms(_cur_satb_drain_time_ms);
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1264
    else
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1265
      body_summary->record_satb_drain_time_ms(0.0);
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1266
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1267
    body_summary->record_ext_root_scan_time_ms(ext_root_scan_time);
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1268
    body_summary->record_mark_stack_scan_time_ms(mark_stack_scan_time);
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1269
    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
  1270
    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
  1271
    body_summary->record_obj_copy_time_ms(obj_copy_time);
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1272
    if (parallel) {
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1273
      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
  1274
      body_summary->record_clear_ct_time_ms(_cur_clear_ct_time_ms);
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1275
      body_summary->record_termination_time_ms(termination_time);
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1276
      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
  1277
    }
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1278
    body_summary->record_mark_closure_time_ms(_mark_closure_time_ms);
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1279
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1280
    // We exempt parallel collection from this check because Alloc Buffer
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1281
    // fragmentation can produce negative collections.  Same with evac
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1282
    // failure.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1283
    // 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
  1284
    // 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
  1285
    // (DLD, 10/05.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1286
    assert((true || parallel)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1287
           || _g1->evacuation_failed()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1288
           || surviving_bytes <= _collection_set_bytes_used_before,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1289
           "Or else negative collection!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1290
    _recent_CS_bytes_used_before->add(_collection_set_bytes_used_before);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1291
    _recent_CS_bytes_surviving->add(surviving_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1292
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1293
    // this is where we update the allocation rate of the application
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1294
    double app_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1295
      (_cur_collection_start_sec * 1000.0 - _prev_collection_pause_end_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1296
    if (app_time_ms < MIN_TIMER_GRANULARITY) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1297
      // This usually happens due to the timer not having the required
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1298
      // granularity. Some Linuxes are the usual culprits.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1299
      // We'll just set it to something (arbitrarily) small.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1300
      app_time_ms = 1.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1301
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1302
    size_t regions_allocated =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1303
      (_region_num_young - _prev_region_num_young) +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1304
      (_region_num_tenured - _prev_region_num_tenured);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1305
    double alloc_rate_ms = (double) regions_allocated / app_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1306
    _alloc_rate_ms_seq->add(alloc_rate_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1307
    _prev_region_num_young   = _region_num_young;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1308
    _prev_region_num_tenured = _region_num_tenured;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1309
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1310
    double interval_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1311
      (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
  1312
    update_recent_gc_times(end_time_sec, elapsed_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1313
    _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
  1314
    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
  1315
        (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
  1316
#ifndef PRODUCT
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1317
      // 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
  1318
      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
  1319
      gclog_or_tty->print_cr("-------------------------------------------");
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1320
      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
  1321
      _recent_gc_times_ms->dump();
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1322
      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
  1323
      _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
  1324
      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
  1325
                             _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
  1326
      // 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
  1327
      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
  1328
#endif  // !PRODUCT
f05d2dc1c332 6902701: G1: protect debugging code related to 6898948 with a debug flag
ysr
parents: 4456
diff changeset
  1329
      // 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
  1330
      // 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
  1331
      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
  1332
        _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
  1333
      } else {
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1334
        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
  1335
        _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
  1336
      }
fa02c2ef7a70 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 4098
diff changeset
  1337
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1338
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1339
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1340
  if (G1PolicyVerbose > 1) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1341
    gclog_or_tty->print_cr("   Recording collection pause(%d)", _n_pauses);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1342
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1343
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1344
  if (G1PolicyVerbose > 1) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1345
    gclog_or_tty->print_cr("      ET: %10.6f ms           (avg: %10.6f ms)\n"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1346
                           "       ET-RS:  %10.6f ms      (avg: %10.6f ms)\n"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1347
                           "      |RS|: " SIZE_FORMAT,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1348
                           elapsed_ms, recent_avg_time_for_pauses_ms(),
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1349
                           scan_rs_time, recent_avg_time_for_rs_scan_ms(),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1350
                           rs_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1351
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1352
    gclog_or_tty->print_cr("       Used at start: " SIZE_FORMAT"K"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1353
                           "       At end " SIZE_FORMAT "K\n"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1354
                           "       garbage      : " SIZE_FORMAT "K"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1355
                           "       of     " SIZE_FORMAT "K\n"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1356
                           "       survival     : %6.2f%%  (%6.2f%% avg)",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1357
                           _cur_collection_pause_used_at_start_bytes/K,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1358
                           _g1->used()/K, freed_bytes/K,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1359
                           _collection_set_bytes_used_before/K,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1360
                           survival_fraction*100.0,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1361
                           recent_avg_survival_fraction()*100.0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1362
    gclog_or_tty->print_cr("       Recent %% gc pause time: %6.2f",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1363
                           recent_avg_pause_time_ratio() * 100.0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1364
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1365
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1366
  double other_time_ms = elapsed_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1367
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1368
  if (_satb_drain_time_set) {
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1369
    other_time_ms -= _cur_satb_drain_time_ms;
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1370
  }
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1371
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1372
  if (parallel) {
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1373
    other_time_ms -= _cur_collection_par_time_ms + _cur_clear_ct_time_ms;
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1374
  } else {
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1375
    other_time_ms -=
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1376
      update_rs_time +
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1377
      ext_root_scan_time + mark_stack_scan_time +
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1378
      scan_rs_time + obj_copy_time;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1379
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1380
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1381
  if (PrintGCDetails) {
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1382
    gclog_or_tty->print_cr("%s, %1.8lf secs]",
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1383
                           (last_pause_included_initial_mark) ? " (initial-mark)" : "",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1384
                           elapsed_ms / 1000.0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1385
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1386
    if (_satb_drain_time_set) {
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1387
      print_stats(1, "SATB Drain Time", _cur_satb_drain_time_ms);
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1388
    }
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1389
    if (_last_satb_drain_processed_buffers >= 0) {
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1390
      print_stats(2, "Processed Buffers", _last_satb_drain_processed_buffers);
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1391
    }
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1392
    if (parallel) {
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1393
      print_stats(1, "Parallel Time", _cur_collection_par_time_ms);
8925
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1394
      print_par_stats(2, "GC Worker Start Time", _par_last_gc_worker_start_times_ms);
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1395
      print_par_stats(2, "Update RS", _par_last_update_rs_times_ms);
8925
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1396
      print_par_sizes(3, "Processed Buffers", _par_last_update_rs_processed_buffers);
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1397
      print_par_stats(2, "Ext Root Scanning", _par_last_ext_root_scan_times_ms);
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1398
      print_par_stats(2, "Mark Stack Scanning", _par_last_mark_stack_scan_times_ms);
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1399
      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
  1400
      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
  1401
      print_par_stats(2, "Termination", _par_last_termination_times_ms);
8925
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1402
      print_par_sizes(3, "Termination Attempts", _par_last_termination_attempts);
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1403
      print_par_stats(2, "GC Worker End Time", _par_last_gc_worker_end_times_ms);
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1404
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1405
      for (int i = 0; i < _parallel_gc_threads; i++) {
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1406
        _par_last_gc_worker_times_ms[i] = _par_last_gc_worker_end_times_ms[i] - _par_last_gc_worker_start_times_ms[i];
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1407
      }
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1408
      print_par_stats(2, "GC Worker Times", _par_last_gc_worker_times_ms);
5fdd1d28e7ef 6948149: G1: Imbalance in termination times
brutisso
parents: 8682
diff changeset
  1409
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1410
      print_stats(2, "Parallel Other", parallel_other_time);
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1411
      print_stats(1, "Clear CT", _cur_clear_ct_time_ms);
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1412
    } else {
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1413
      print_stats(1, "Update RS", update_rs_time);
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1414
      print_stats(2, "Processed Buffers",
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1415
                  (int)update_rs_processed_buffers);
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1416
      print_stats(1, "Ext Root Scanning", ext_root_scan_time);
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1417
      print_stats(1, "Mark Stack Scanning", mark_stack_scan_time);
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1418
      print_stats(1, "Scan RS", scan_rs_time);
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  1419
      print_stats(1, "Object Copying", obj_copy_time);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1420
    }
3590
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
  1421
#ifndef PRODUCT
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
  1422
    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
  1423
    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
  1424
    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
  1425
    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
  1426
    if (_num_cc_clears > 0) {
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
  1427
      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
  1428
    }
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
  1429
#endif
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1430
    print_stats(1, "Other", other_time_ms);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1431
    print_stats(2, "Choose CSet", _recorded_young_cset_choice_time_ms);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1432
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1433
    for (int i = 0; i < _aux_num; ++i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1434
      if (_cur_aux_times_set[i]) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1435
        char buffer[96];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1436
        sprintf(buffer, "Aux%d", i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1437
        print_stats(1, buffer, _cur_aux_times_ms[i]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1438
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1439
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1440
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1441
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1442
  _all_pause_times_ms->add(elapsed_ms);
2260
219013f6a311 6820321: G1: Error: guarantee(check_nums(total, n, parts), "all seq lengths should match")
tonyp
parents: 2252
diff changeset
  1443
  if (update_stats) {
219013f6a311 6820321: G1: Error: guarantee(check_nums(total, n, parts), "all seq lengths should match")
tonyp
parents: 2252
diff changeset
  1444
    summary->record_total_time_ms(elapsed_ms);
219013f6a311 6820321: G1: Error: guarantee(check_nums(total, n, parts), "all seq lengths should match")
tonyp
parents: 2252
diff changeset
  1445
    summary->record_other_time_ms(other_time_ms);
219013f6a311 6820321: G1: Error: guarantee(check_nums(total, n, parts), "all seq lengths should match")
tonyp
parents: 2252
diff changeset
  1446
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1447
  for (int i = 0; i < _aux_num; ++i)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1448
    if (_cur_aux_times_set[i])
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1449
      _all_aux_times_ms[i].add(_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
  // Reset marks-between-pauses counter.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1452
  _n_marks_since_last_pause = 0;
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1471
  if (in_young_gc_mode()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1472
    if (_last_full_young_gc) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1473
      set_full_young_gcs(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1474
      _last_full_young_gc = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1475
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1476
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1477
    if ( !_last_young_gc_full ) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1478
      if ( _should_revert_to_full_young_gcs ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1479
           _known_garbage_ratio < 0.05 ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1480
           (adaptive_young_list_length() &&
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1481
           (get_gc_eff_factor() * cur_efficiency < predict_young_gc_eff())) ) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1482
        set_full_young_gcs(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1483
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1484
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1485
    _should_revert_to_full_young_gcs = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1486
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1487
    if (_last_young_gc_full && !_during_marking)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1488
      _young_gc_eff_seq->add(cur_efficiency);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1489
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1490
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1491
  _short_lived_surv_rate_group->start_adding_regions();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1492
  // do that for any other surv rate groupsx
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1493
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1494
  // <NEW PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1495
2344
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2260
diff changeset
  1496
  if (update_stats) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1497
    double pause_time_ms = elapsed_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1498
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1499
    size_t diff = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1500
    if (_max_pending_cards >= _pending_cards)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1501
      diff = _max_pending_cards - _pending_cards;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1502
    _pending_card_diff_seq->add((double) diff);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1503
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1504
    double cost_per_card_ms = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1505
    if (_pending_cards > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1506
      cost_per_card_ms = update_rs_time / (double) _pending_cards;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1507
      _cost_per_card_ms_seq->add(cost_per_card_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1508
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1509
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1510
    size_t cards_scanned = _g1->cards_scanned();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1511
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1512
    double cost_per_entry_ms = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1513
    if (cards_scanned > 10) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1514
      cost_per_entry_ms = scan_rs_time / (double) cards_scanned;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1515
      if (_last_young_gc_full)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1516
        _cost_per_entry_ms_seq->add(cost_per_entry_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1517
      else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1518
        _partially_young_cost_per_entry_ms_seq->add(cost_per_entry_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1519
    }
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
    if (_max_rs_lengths > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1522
      double cards_per_entry_ratio =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1523
        (double) cards_scanned / (double) _max_rs_lengths;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1524
      if (_last_young_gc_full)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1525
        _fully_young_cards_per_entry_ratio_seq->add(cards_per_entry_ratio);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1526
      else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1527
        _partially_young_cards_per_entry_ratio_seq->add(cards_per_entry_ratio);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1528
    }
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
    size_t rs_length_diff = _max_rs_lengths - _recorded_rs_lengths;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1531
    if (rs_length_diff >= 0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1532
      _rs_length_diff_seq->add((double) rs_length_diff);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1533
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1534
    size_t copied_bytes = surviving_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1535
    double cost_per_byte_ms = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1536
    if (copied_bytes > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1537
      cost_per_byte_ms = obj_copy_time / (double) copied_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1538
      if (_in_marking_window)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1539
        _cost_per_byte_ms_during_cm_seq->add(cost_per_byte_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1540
      else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1541
        _cost_per_byte_ms_seq->add(cost_per_byte_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1542
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1543
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1544
    double all_other_time_ms = pause_time_ms -
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1545
      (update_rs_time + scan_rs_time + obj_copy_time +
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1546
       _mark_closure_time_ms + termination_time);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1547
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1548
    double young_other_time_ms = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1549
    if (_recorded_young_regions > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1550
      young_other_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1551
        _recorded_young_cset_choice_time_ms +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1552
        _recorded_young_free_cset_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1553
      _young_other_cost_per_region_ms_seq->add(young_other_time_ms /
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1554
                                             (double) _recorded_young_regions);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1555
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1556
    double non_young_other_time_ms = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1557
    if (_recorded_non_young_regions > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1558
      non_young_other_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1559
        _recorded_non_young_cset_choice_time_ms +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1560
        _recorded_non_young_free_cset_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1561
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1562
      _non_young_other_cost_per_region_ms_seq->add(non_young_other_time_ms /
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1563
                                         (double) _recorded_non_young_regions);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1564
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1565
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1566
    double constant_other_time_ms = all_other_time_ms -
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1567
      (young_other_time_ms + non_young_other_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1568
    _constant_other_time_ms_seq->add(constant_other_time_ms);
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
    double survival_ratio = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1571
    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
  1572
      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
  1573
                                   (double) _bytes_in_collection_set_before_gc;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1574
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1575
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1576
    _pending_cards_seq->add((double) _pending_cards);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1577
    _scanned_cards_seq->add((double) cards_scanned);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1578
    _rs_lengths_seq->add((double) _max_rs_lengths);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1579
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1580
    double expensive_region_limit_ms =
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
  1581
      (double) MaxGCPauseMillis - predict_constant_other_time_ms();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1582
    if (expensive_region_limit_ms < 0.0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1583
      // this means that the other time was predicted to be longer than
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1584
      // than the max pause time
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
  1585
      expensive_region_limit_ms = (double) MaxGCPauseMillis;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1586
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1587
    _expensive_region_limit_ms = expensive_region_limit_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1588
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1589
    if (PREDICTIONS_VERBOSE) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1590
      gclog_or_tty->print_cr("");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1591
      gclog_or_tty->print_cr("PREDICTIONS %1.4lf %d "
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1592
                    "REGIONS %d %d %d "
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1593
                    "PENDING_CARDS %d %d "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1594
                    "CARDS_SCANNED %d %d "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1595
                    "RS_LENGTHS %d %d "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1596
                    "RS_UPDATE %1.6lf %1.6lf RS_SCAN %1.6lf %1.6lf "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1597
                    "SURVIVAL_RATIO %1.6lf %1.6lf "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1598
                    "OBJECT_COPY %1.6lf %1.6lf OTHER_CONSTANT %1.6lf %1.6lf "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1599
                    "OTHER_YOUNG %1.6lf %1.6lf "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1600
                    "OTHER_NON_YOUNG %1.6lf %1.6lf "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1601
                    "VTIME_DIFF %1.6lf TERMINATION %1.6lf "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1602
                    "ELAPSED %1.6lf %1.6lf ",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1603
                    _cur_collection_start_sec,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1604
                    (!_last_young_gc_full) ? 2 :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1605
                    (last_pause_included_initial_mark) ? 1 : 0,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1606
                    _recorded_region_num,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1607
                    _recorded_young_regions,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1608
                    _recorded_non_young_regions,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1609
                    _predicted_pending_cards, _pending_cards,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1610
                    _predicted_cards_scanned, cards_scanned,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1611
                    _predicted_rs_lengths, _max_rs_lengths,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1612
                    _predicted_rs_update_time_ms, update_rs_time,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1613
                    _predicted_rs_scan_time_ms, scan_rs_time,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1614
                    _predicted_survival_ratio, survival_ratio,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1615
                    _predicted_object_copy_time_ms, obj_copy_time,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1616
                    _predicted_constant_other_time_ms, constant_other_time_ms,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1617
                    _predicted_young_other_time_ms, young_other_time_ms,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1618
                    _predicted_non_young_other_time_ms,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1619
                    non_young_other_time_ms,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1620
                    _vtime_diff_ms, termination_time,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1621
                    _predicted_pause_time_ms, elapsed_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1622
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1623
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1624
    if (G1PolicyVerbose > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1625
      gclog_or_tty->print_cr("Pause Time, predicted: %1.4lfms (predicted %s), actual: %1.4lfms",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1626
                    _predicted_pause_time_ms,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1627
                    (_within_target) ? "within" : "outside",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1628
                    elapsed_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1629
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1630
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1631
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1632
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1633
  _in_marking_window = new_in_marking_window;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1634
  _in_marking_window_im = new_in_marking_window_im;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1635
  _free_regions_at_end_of_collection = _g1->free_regions();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1636
  calculate_young_list_min_length();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1637
  calculate_young_list_target_length();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1638
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1639
  // 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
  1640
  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
  1641
  adjust_concurrent_refinement(update_rs_time, update_rs_processed_buffers, update_rs_time_goal_ms);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1642
  // </NEW PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1643
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1644
9987
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1645
#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
  1646
#define EXT_SIZE_PARAMS(bytes)                                  \
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1647
  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
  1648
  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
  1649
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1650
void G1CollectorPolicy::print_heap_transition() {
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1651
  if (PrintGCDetails) {
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1652
    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
  1653
    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
  1654
    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
  1655
    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
  1656
    size_t used = _g1->used();
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1657
    size_t capacity = _g1->capacity();
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1658
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1659
    gclog_or_tty->print_cr(
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1660
         "   [Eden: "EXT_SIZE_FORMAT"->"EXT_SIZE_FORMAT" "
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1661
             "Survivors: "EXT_SIZE_FORMAT"->"EXT_SIZE_FORMAT" "
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1662
             "Heap: "EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")->"
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1663
                     EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")]",
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1664
             EXT_SIZE_PARAMS(_eden_bytes_before_gc),
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1665
               EXT_SIZE_PARAMS(eden_bytes),
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1666
             EXT_SIZE_PARAMS(_survivor_bytes_before_gc),
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1667
               EXT_SIZE_PARAMS(survivor_bytes),
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1668
             EXT_SIZE_PARAMS(used_before_gc),
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1669
             EXT_SIZE_PARAMS(_capacity_before_gc),
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1670
               EXT_SIZE_PARAMS(used),
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1671
               EXT_SIZE_PARAMS(capacity));
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1672
  } else if (PrintGC) {
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1673
    _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
  1674
                               _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
  1675
                               _g1->used(), _g1->capacity());
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1676
  }
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1677
}
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 8925
diff changeset
  1678
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1679
// <NEW PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1680
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1681
void G1CollectorPolicy::adjust_concurrent_refinement(double update_rs_time,
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1682
                                                     double update_rs_processed_buffers,
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1683
                                                     double goal_ms) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1684
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1685
  ConcurrentG1Refine *cg1r = G1CollectedHeap::heap()->concurrent_g1_refine();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1686
5033
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
  1687
  if (G1UseAdaptiveConcRefinement) {
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1688
    const int k_gy = 3, k_gr = 6;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1689
    const double inc_k = 1.1, dec_k = 0.9;
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1690
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1691
    int g = cg1r->green_zone();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1692
    if (update_rs_time > goal_ms) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1693
      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
  1694
    } else {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1695
      if (update_rs_time < goal_ms && update_rs_processed_buffers > g) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1696
        g = (int)MAX2(g * inc_k, g + 1.0);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1697
      }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1698
    }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1699
    // Change the refinement threads params
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1700
    cg1r->set_green_zone(g);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1701
    cg1r->set_yellow_zone(g * k_gy);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1702
    cg1r->set_red_zone(g * k_gr);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1703
    cg1r->reinitialize_threads();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1704
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1705
    int processing_threshold_delta = MAX2((int)(cg1r->green_zone() * sigma()), 1);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1706
    int processing_threshold = MIN2(cg1r->green_zone() + processing_threshold_delta,
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1707
                                    cg1r->yellow_zone());
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1708
    // Change the barrier params
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1709
    dcqs.set_process_completed_threshold(processing_threshold);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1710
    dcqs.set_max_completed_queue(cg1r->red_zone());
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1711
  }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1712
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1713
  int curr_queue_size = dcqs.completed_buffers_num();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1714
  if (curr_queue_size >= cg1r->yellow_zone()) {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1715
    dcqs.set_completed_queue_padding(curr_queue_size);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1716
  } else {
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1717
    dcqs.set_completed_queue_padding(0);
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1718
  }
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1719
  dcqs.notify_if_necessary();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1720
}
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4458
diff changeset
  1721
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1722
double
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1723
G1CollectorPolicy::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1724
predict_young_collection_elapsed_time_ms(size_t adjustment) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1725
  guarantee( adjustment == 0 || adjustment == 1, "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1726
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1727
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1728
  size_t young_num = g1h->young_list()->length();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1729
  if (young_num == 0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1730
    return 0.0;
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
  young_num += adjustment;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1733
  size_t pending_cards = predict_pending_cards();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1734
  size_t rs_lengths = g1h->young_list()->sampled_rs_lengths() +
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1735
                      predict_rs_length_diff();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1736
  size_t card_num;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1737
  if (full_young_gcs())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1738
    card_num = predict_young_card_num(rs_lengths);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1739
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1740
    card_num = predict_non_young_card_num(rs_lengths);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1741
  size_t young_byte_size = young_num * HeapRegion::GrainBytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1742
  double accum_yg_surv_rate =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1743
    _short_lived_surv_rate_group->accum_surv_rate(adjustment);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1744
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1745
  size_t bytes_to_copy =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1746
    (size_t) (accum_yg_surv_rate * (double) HeapRegion::GrainBytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1747
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1748
  return
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1749
    predict_rs_update_time_ms(pending_cards) +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1750
    predict_rs_scan_time_ms(card_num) +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1751
    predict_object_copy_time_ms(bytes_to_copy) +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1752
    predict_young_other_time_ms(young_num) +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1753
    predict_constant_other_time_ms();
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1756
double
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1757
G1CollectorPolicy::predict_base_elapsed_time_ms(size_t pending_cards) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1758
  size_t rs_length = predict_rs_length_diff();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1759
  size_t card_num;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1760
  if (full_young_gcs())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1761
    card_num = predict_young_card_num(rs_length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1762
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1763
    card_num = predict_non_young_card_num(rs_length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1764
  return predict_base_elapsed_time_ms(pending_cards, card_num);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1765
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1766
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1767
double
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1768
G1CollectorPolicy::predict_base_elapsed_time_ms(size_t pending_cards,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1769
                                                size_t scanned_cards) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1770
  return
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1771
    predict_rs_update_time_ms(pending_cards) +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1772
    predict_rs_scan_time_ms(scanned_cards) +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1773
    predict_constant_other_time_ms();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1774
}
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
double
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1777
G1CollectorPolicy::predict_region_elapsed_time_ms(HeapRegion* hr,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1778
                                                  bool young) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1779
  size_t rs_length = hr->rem_set()->occupied();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1780
  size_t card_num;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1781
  if (full_young_gcs())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1782
    card_num = predict_young_card_num(rs_length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1783
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1784
    card_num = predict_non_young_card_num(rs_length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1785
  size_t bytes_to_copy = predict_bytes_to_copy(hr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1786
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1787
  double region_elapsed_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1788
    predict_rs_scan_time_ms(card_num) +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1789
    predict_object_copy_time_ms(bytes_to_copy);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1790
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1791
  if (young)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1792
    region_elapsed_time_ms += predict_young_other_time_ms(1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1793
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1794
    region_elapsed_time_ms += predict_non_young_other_time_ms(1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1795
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1796
  return region_elapsed_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1797
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1798
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1799
size_t
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1800
G1CollectorPolicy::predict_bytes_to_copy(HeapRegion* hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1801
  size_t bytes_to_copy;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1802
  if (hr->is_marked())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1803
    bytes_to_copy = hr->max_live_bytes();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1804
  else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1805
    guarantee( hr->is_young() && hr->age_in_surv_rate_group() != -1,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1806
               "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1807
    int age = hr->age_in_surv_rate_group();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  1808
    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
  1809
    bytes_to_copy = (size_t) ((double) hr->used() * yg_surv_rate);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1810
  }
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
  return bytes_to_copy;
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1815
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1816
G1CollectorPolicy::start_recording_regions() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1817
  _recorded_rs_lengths            = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1818
  _recorded_young_regions         = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1819
  _recorded_non_young_regions     = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1820
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1821
#if PREDICTIONS_VERBOSE
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1822
  _recorded_marked_bytes          = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1823
  _recorded_young_bytes           = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1824
  _predicted_bytes_to_copy        = 0;
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1825
  _predicted_rs_lengths           = 0;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1826
  _predicted_cards_scanned        = 0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1827
#endif // PREDICTIONS_VERBOSE
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1830
void
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1831
G1CollectorPolicy::record_cset_region_info(HeapRegion* hr, bool young) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1832
#if PREDICTIONS_VERBOSE
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1833
  if (!young) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1834
    _recorded_marked_bytes += hr->max_live_bytes();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1835
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1836
  _predicted_bytes_to_copy += predict_bytes_to_copy(hr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1837
#endif // PREDICTIONS_VERBOSE
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1838
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1839
  size_t rs_length = hr->rem_set()->occupied();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1840
  _recorded_rs_lengths += rs_length;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1841
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1842
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1843
void
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1844
G1CollectorPolicy::record_non_young_cset_region(HeapRegion* hr) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1845
  assert(!hr->is_young(), "should not call this");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1846
  ++_recorded_non_young_regions;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1847
  record_cset_region_info(hr, false);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1848
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1849
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1850
void
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1851
G1CollectorPolicy::set_recorded_young_regions(size_t n_regions) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1852
  _recorded_young_regions = n_regions;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1853
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1854
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1855
void G1CollectorPolicy::set_recorded_young_bytes(size_t bytes) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1856
#if PREDICTIONS_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1857
  _recorded_young_bytes = bytes;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1858
#endif // PREDICTIONS_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1859
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1860
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1861
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
  1862
  _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
  1863
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1864
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1865
void G1CollectorPolicy::set_predicted_bytes_to_copy(size_t bytes) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1866
  _predicted_bytes_to_copy = bytes;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1867
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1868
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1869
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1870
G1CollectorPolicy::end_recording_regions() {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1871
  // The _predicted_pause_time_ms field is referenced in code
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1872
  // not under PREDICTIONS_VERBOSE. Let's initialize it.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1873
  _predicted_pause_time_ms = -1.0;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1874
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1875
#if PREDICTIONS_VERBOSE
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1876
  _predicted_pending_cards = predict_pending_cards();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1877
  _predicted_rs_lengths = _recorded_rs_lengths + predict_rs_length_diff();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1878
  if (full_young_gcs())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1879
    _predicted_cards_scanned += predict_young_card_num(_predicted_rs_lengths);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1880
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1881
    _predicted_cards_scanned +=
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1882
      predict_non_young_card_num(_predicted_rs_lengths);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1883
  _recorded_region_num = _recorded_young_regions + _recorded_non_young_regions;
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
  _predicted_rs_update_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1886
    predict_rs_update_time_ms(_g1->pending_card_num());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1887
  _predicted_rs_scan_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1888
    predict_rs_scan_time_ms(_predicted_cards_scanned);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1889
  _predicted_object_copy_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1890
    predict_object_copy_time_ms(_predicted_bytes_to_copy);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1891
  _predicted_constant_other_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1892
    predict_constant_other_time_ms();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1893
  _predicted_young_other_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1894
    predict_young_other_time_ms(_recorded_young_regions);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1895
  _predicted_non_young_other_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1896
    predict_non_young_other_time_ms(_recorded_non_young_regions);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1897
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1898
  _predicted_pause_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1899
    _predicted_rs_update_time_ms +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1900
    _predicted_rs_scan_time_ms +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1901
    _predicted_object_copy_time_ms +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1902
    _predicted_constant_other_time_ms +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1903
    _predicted_young_other_time_ms +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1904
    _predicted_non_young_other_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1905
#endif // PREDICTIONS_VERBOSE
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1906
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1907
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1908
void G1CollectorPolicy::check_if_region_is_too_expensive(double
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1909
                                                           predicted_time_ms) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1910
  // I don't think we need to do this when in young GC mode since
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1911
  // marking will be initiated next time we hit the soft limit anyway...
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1912
  if (predicted_time_ms > _expensive_region_limit_ms) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1913
    if (!in_young_gc_mode()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1914
        set_full_young_gcs(true);
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1915
        // We might want to do something different here. However,
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1916
        // right now we don't support the non-generational G1 mode
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1917
        // (and in fact we are planning to remove the associated code,
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1918
        // see CR 6814390). So, let's leave it as is and this will be
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1919
        // removed some time in the future
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1920
        ShouldNotReachHere();
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  1921
        set_during_initial_mark_pause();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1922
    } else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1923
      // no point in doing another partial one
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1924
      _should_revert_to_full_young_gcs = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1925
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1926
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1927
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1928
// </NEW PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1929
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
void G1CollectorPolicy::update_recent_gc_times(double end_time_sec,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1932
                                               double elapsed_ms) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1933
  _recent_gc_times_ms->add(elapsed_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1934
  _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
  1935
  _prev_collection_pause_end_ms = end_time_sec * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1936
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1937
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1938
double G1CollectorPolicy::recent_avg_time_for_pauses_ms() {
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1939
  if (_recent_pause_times_ms->num() == 0) {
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1940
    return (double) MaxGCPauseMillis;
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1941
  }
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1942
  return _recent_pause_times_ms->avg();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1943
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1944
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1945
double G1CollectorPolicy::recent_avg_time_for_rs_scan_ms() {
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1946
  if (_recent_rs_scan_times_ms->num() == 0) {
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
  1947
    return (double)MaxGCPauseMillis/3.0;
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1948
  }
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1949
  return _recent_rs_scan_times_ms->avg();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1950
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1951
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1952
int G1CollectorPolicy::number_of_recent_gcs() {
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1953
  assert(_recent_rs_scan_times_ms->num() ==
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1954
         _recent_pause_times_ms->num(), "Sequence out of sync");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1955
  assert(_recent_pause_times_ms->num() ==
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1956
         _recent_CS_bytes_used_before->num(), "Sequence out of sync");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1957
  assert(_recent_CS_bytes_used_before->num() ==
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1958
         _recent_CS_bytes_surviving->num(), "Sequence out of sync");
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  1959
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1960
  return _recent_pause_times_ms->num();
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1963
double G1CollectorPolicy::recent_avg_survival_fraction() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1964
  return recent_avg_survival_fraction_work(_recent_CS_bytes_surviving,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1965
                                           _recent_CS_bytes_used_before);
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
double G1CollectorPolicy::last_survival_fraction() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1969
  return last_survival_fraction_work(_recent_CS_bytes_surviving,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1970
                                     _recent_CS_bytes_used_before);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1971
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1972
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1973
double
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1974
G1CollectorPolicy::recent_avg_survival_fraction_work(TruncatedSeq* surviving,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1975
                                                     TruncatedSeq* before) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1976
  assert(surviving->num() == before->num(), "Sequence out of sync");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1977
  if (before->sum() > 0.0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1978
      double recent_survival_rate = surviving->sum() / before->sum();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1979
      // We exempt parallel collection from this check because Alloc Buffer
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1980
      // fragmentation can produce negative collections.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1981
      // 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
  1982
      // 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
  1983
      // (DLD, 10/05.)
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
  1984
      assert((true || G1CollectedHeap::use_parallel_gc_threads()) ||
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1985
             _g1->evacuation_failed() ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1986
             recent_survival_rate <= 1.0, "Or bad frac");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1987
      return recent_survival_rate;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1988
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1989
    return 1.0; // Be conservative.
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1993
double
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1994
G1CollectorPolicy::last_survival_fraction_work(TruncatedSeq* surviving,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1995
                                               TruncatedSeq* before) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1996
  assert(surviving->num() == before->num(), "Sequence out of sync");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1997
  if (surviving->num() > 0 && before->last() > 0.0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1998
    double last_survival_rate = surviving->last() / before->last();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1999
    // We exempt parallel collection from this check because Alloc Buffer
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2000
    // fragmentation can produce negative collections.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2001
    // 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
  2002
    // 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
  2003
    // (DLD, 10/05.)
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
  2004
    assert((true || G1CollectedHeap::use_parallel_gc_threads()) ||
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2005
           last_survival_rate <= 1.0, "Or bad frac");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2006
    return last_survival_rate;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2007
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2008
    return 1.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2009
  }
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
static const int survival_min_obs = 5;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2013
static double survival_min_obs_limits[] = { 0.9, 0.7, 0.5, 0.3, 0.1 };
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2014
static const double min_survival_rate = 0.1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2015
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2016
double
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2017
G1CollectorPolicy::conservative_avg_survival_fraction_work(double avg,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2018
                                                           double latest) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2019
  double res = avg;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2020
  if (number_of_recent_gcs() < survival_min_obs) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2021
    res = MAX2(res, survival_min_obs_limits[number_of_recent_gcs()]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2022
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2023
  res = MAX2(res, latest);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2024
  res = MAX2(res, min_survival_rate);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2025
  // In the parallel case, LAB fragmentation can produce "negative
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2026
  // collections"; so can evac failure.  Cap at 1.0
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2027
  res = MIN2(res, 1.0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2028
  return res;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2029
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2030
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2031
size_t G1CollectorPolicy::expansion_amount() {
5240
3892e01609c6 6937160: G1: should observe GCTimeRatio
tonyp
parents: 5036
diff changeset
  2032
  if ((recent_avg_pause_time_ratio() * 100.0) > _gc_overhead_perc) {
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
  2033
    // We will double the existing space, or take
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
  2034
    // G1ExpandByPercentOfAvailable % of the available expansion
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
  2035
    // space, whichever is smaller, bounded below by a minimum
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
  2036
    // expansion (unless that's all that's left.)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2037
    const size_t min_expand_bytes = 1*M;
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 7923
diff changeset
  2038
    size_t reserved_bytes = _g1->max_capacity();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2039
    size_t committed_bytes = _g1->capacity();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2040
    size_t uncommitted_bytes = reserved_bytes - committed_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2041
    size_t expand_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2042
    size_t expand_bytes_via_pct =
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2344
diff changeset
  2043
      uncommitted_bytes * G1ExpandByPercentOfAvailable / 100;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2044
    expand_bytes = MIN2(expand_bytes_via_pct, committed_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2045
    expand_bytes = MAX2(expand_bytes, min_expand_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2046
    expand_bytes = MIN2(expand_bytes, uncommitted_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2047
    if (G1PolicyVerbose > 1) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2048
      gclog_or_tty->print("Decided to expand: ratio = %5.2f, "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2049
                 "committed = %d%s, uncommited = %d%s, via pct = %d%s.\n"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2050
                 "                   Answer = %d.\n",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2051
                 recent_avg_pause_time_ratio(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2052
                 byte_size_in_proper_unit(committed_bytes),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2053
                 proper_unit_for_byte_size(committed_bytes),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2054
                 byte_size_in_proper_unit(uncommitted_bytes),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2055
                 proper_unit_for_byte_size(uncommitted_bytes),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2056
                 byte_size_in_proper_unit(expand_bytes_via_pct),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2057
                 proper_unit_for_byte_size(expand_bytes_via_pct),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2058
                 byte_size_in_proper_unit(expand_bytes),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2059
                 proper_unit_for_byte_size(expand_bytes));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2060
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2061
    return expand_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2062
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2063
    return 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2064
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2065
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2066
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2067
void G1CollectorPolicy::note_start_of_mark_thread() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2068
  _mark_thread_startup_sec = os::elapsedTime();
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2071
class CountCSClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2072
  G1CollectorPolicy* _g1_policy;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2073
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2074
  CountCSClosure(G1CollectorPolicy* g1_policy) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2075
    _g1_policy(g1_policy) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2076
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2077
    _g1_policy->_bytes_in_collection_set_before_gc += r->used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2078
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2079
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2080
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2081
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2082
void G1CollectorPolicy::count_CS_bytes_used() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2083
  CountCSClosure cs_closure(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2084
  _g1->collection_set_iterate(&cs_closure);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2085
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2086
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2087
void G1CollectorPolicy::print_summary (int level,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2088
                                       const char* str,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2089
                                       NumberSeq* seq) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2090
  double sum = seq->sum();
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  2091
  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
  2092
                str, sum / 1000.0, seq->avg());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2093
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2094
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2095
void G1CollectorPolicy::print_summary_sd (int level,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2096
                                          const char* str,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2097
                                          NumberSeq* seq) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2098
  print_summary(level, str, seq);
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  2099
  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
  2100
                seq->num(), seq->sd(), seq->maximum());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2101
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2102
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2103
void G1CollectorPolicy::check_other_times(int level,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2104
                                        NumberSeq* other_times_ms,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2105
                                        NumberSeq* calc_other_times_ms) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2106
  bool should_print = false;
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  2107
  LineBuffer buf(level + 2);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2108
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2109
  double max_sum = MAX2(fabs(other_times_ms->sum()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2110
                        fabs(calc_other_times_ms->sum()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2111
  double min_sum = MIN2(fabs(other_times_ms->sum()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2112
                        fabs(calc_other_times_ms->sum()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2113
  double sum_ratio = max_sum / min_sum;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2114
  if (sum_ratio > 1.1) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2115
    should_print = true;
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  2116
    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
  2117
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2118
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2119
  double max_avg = MAX2(fabs(other_times_ms->avg()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2120
                        fabs(calc_other_times_ms->avg()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2121
  double min_avg = MIN2(fabs(other_times_ms->avg()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2122
                        fabs(calc_other_times_ms->avg()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2123
  double avg_ratio = max_avg / min_avg;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2124
  if (avg_ratio > 1.1) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2125
    should_print = true;
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  2126
    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
  2127
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2128
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2129
  if (other_times_ms->sum() < -0.01) {
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  2130
    buf.append_and_print_cr("## RECORDED OTHER SUM IS NEGATIVE ###");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2131
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2132
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2133
  if (other_times_ms->avg() < -0.01) {
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  2134
    buf.append_and_print_cr("## RECORDED OTHER AVG IS NEGATIVE ###");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2135
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2136
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2137
  if (calc_other_times_ms->sum() < -0.01) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2138
    should_print = true;
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  2139
    buf.append_and_print_cr("## CALCULATED OTHER SUM IS NEGATIVE ###");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2140
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2141
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2142
  if (calc_other_times_ms->avg() < -0.01) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2143
    should_print = true;
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  2144
    buf.append_and_print_cr("## CALCULATED OTHER AVG IS NEGATIVE ###");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2145
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2146
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2147
  if (should_print)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2148
    print_summary(level, "Other(Calc)", calc_other_times_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2149
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2150
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2151
void G1CollectorPolicy::print_summary(PauseSummary* summary) const {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
  2152
  bool parallel = G1CollectedHeap::use_parallel_gc_threads();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2153
  MainBodySummary*    body_summary = summary->main_body_summary();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2154
  if (summary->get_total_seq()->num() > 0) {
2344
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2260
diff changeset
  2155
    print_summary_sd(0, "Evacuation Pauses", summary->get_total_seq());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2156
    if (body_summary != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2157
      print_summary(1, "SATB Drain", body_summary->get_satb_drain_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2158
      if (parallel) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2159
        print_summary(1, "Parallel Time", body_summary->get_parallel_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2160
        print_summary(2, "Update RS", body_summary->get_update_rs_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2161
        print_summary(2, "Ext Root Scanning",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2162
                      body_summary->get_ext_root_scan_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2163
        print_summary(2, "Mark Stack Scanning",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2164
                      body_summary->get_mark_stack_scan_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2165
        print_summary(2, "Scan RS", body_summary->get_scan_rs_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2166
        print_summary(2, "Object Copy", body_summary->get_obj_copy_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2167
        print_summary(2, "Termination", body_summary->get_termination_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2168
        print_summary(2, "Other", body_summary->get_parallel_other_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2169
        {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2170
          NumberSeq* other_parts[] = {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2171
            body_summary->get_update_rs_seq(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2172
            body_summary->get_ext_root_scan_seq(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2173
            body_summary->get_mark_stack_scan_seq(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2174
            body_summary->get_scan_rs_seq(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2175
            body_summary->get_obj_copy_seq(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2176
            body_summary->get_termination_seq()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2177
          };
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2178
          NumberSeq calc_other_times_ms(body_summary->get_parallel_seq(),
6449
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2179
                                        6, other_parts);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2180
          check_other_times(2, body_summary->get_parallel_other_seq(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2181
                            &calc_other_times_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2182
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2183
        print_summary(1, "Mark Closure", body_summary->get_mark_closure_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2184
        print_summary(1, "Clear CT", body_summary->get_clear_ct_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2185
      } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2186
        print_summary(1, "Update RS", body_summary->get_update_rs_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2187
        print_summary(1, "Ext Root Scanning",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2188
                      body_summary->get_ext_root_scan_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2189
        print_summary(1, "Mark Stack Scanning",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2190
                      body_summary->get_mark_stack_scan_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2191
        print_summary(1, "Scan RS", body_summary->get_scan_rs_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2192
        print_summary(1, "Object Copy", body_summary->get_obj_copy_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2193
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2194
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2195
    print_summary(1, "Other", summary->get_other_seq());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2196
    {
6449
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2197
      if (body_summary != NULL) {
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2198
        NumberSeq calc_other_times_ms;
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2199
        if (parallel) {
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2200
          // parallel
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2201
          NumberSeq* other_parts[] = {
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2202
            body_summary->get_satb_drain_seq(),
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2203
            body_summary->get_parallel_seq(),
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2204
            body_summary->get_clear_ct_seq()
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2205
          };
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2206
          calc_other_times_ms = NumberSeq(summary->get_total_seq(),
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2207
                                                3, other_parts);
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2208
        } else {
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2209
          // serial
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2210
          NumberSeq* other_parts[] = {
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2211
            body_summary->get_satb_drain_seq(),
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2212
            body_summary->get_update_rs_seq(),
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2213
            body_summary->get_ext_root_scan_seq(),
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2214
            body_summary->get_mark_stack_scan_seq(),
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2215
            body_summary->get_scan_rs_seq(),
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2216
            body_summary->get_obj_copy_seq()
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2217
          };
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2218
          calc_other_times_ms = NumberSeq(summary->get_total_seq(),
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2219
                                                6, other_parts);
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2220
        }
50b7209aed27 6981746: G1: SEGV with -XX:+TraceGen0Time
johnc
parents: 6249
diff changeset
  2221
        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
  2222
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2223
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2224
  } else {
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  2225
    LineBuffer(1).append_and_print_cr("none");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2226
  }
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  2227
  LineBuffer(0).append_and_print_cr("");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2228
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2229
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2230
void G1CollectorPolicy::print_tracing_info() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2231
  if (TraceGen0Time) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2232
    gclog_or_tty->print_cr("ALL PAUSES");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2233
    print_summary_sd(0, "Total", _all_pause_times_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2234
    gclog_or_tty->print_cr("");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2235
    gclog_or_tty->print_cr("");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2236
    gclog_or_tty->print_cr("   Full Young GC Pauses:    %8d", _full_young_pause_num);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2237
    gclog_or_tty->print_cr("   Partial Young GC Pauses: %8d", _partial_young_pause_num);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2238
    gclog_or_tty->print_cr("");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2239
2344
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2260
diff changeset
  2240
    gclog_or_tty->print_cr("EVACUATION PAUSES");
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2260
diff changeset
  2241
    print_summary(_summary);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2242
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2243
    gclog_or_tty->print_cr("MISC");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2244
    print_summary_sd(0, "Stop World", _all_stop_world_times_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2245
    print_summary_sd(0, "Yields", _all_yield_times_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2246
    for (int i = 0; i < _aux_num; ++i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2247
      if (_all_aux_times_ms[i].num() > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2248
        char buffer[96];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2249
        sprintf(buffer, "Aux%d", i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2250
        print_summary_sd(0, buffer, &_all_aux_times_ms[i]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2251
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2252
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2253
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2254
    size_t all_region_num = _region_num_young + _region_num_tenured;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2255
    gclog_or_tty->print_cr("   New Regions %8d, Young %8d (%6.2lf%%), "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2256
               "Tenured %8d (%6.2lf%%)",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2257
               all_region_num,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2258
               _region_num_young,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2259
               (double) _region_num_young / (double) all_region_num * 100.0,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2260
               _region_num_tenured,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2261
               (double) _region_num_tenured / (double) all_region_num * 100.0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2262
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2263
  if (TraceGen1Time) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2264
    if (_all_full_gc_times_ms->num() > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2265
      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
  2266
                 _all_full_gc_times_ms->num(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2267
                 _all_full_gc_times_ms->sum() / 1000.0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2268
      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
  2269
      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
  2270
                    _all_full_gc_times_ms->sd(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2271
                    _all_full_gc_times_ms->maximum());
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 G1CollectorPolicy::print_yg_surv_rate_info() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2277
#ifndef PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2278
  _short_lived_surv_rate_group->print_surv_rate_summary();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2279
  // add this call for any other surv rate groups
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2280
#endif // PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2281
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2282
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2283
void
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2284
G1CollectorPolicy::update_region_num(bool young) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2285
  if (young) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2286
    ++_region_num_young;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2287
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2288
    ++_region_num_tenured;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2289
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2290
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2291
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2292
#ifndef PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2293
// for debugging, bit of a hack...
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2294
static char*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2295
region_num_to_mbs(int length) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2296
  static char buffer[64];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2297
  double bytes = (double) (length * HeapRegion::GrainBytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2298
  double mbs = bytes / (double) (1024 * 1024);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2299
  sprintf(buffer, "%7.2lfMB", mbs);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2300
  return buffer;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2301
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2302
#endif // PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2303
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2304
size_t G1CollectorPolicy::max_regions(int purpose) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2305
  switch (purpose) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2306
    case GCAllocForSurvived:
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2307
      return _max_survivor_regions;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2308
    case GCAllocForTenured:
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2309
      return REGIONS_UNLIMITED;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2310
    default:
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2311
      ShouldNotReachHere();
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2312
      return REGIONS_UNLIMITED;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2313
  };
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2314
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2315
7416
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2316
void G1CollectorPolicy::calculate_max_gc_locker_expansion() {
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2317
  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
  2318
  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
  2319
    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
  2320
    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
  2321
    // 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
  2322
    // 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
  2323
    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
  2324
  } else {
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2325
    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
  2326
  }
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2327
  _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
  2328
  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
  2329
}
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7398
diff changeset
  2330
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2331
// Calculates survivor space parameters.
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2332
void G1CollectorPolicy::calculate_survivors_policy()
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2333
{
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2334
  if (G1FixedSurvivorSpaceSize == 0) {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2335
    _max_survivor_regions = _young_list_target_length / SurvivorRatio;
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2336
  } else {
2011
d666454081dd 6802413: G1: G1FixedSurvivorSpaceSize should be converted into regions in calculate_survivors_policy()
apetrusenko
parents: 2009
diff changeset
  2337
    _max_survivor_regions = G1FixedSurvivorSpaceSize / HeapRegion::GrainBytes;
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2338
  }
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2339
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2340
  if (G1FixedTenuringThreshold) {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2341
    _tenuring_threshold = MaxTenuringThreshold;
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2342
  } else {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2343
    _tenuring_threshold = _survivors_age_table.compute_tenuring_threshold(
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2344
        HeapRegion::GrainWords * _max_survivor_regions);
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2345
  }
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2346
}
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  2347
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2348
#ifndef PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2349
class HRSortIndexIsOKClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2350
  CollectionSetChooser* _chooser;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2351
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2352
  HRSortIndexIsOKClosure(CollectionSetChooser* chooser) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2353
    _chooser(chooser) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2354
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2355
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2356
    if (!r->continuesHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2357
      assert(_chooser->regionProperlyOrdered(r), "Ought to be.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2358
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2359
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2360
  }
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2363
bool G1CollectorPolicy_BestRegionsFirst::assertMarkedBytesDataOK() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2364
  HRSortIndexIsOKClosure cl(_collectionSetChooser);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2365
  _g1->heap_region_iterate(&cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2366
  return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2367
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2368
#endif
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2369
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2370
bool
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2371
G1CollectorPolicy::force_initial_mark_if_outside_cycle() {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2372
  bool during_cycle = _g1->concurrent_mark()->cmThread()->during_cycle();
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2373
  if (!during_cycle) {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2374
    set_initiate_conc_mark_if_possible();
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2375
    return true;
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2376
  } else {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2377
    return false;
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2378
  }
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2379
}
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2380
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2381
void
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2382
G1CollectorPolicy::decide_on_conc_mark_initiation() {
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2383
  // 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
  2384
  // initial-mark pause.
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2385
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2386
  // 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
  2387
  // 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
  2388
  // 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
  2389
  // initial-mark pause).
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2390
  assert(!during_initial_mark_pause(), "pre-condition");
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2391
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2392
  if (initiate_conc_mark_if_possible()) {
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2393
    // 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
  2394
    // 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
  2395
    // concurrent marking cycle. So we might initiate one.
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2396
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2397
    bool during_cycle = _g1->concurrent_mark()->cmThread()->during_cycle();
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2398
    if (!during_cycle) {
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2399
      // 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
  2400
      // 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
  2401
      // initiate a new cycle.
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2402
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2403
      set_during_initial_mark_pause();
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2404
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2405
      // 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
  2406
      // we've already acted on it.
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2407
      clear_initiate_conc_mark_if_possible();
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2408
    } else {
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2409
      // The concurrent marking thread is still finishing up the
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2410
      // 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
  2411
      // overlap. In particular, the concurrent marking thread might
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2412
      // 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
  2413
      // 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
  2414
      // 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
  2415
      // 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
  2416
      // 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
  2417
      // periodically yields while clearing the next marking bitmap
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2418
      // 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
  2419
      // 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
  2420
      // let the concurrent marking thread complete the last one.
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2421
    }
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2422
  }
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2423
}
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2424
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5240
diff changeset
  2425
void
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2426
G1CollectorPolicy_BestRegionsFirst::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2427
record_collection_pause_start(double start_time_sec, size_t start_used) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2428
  G1CollectorPolicy::record_collection_pause_start(start_time_sec, start_used);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2429
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2430
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2431
class KnownGarbageClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2432
  CollectionSetChooser* _hrSorted;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2433
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2434
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2435
  KnownGarbageClosure(CollectionSetChooser* hrSorted) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2436
    _hrSorted(hrSorted)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2437
  {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2438
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2439
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2440
    // We only include humongous regions in collection
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2441
    // sets when concurrent mark shows that their contained object is
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2442
    // unreachable.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2443
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2444
    // Do we have any marking information for this region?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2445
    if (r->is_marked()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2446
      // We don't include humongous regions in collection
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2447
      // sets because we collect them immediately at the end of a marking
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2448
      // cycle.  We also don't include young regions because we *must*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2449
      // include them in the next collection pause.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2450
      if (!r->isHumongous() && !r->is_young()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2451
        _hrSorted->addMarkedHeapRegion(r);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2452
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2453
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2454
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2455
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2456
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2457
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2458
class ParKnownGarbageHRClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2459
  CollectionSetChooser* _hrSorted;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2460
  jint _marked_regions_added;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2461
  jint _chunk_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2462
  jint _cur_chunk_idx;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2463
  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
  2464
  int _worker;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2465
  int _invokes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2466
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2467
  void get_new_chunk() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2468
    _cur_chunk_idx = _hrSorted->getParMarkedHeapRegionChunk(_chunk_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2469
    _cur_chunk_end = _cur_chunk_idx + _chunk_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2470
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2471
  void add_region(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2472
    if (_cur_chunk_idx == _cur_chunk_end) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2473
      get_new_chunk();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2474
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2475
    assert(_cur_chunk_idx < _cur_chunk_end, "postcondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2476
    _hrSorted->setMarkedHeapRegion(_cur_chunk_idx, r);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2477
    _marked_regions_added++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2478
    _cur_chunk_idx++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2479
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2480
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2481
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2482
  ParKnownGarbageHRClosure(CollectionSetChooser* hrSorted,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2483
                           jint chunk_size,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2484
                           int worker) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2485
    _hrSorted(hrSorted), _chunk_size(chunk_size), _worker(worker),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2486
    _marked_regions_added(0), _cur_chunk_idx(0), _cur_chunk_end(0),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2487
    _invokes(0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2488
  {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2489
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2490
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2491
    // We only include humongous regions in collection
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2492
    // sets when concurrent mark shows that their contained object is
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2493
    // unreachable.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2494
    _invokes++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2495
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2496
    // Do we have any marking information for this region?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2497
    if (r->is_marked()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2498
      // We don't include humongous regions in collection
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2499
      // sets because we collect them immediately at the end of a marking
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2500
      // cycle.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2501
      // We also do not include young regions in collection sets
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2502
      if (!r->isHumongous() && !r->is_young()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2503
        add_region(r);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2504
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2505
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2506
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2507
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2508
  jint marked_regions_added() { return _marked_regions_added; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2509
  int invokes() { return _invokes; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2510
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2511
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2512
class ParKnownGarbageTask: public AbstractGangTask {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2513
  CollectionSetChooser* _hrSorted;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2514
  jint _chunk_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2515
  G1CollectedHeap* _g1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2516
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2517
  ParKnownGarbageTask(CollectionSetChooser* hrSorted, jint chunk_size) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2518
    AbstractGangTask("ParKnownGarbageTask"),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2519
    _hrSorted(hrSorted), _chunk_size(chunk_size),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2520
    _g1(G1CollectedHeap::heap())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2521
  {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2522
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2523
  void work(int i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2524
    ParKnownGarbageHRClosure parKnownGarbageCl(_hrSorted, _chunk_size, i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2525
    // Back to zero for the claim value.
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
  2526
    _g1->heap_region_par_iterate_chunked(&parKnownGarbageCl, i,
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
  2527
                                         HeapRegion::InitialClaimValue);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2528
    jint regions_added = parKnownGarbageCl.marked_regions_added();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2529
    _hrSorted->incNumMarkedHeapRegions(regions_added);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2530
    if (G1PrintParCleanupStats) {
8682
5b00443611ae 7022943: G1: improve logging to avoid interleaved numbers
brutisso
parents: 8103
diff changeset
  2531
      gclog_or_tty->print_cr("     Thread %d called %d times, added %d regions to list.",
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2532
                 i, parKnownGarbageCl.invokes(), regions_added);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2533
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2534
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2535
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2536
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2537
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2538
G1CollectorPolicy_BestRegionsFirst::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2539
record_concurrent_mark_cleanup_end(size_t freed_bytes,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2540
                                   size_t max_live_bytes) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2541
  double start;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2542
  if (G1PrintParCleanupStats) start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2543
  record_concurrent_mark_cleanup_end_work1(freed_bytes, max_live_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2544
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2545
  _collectionSetChooser->clearMarkedHeapRegions();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2546
  double clear_marked_end;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2547
  if (G1PrintParCleanupStats) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2548
    clear_marked_end = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2549
    gclog_or_tty->print_cr("  clear marked regions + work1: %8.3f ms.",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2550
                  (clear_marked_end - start)*1000.0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2551
  }
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6449
diff changeset
  2552
  if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2553
    const size_t OverpartitionFactor = 4;
5694
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5350
diff changeset
  2554
    const size_t MinWorkUnit = 8;
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5350
diff changeset
  2555
    const size_t WorkUnit =
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2556
      MAX2(_g1->n_regions() / (ParallelGCThreads * OverpartitionFactor),
5694
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5350
diff changeset
  2557
           MinWorkUnit);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2558
    _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
  2559
                                                             WorkUnit);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2560
    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
  2561
                                            (int) WorkUnit);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2562
    _g1->workers()->run_task(&parKnownGarbageTask);
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
  2563
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
  2564
    assert(_g1->check_heap_region_claim_values(HeapRegion::InitialClaimValue),
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1374
diff changeset
  2565
           "sanity check");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2566
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2567
    KnownGarbageClosure knownGarbagecl(_collectionSetChooser);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2568
    _g1->heap_region_iterate(&knownGarbagecl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2569
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2570
  double known_garbage_end;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2571
  if (G1PrintParCleanupStats) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2572
    known_garbage_end = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2573
    gclog_or_tty->print_cr("  compute known garbage: %8.3f ms.",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2574
                  (known_garbage_end - clear_marked_end)*1000.0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2575
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2576
  _collectionSetChooser->sortMarkedHeapRegions();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2577
  double sort_end;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2578
  if (G1PrintParCleanupStats) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2579
    sort_end = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2580
    gclog_or_tty->print_cr("  sorting: %8.3f ms.",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2581
                  (sort_end - known_garbage_end)*1000.0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2582
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2583
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2584
  record_concurrent_mark_cleanup_end_work2();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2585
  double work2_end;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2586
  if (G1PrintParCleanupStats) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2587
    work2_end = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2588
    gclog_or_tty->print_cr("  work2: %8.3f ms.",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2589
                  (work2_end - sort_end)*1000.0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2590
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2591
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2592
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2593
// Add the heap region at the head of the non-incremental collection set
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2594
void G1CollectorPolicy::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2595
add_to_collection_set(HeapRegion* hr) {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2596
  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
  2597
  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
  2598
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2599
  if (_g1->mark_in_progress())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2600
    _g1->concurrent_mark()->registerCSetRegion(hr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2601
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2602
  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
  2603
  hr->set_in_collection_set(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2604
  hr->set_next_in_collection_set(_collection_set);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2605
  _collection_set = hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2606
  _collection_set_size++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2607
  _collection_set_bytes_used_before += hr->used();
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1623
diff changeset
  2608
  _g1->register_region_with_in_cset_fast_test(hr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2609
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2610
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2611
// 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
  2612
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
  2613
  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
  2614
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2615
  _inc_cset_head = NULL;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2616
  _inc_cset_tail = NULL;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2617
  _inc_cset_size = 0;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2618
  _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
  2619
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2620
  if (in_young_gc_mode()) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2621
    _inc_cset_young_index = 0;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2622
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2623
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2624
  _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
  2625
  _inc_cset_recorded_young_bytes = 0;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2626
  _inc_cset_recorded_rs_lengths = 0;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2627
  _inc_cset_predicted_elapsed_time_ms = 0;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2628
  _inc_cset_predicted_bytes_to_copy = 0;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2629
  _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
  2630
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2631
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2632
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
  2633
  // 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
  2634
  // * 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
  2635
  //   evacuation pause,
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2636
  // * 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
  2637
  //   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
  2638
  // * 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
  2639
  //   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
  2640
  // 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
  2641
  // 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
  2642
  // 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
  2643
  // refine thread (RSet sampling).
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2644
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2645
  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
  2646
  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
  2647
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2648
  _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
  2649
  _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
  2650
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2651
  _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
  2652
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2653
  // 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
  2654
  // 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
  2655
  // 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
  2656
  // rset sampling code
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2657
  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
  2658
  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
  2659
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2660
#if PREDICTIONS_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2661
  size_t bytes_to_copy = predict_bytes_to_copy(hr);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2662
  _inc_cset_predicted_bytes_to_copy += bytes_to_copy;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2663
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2664
  // Record the number of bytes used in this region
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2665
  _inc_cset_recorded_young_bytes += used_bytes;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2666
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2667
  // 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
  2668
  // 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
  2669
  // 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
  2670
  // rset sampling code
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2671
  hr->set_predicted_bytes_to_copy(bytes_to_copy);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2672
#endif // PREDICTIONS_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2673
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2674
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2675
void G1CollectorPolicy::remove_from_incremental_cset_info(HeapRegion* hr) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2676
  // This routine is currently only called as part of the updating of
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2677
  // existing policy information for regions in the incremental cset that
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2678
  // is performed by the concurrent refine thread(s) as part of young list
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2679
  // RSet sampling. Therefore we should not be at a safepoint.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2680
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2681
  assert(!SafepointSynchronize::is_at_safepoint(), "should not be at safepoint");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2682
  assert(hr->is_young(), "it should be");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2683
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2684
  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
  2685
  size_t old_rs_length = hr->recorded_rs_length();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2686
  double old_elapsed_time_ms = hr->predicted_elapsed_time_ms();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2687
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2688
  // Subtract the old recorded/predicted policy information for
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2689
  // the given heap region from the collection set info.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2690
  _inc_cset_recorded_rs_lengths -= old_rs_length;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2691
  _inc_cset_predicted_elapsed_time_ms -= old_elapsed_time_ms;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2692
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2693
  _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
  2694
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2695
  // Clear the values cached in the heap region
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2696
  hr->set_recorded_rs_length(0);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2697
  hr->set_predicted_elapsed_time_ms(0);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2698
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2699
#if PREDICTIONS_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2700
  size_t old_predicted_bytes_to_copy = hr->predicted_bytes_to_copy();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2701
  _inc_cset_predicted_bytes_to_copy -= old_predicted_bytes_to_copy;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2702
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2703
  // Subtract the number of bytes used in this region
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2704
  _inc_cset_recorded_young_bytes -= used_bytes;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2705
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2706
  // Clear the values cached in the heap region
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2707
  hr->set_predicted_bytes_to_copy(0);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2708
#endif // PREDICTIONS_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2709
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2710
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2711
void G1CollectorPolicy::update_incremental_cset_info(HeapRegion* hr, size_t new_rs_length) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2712
  // Update the collection set information that is dependent on the new RS length
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2713
  assert(hr->is_young(), "Precondition");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2714
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2715
  remove_from_incremental_cset_info(hr);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2716
  add_to_incremental_cset_info(hr, new_rs_length);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2717
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2718
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2719
void G1CollectorPolicy::add_region_to_incremental_cset_common(HeapRegion* hr) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2720
  assert( hr->is_young(), "invariant");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2721
  assert( hr->young_index_in_cset() == -1, "invariant" );
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2722
  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
  2723
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2724
  // 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
  2725
  // 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
  2726
  // 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
  2727
  // 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
  2728
  // 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
  2729
  // 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
  2730
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2731
  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
  2732
  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
  2733
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2734
  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
  2735
  _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
  2736
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2737
  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
  2738
  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
  2739
  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
  2740
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2741
  _inc_cset_size++;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2742
  _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
  2743
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2744
  hr->set_young_index_in_cset((int) _inc_cset_young_index);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2745
  ++_inc_cset_young_index;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2746
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2747
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2748
// 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
  2749
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
  2750
  // 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
  2751
  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
  2752
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2753
  // Do the 'common' stuff
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2754
  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
  2755
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2756
  // 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
  2757
  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
  2758
    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
  2759
    _inc_cset_head = hr;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2760
  } else {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2761
    _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
  2762
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2763
  _inc_cset_tail = hr;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2764
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2765
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2766
// 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
  2767
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
  2768
  // 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
  2769
  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
  2770
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2771
  // Do the 'common' stuff
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2772
  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
  2773
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2774
  // 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
  2775
  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
  2776
  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
  2777
    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
  2778
    _inc_cset_tail = hr;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2779
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2780
  _inc_cset_head = hr;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2781
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2782
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2783
#ifndef PRODUCT
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2784
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
  2785
  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
  2786
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2787
  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
  2788
  HeapRegion* csr = list_head;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2789
  while (csr != NULL) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2790
    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
  2791
    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
  2792
    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
  2793
                 "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
  2794
                        csr->bottom(), csr->end(),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2795
                        csr->top(),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2796
                        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
  2797
                        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
  2798
                        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
  2799
                        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
  2800
                        csr->is_young(),
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2801
                        csr->is_survivor());
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2802
    csr = next;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2803
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2804
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2805
#endif // !PRODUCT
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2806
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  2807
void
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2808
G1CollectorPolicy_BestRegionsFirst::choose_collection_set(
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2809
                                                  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
  2810
  // 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
  2811
  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
  2812
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2813
  start_recording_regions();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2814
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2815
  guarantee(target_pause_time_ms > 0.0,
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2816
            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
  2817
                    target_pause_time_ms));
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2818
  guarantee(_collection_set == NULL, "Precondition");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2819
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2820
  double base_time_ms = predict_base_elapsed_time_ms(_pending_cards);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2821
  double predicted_pause_time_ms = base_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2822
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2823
  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
  2824
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2825
  // the 10% and 50% values are arbitrary...
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2826
  if (time_remaining_ms < 0.10 * target_pause_time_ms) {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2827
    time_remaining_ms = 0.50 * target_pause_time_ms;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2828
    _within_target = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2829
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2830
    _within_target = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2831
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2832
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2833
  // We figure out the number of bytes available for future to-space.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2834
  // For new regions without marking information, we must assume the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2835
  // worst-case of complete survival.  If we have marking information for a
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2836
  // region, we can bound the amount of live data.  We can add a number of
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2837
  // such regions, as long as the sum of the live data bounds does not
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2838
  // exceed the available evacuation space.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2839
  size_t max_live_bytes = _g1->free_regions() * HeapRegion::GrainBytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2840
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2841
  size_t expansion_bytes =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2842
    _g1->expansion_regions() * HeapRegion::GrainBytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2843
2344
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2260
diff changeset
  2844
  _collection_set_bytes_used_before = 0;
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2260
diff changeset
  2845
  _collection_set_size = 0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2846
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2847
  // Adjust for expansion and slop.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2848
  max_live_bytes = max_live_bytes + expansion_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2849
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2850
  HeapRegion* hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2851
  if (in_young_gc_mode()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2852
    double young_start_time_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2853
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2854
    if (G1PolicyVerbose > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2855
      gclog_or_tty->print_cr("Adding %d young regions to the CSet",
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2856
                    _g1->young_list()->length());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2857
    }
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2858
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2859
    _young_cset_length  = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2860
    _last_young_gc_full = full_young_gcs() ? true : false;
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2861
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2862
    if (_last_young_gc_full)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2863
      ++_full_young_pause_num;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2864
    else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2865
      ++_partial_young_pause_num;
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2866
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2867
    // The young list is laid with the survivor regions from the previous
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2868
    // pause are appended to the RHS of the young list, i.e.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2869
    //   [Newly Young Regions ++ Survivors from last pause].
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2870
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2871
    hr = _g1->young_list()->first_survivor_region();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2872
    while (hr != NULL) {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2873
      assert(hr->is_survivor(), "badly formed young list");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2874
      hr->set_young();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2875
      hr = hr->get_next_young_region();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2876
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2877
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2878
    // Clear the fields that point to the survivor list - they are
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2879
    // all young now.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2880
    _g1->young_list()->clear_survivors();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2881
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2882
    if (_g1->mark_in_progress())
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2883
      _g1->concurrent_mark()->register_collection_set_finger(_inc_cset_max_finger);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2884
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2885
    _young_cset_length = _inc_cset_young_index;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2886
    _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
  2887
    _collection_set_size = _inc_cset_size;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2888
    _collection_set_bytes_used_before = _inc_cset_bytes_used_before;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2889
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2890
    // For young regions in the collection set, we assume the worst
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2891
    // case of complete survival
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2892
    max_live_bytes -= _inc_cset_size * HeapRegion::GrainBytes;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2893
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2894
    time_remaining_ms -= _inc_cset_predicted_elapsed_time_ms;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2895
    predicted_pause_time_ms += _inc_cset_predicted_elapsed_time_ms;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2896
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2897
    // The number of recorded young regions is the incremental
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2898
    // collection set's current size
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2899
    set_recorded_young_regions(_inc_cset_size);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2900
    set_recorded_rs_lengths(_inc_cset_recorded_rs_lengths);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2901
    set_recorded_young_bytes(_inc_cset_recorded_young_bytes);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2902
#if PREDICTIONS_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2903
    set_predicted_bytes_to_copy(_inc_cset_predicted_bytes_to_copy);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2904
#endif // PREDICTIONS_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2905
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2906
    if (G1PolicyVerbose > 0) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2907
      gclog_or_tty->print_cr("  Added " PTR_FORMAT " Young Regions to CS.",
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2908
                             _inc_cset_size);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2909
      gclog_or_tty->print_cr("    (" SIZE_FORMAT " KB left in heap.)",
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2910
                            max_live_bytes/K);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2911
    }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2912
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2913
    assert(_inc_cset_size == _g1->young_list()->length(), "Invariant");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2914
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2915
    double young_end_time_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2916
    _recorded_young_cset_choice_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2917
      (young_end_time_sec - young_start_time_sec) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2918
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2919
    // We are doing young collections so reset this.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2920
    non_young_start_time_sec = young_end_time_sec;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2921
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2922
    // Note we can use either _collection_set_size or
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2923
    // _young_cset_length here
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2924
    if (_collection_set_size > 0 && _last_young_gc_full) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2925
      // don't bother adding more regions...
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2926
      goto choose_collection_set_end;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2927
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2928
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2929
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2930
  if (!in_young_gc_mode() || !full_young_gcs()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2931
    bool should_continue = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2932
    NumberSeq seq;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2933
    double avg_prediction = 100000000000000000.0; // something very large
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2934
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2935
    do {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2936
      hr = _collectionSetChooser->getNextMarkedRegion(time_remaining_ms,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2937
                                                      avg_prediction);
2344
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2260
diff changeset
  2938
      if (hr != NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2939
        double predicted_time_ms = predict_region_elapsed_time_ms(hr, false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2940
        time_remaining_ms -= predicted_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2941
        predicted_pause_time_ms += predicted_time_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2942
        add_to_collection_set(hr);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2943
        record_non_young_cset_region(hr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2944
        max_live_bytes -= MIN2(hr->max_live_bytes(), max_live_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2945
        if (G1PolicyVerbose > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2946
          gclog_or_tty->print_cr("    (" SIZE_FORMAT " KB left in heap.)",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2947
                        max_live_bytes/K);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2948
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2949
        seq.add(predicted_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2950
        avg_prediction = seq.avg() + seq.sd();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2951
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2952
      should_continue =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2953
        ( hr != NULL) &&
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2954
        ( (adaptive_young_list_length()) ? time_remaining_ms > 0.0
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2955
          : _collection_set_size < _young_list_fixed_length );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2956
    } while (should_continue);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2957
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2958
    if (!adaptive_young_list_length() &&
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2959
        _collection_set_size < _young_list_fixed_length)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2960
      _should_revert_to_full_young_gcs  = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2961
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2962
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2963
choose_collection_set_end:
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2964
  stop_incremental_cset_building();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2965
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2966
  count_CS_bytes_used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2967
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2968
  end_recording_regions();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2969
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2970
  double non_young_end_time_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2971
  _recorded_non_young_cset_choice_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2972
    (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
  2973
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2974
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2975
void G1CollectorPolicy_BestRegionsFirst::record_full_collection_end() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2976
  G1CollectorPolicy::record_full_collection_end();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2977
  _collectionSetChooser->updateAfterFullCollection();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2978
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2979
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2980
void G1CollectorPolicy_BestRegionsFirst::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2981
expand_if_possible(size_t numRegions) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2982
  size_t expansion_bytes = numRegions * HeapRegion::GrainBytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2983
  _g1->expand(expansion_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2984
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2985
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2986
void G1CollectorPolicy_BestRegionsFirst::
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  2987
record_collection_pause_end() {
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  2988
  G1CollectorPolicy::record_collection_pause_end();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2989
  assert(assertMarkedBytesDataOK(), "Marked regions not OK at pause end.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2990
}