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