hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
author tschatzl
Wed, 11 Sep 2013 16:25:02 +0200
changeset 19986 33d188c66ed9
parent 19729 0ddd2b7bb9bd
child 20083 df032615dd00
child 20282 7f9cbdf89af2
permissions -rw-r--r--
8010722: assert: failed: heap size is too big for compressed oops Summary: Use conservative assumptions of required alignment for the various garbage collector components into account when determining the maximum heap size that supports compressed oops. Using this conservative value avoids several circular dependencies in the calculation. Reviewed-by: stefank, dholmes
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
/*
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
     2
 * Copyright (c) 2001, 2013, 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: 5542
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5542
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: 5542
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: 7385
diff changeset
    25
#include "precompiled.hpp"
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
    26
#include "code/codeCache.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    27
#include "code/icBuffer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    28
#include "gc_implementation/g1/bufferingOopClosure.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    29
#include "gc_implementation/g1/concurrentG1Refine.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    30
#include "gc_implementation/g1/concurrentG1RefineThread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    31
#include "gc_implementation/g1/concurrentMarkThread.inline.hpp"
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
    32
#include "gc_implementation/g1/g1AllocRegion.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    33
#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    34
#include "gc_implementation/g1/g1CollectorPolicy.hpp"
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
    35
#include "gc_implementation/g1/g1ErgoVerbose.hpp"
11451
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
    36
#include "gc_implementation/g1/g1EvacFailure.hpp"
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
    37
#include "gc_implementation/g1/g1GCPhaseTimes.hpp"
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12271
diff changeset
    38
#include "gc_implementation/g1/g1Log.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    39
#include "gc_implementation/g1/g1MarkSweep.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    40
#include "gc_implementation/g1/g1OopClosures.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    41
#include "gc_implementation/g1/g1RemSet.inline.hpp"
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
    42
#include "gc_implementation/g1/g1YCTypes.hpp"
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
    43
#include "gc_implementation/g1/heapRegion.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    44
#include "gc_implementation/g1/heapRegionRemSet.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    45
#include "gc_implementation/g1/heapRegionSeq.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    46
#include "gc_implementation/g1/vm_operations_g1.hpp"
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
    47
#include "gc_implementation/shared/gcHeapSummary.hpp"
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
    48
#include "gc_implementation/shared/gcTimer.hpp"
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
    49
#include "gc_implementation/shared/gcTrace.hpp"
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
    50
#include "gc_implementation/shared/gcTraceTime.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    51
#include "gc_implementation/shared/isGCActiveMark.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    52
#include "memory/gcLocker.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    53
#include "memory/genOopClosures.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    54
#include "memory/generationSpec.hpp"
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
    55
#include "memory/referenceProcessor.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    56
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    57
#include "oops/oop.pcgc.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    58
#include "runtime/vmThread.hpp"
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    59
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
    60
size_t G1CollectedHeap::_humongous_object_threshold_in_words = 0;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
    61
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    62
// turn it on so that the contents of the young list (scan-only /
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    63
// to-be-collected) are printed at "strategic" points before / during
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    64
// / after the collection --- this is useful for debugging
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
    65
#define YOUNG_LIST_VERBOSE 0
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    66
// CURRENT STATUS
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    67
// This file is under construction.  Search for "FIXME".
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
// INVARIANTS/NOTES
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
// All allocation activity covered by the G1CollectedHeap interface is
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    72
// serialized by acquiring the HeapLock.  This happens in mem_allocate
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    73
// and allocate_new_tlab, which are the "entry" points to the
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    74
// allocation code from the rest of the JVM.  (Note that this does not
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    75
// apply to TLAB allocation, which is not part of this interface: it
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    76
// is done by clients of this interface.)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    77
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    78
// Notes on implementation of parallelism in different tasks.
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    79
//
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    80
// G1ParVerifyTask uses heap_region_par_iterate_chunked() for parallelism.
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    81
// The number of GC workers is passed to heap_region_par_iterate_chunked().
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    82
// It does use run_task() which sets _n_workers in the task.
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    83
// G1ParTask executes g1_process_strong_roots() ->
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
    84
// SharedHeap::process_strong_roots() which calls eventually to
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    85
// CardTableModRefBS::par_non_clean_card_iterate_work() which uses
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    86
// SequentialSubTasksDone.  SharedHeap::process_strong_roots() also
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    87
// directly uses SubTasksDone (_process_strong_tasks field in SharedHeap).
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    88
//
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    89
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    90
// Local to this file.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    91
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    92
class RefineCardTableEntryClosure: public CardTableEntryClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    93
  SuspendibleThreadSet* _sts;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    94
  G1RemSet* _g1rs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    95
  ConcurrentG1Refine* _cg1r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    96
  bool _concurrent;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    97
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    98
  RefineCardTableEntryClosure(SuspendibleThreadSet* sts,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    99
                              G1RemSet* g1rs,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   100
                              ConcurrentG1Refine* cg1r) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   101
    _sts(sts), _g1rs(g1rs), _cg1r(cg1r), _concurrent(true)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   102
  {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   103
  bool do_card_ptr(jbyte* card_ptr, int worker_i) {
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
   104
    bool oops_into_cset = _g1rs->refine_card(card_ptr, worker_i, false);
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   105
    // This path is executed by the concurrent refine or mutator threads,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   106
    // concurrently, and so we do not care if card_ptr contains references
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   107
    // that point into the collection set.
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   108
    assert(!oops_into_cset, "should be");
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   109
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   110
    if (_concurrent && _sts->should_yield()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   111
      // Caller will actually yield.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   112
      return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   113
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   114
    // Otherwise, we finished successfully; return true.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   115
    return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   116
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   117
  void set_concurrent(bool b) { _concurrent = b; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   118
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   119
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   120
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   121
class ClearLoggedCardTableEntryClosure: public CardTableEntryClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   122
  int _calls;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   123
  G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   124
  CardTableModRefBS* _ctbs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   125
  int _histo[256];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   126
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   127
  ClearLoggedCardTableEntryClosure() :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   128
    _calls(0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   129
  {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   130
    _g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   131
    _ctbs = (CardTableModRefBS*)_g1h->barrier_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   132
    for (int i = 0; i < 256; i++) _histo[i] = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   133
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   134
  bool do_card_ptr(jbyte* card_ptr, int worker_i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   135
    if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   136
      _calls++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   137
      unsigned char* ujb = (unsigned char*)card_ptr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   138
      int ind = (int)(*ujb);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   139
      _histo[ind]++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   140
      *card_ptr = -1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   141
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   142
    return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   143
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   144
  int calls() { return _calls; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   145
  void print_histo() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   146
    gclog_or_tty->print_cr("Card table value histogram:");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   147
    for (int i = 0; i < 256; i++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   148
      if (_histo[i] != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   149
        gclog_or_tty->print_cr("  %d: %d", i, _histo[i]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   150
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   151
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   152
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   153
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   154
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   155
class RedirtyLoggedCardTableEntryClosure: public CardTableEntryClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   156
  int _calls;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   157
  G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   158
  CardTableModRefBS* _ctbs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   159
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   160
  RedirtyLoggedCardTableEntryClosure() :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   161
    _calls(0)
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
    _g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   164
    _ctbs = (CardTableModRefBS*)_g1h->barrier_set();
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
  bool do_card_ptr(jbyte* card_ptr, int worker_i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   167
    if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   168
      _calls++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   169
      *card_ptr = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   170
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   171
    return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   172
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   173
  int calls() { return _calls; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   174
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   175
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   176
class RedirtyLoggedCardTableEntryFastClosure : public CardTableEntryClosure {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   177
public:
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   178
  bool do_card_ptr(jbyte* card_ptr, int worker_i) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   179
    *card_ptr = CardTableModRefBS::dirty_card_val();
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   180
    return true;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   181
  }
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   182
};
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   183
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   184
YoungList::YoungList(G1CollectedHeap* g1h) :
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   185
    _g1h(g1h), _head(NULL), _length(0), _last_sampled_rs_lengths(0),
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   186
    _survivor_head(NULL), _survivor_tail(NULL), _survivor_length(0) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   187
  guarantee(check_list_empty(false), "just making sure...");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   188
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   189
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   190
void YoungList::push_region(HeapRegion *hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   191
  assert(!hr->is_young(), "should not already be young");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   192
  assert(hr->get_next_young_region() == NULL, "cause it should!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   193
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   194
  hr->set_next_young_region(_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   195
  _head = hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   196
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10997
diff changeset
   197
  _g1h->g1_policy()->set_region_eden(hr, (int) _length);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   198
  ++_length;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   199
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   200
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   201
void YoungList::add_survivor_region(HeapRegion* hr) {
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   202
  assert(hr->is_survivor(), "should be flagged as survivor region");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   203
  assert(hr->get_next_young_region() == NULL, "cause it should!");
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
  hr->set_next_young_region(_survivor_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   206
  if (_survivor_head == NULL) {
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   207
    _survivor_tail = hr;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   208
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   209
  _survivor_head = hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   210
  ++_survivor_length;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   211
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   212
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   213
void YoungList::empty_list(HeapRegion* list) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   214
  while (list != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   215
    HeapRegion* next = list->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   216
    list->set_next_young_region(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   217
    list->uninstall_surv_rate_group();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   218
    list->set_not_young();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   219
    list = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   220
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   221
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   222
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   223
void YoungList::empty_list() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   224
  assert(check_list_well_formed(), "young list should be well formed");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   225
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   226
  empty_list(_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   227
  _head = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   228
  _length = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   229
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   230
  empty_list(_survivor_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   231
  _survivor_head = NULL;
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   232
  _survivor_tail = NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   233
  _survivor_length = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   234
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   235
  _last_sampled_rs_lengths = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   236
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   237
  assert(check_list_empty(false), "just making sure...");
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   240
bool YoungList::check_list_well_formed() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   241
  bool ret = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   242
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   243
  uint length = 0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   244
  HeapRegion* curr = _head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   245
  HeapRegion* last = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   246
  while (curr != NULL) {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   247
    if (!curr->is_young()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   248
      gclog_or_tty->print_cr("### YOUNG REGION "PTR_FORMAT"-"PTR_FORMAT" "
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   249
                             "incorrectly tagged (y: %d, surv: %d)",
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   250
                             curr->bottom(), curr->end(),
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   251
                             curr->is_young(), curr->is_survivor());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   252
      ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   253
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   254
    ++length;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   255
    last = curr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   256
    curr = curr->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   257
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   258
  ret = ret && (length == _length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   259
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   260
  if (!ret) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   261
    gclog_or_tty->print_cr("### YOUNG LIST seems not well formed!");
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   262
    gclog_or_tty->print_cr("###   list has %u entries, _length is %u",
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   263
                           length, _length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   264
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   265
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   266
  return ret;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   267
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   268
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   269
bool YoungList::check_list_empty(bool check_sample) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   270
  bool ret = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   271
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   272
  if (_length != 0) {
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   273
    gclog_or_tty->print_cr("### YOUNG LIST should have 0 length, not %u",
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   274
                  _length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   275
    ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   276
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   277
  if (check_sample && _last_sampled_rs_lengths != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   278
    gclog_or_tty->print_cr("### YOUNG LIST has non-zero last sampled RS lengths");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   279
    ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   280
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   281
  if (_head != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   282
    gclog_or_tty->print_cr("### YOUNG LIST does not have a NULL head");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   283
    ret = false;
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
  if (!ret) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   286
    gclog_or_tty->print_cr("### YOUNG LIST does not seem empty");
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
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   289
  return ret;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   290
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   291
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   292
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   293
YoungList::rs_length_sampling_init() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   294
  _sampled_rs_lengths = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   295
  _curr               = _head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   296
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   297
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   298
bool
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   299
YoungList::rs_length_sampling_more() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   300
  return _curr != NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   301
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   302
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   303
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   304
YoungList::rs_length_sampling_next() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   305
  assert( _curr != NULL, "invariant" );
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   306
  size_t rs_length = _curr->rem_set()->occupied();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   307
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   308
  _sampled_rs_lengths += rs_length;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   309
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   310
  // The current region may not yet have been added to the
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   311
  // incremental collection set (it gets added when it is
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   312
  // retired as the current allocation region).
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   313
  if (_curr->in_collection_set()) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   314
    // Update the collection set policy information for this region
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   315
    _g1h->g1_policy()->update_incremental_cset_info(_curr, rs_length);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   316
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   317
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   318
  _curr = _curr->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   319
  if (_curr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   320
    _last_sampled_rs_lengths = _sampled_rs_lengths;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   321
    // gclog_or_tty->print_cr("last sampled RS lengths = %d", _last_sampled_rs_lengths);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   322
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   323
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   324
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   325
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   326
YoungList::reset_auxilary_lists() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   327
  guarantee( is_empty(), "young list should be empty" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   328
  assert(check_list_well_formed(), "young list should be well formed");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   329
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   330
  // Add survivor regions to SurvRateGroup.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   331
  _g1h->g1_policy()->note_start_adding_survivor_regions();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   332
  _g1h->g1_policy()->finished_recalculating_age_indexes(true /* is_survivors */);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   333
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10997
diff changeset
   334
  int young_index_in_cset = 0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   335
  for (HeapRegion* curr = _survivor_head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   336
       curr != NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   337
       curr = curr->get_next_young_region()) {
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10997
diff changeset
   338
    _g1h->g1_policy()->set_region_survivor(curr, young_index_in_cset);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   339
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   340
    // The region is a non-empty survivor so let's add it to
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   341
    // the incremental collection set for the next evacuation
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   342
    // pause.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   343
    _g1h->g1_policy()->add_region_to_incremental_cset_rhs(curr);
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10997
diff changeset
   344
    young_index_in_cset += 1;
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10997
diff changeset
   345
  }
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   346
  assert((uint) young_index_in_cset == _survivor_length, "post-condition");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   347
  _g1h->g1_policy()->note_stop_adding_survivor_regions();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   348
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   349
  _head   = _survivor_head;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   350
  _length = _survivor_length;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   351
  if (_survivor_head != NULL) {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   352
    assert(_survivor_tail != NULL, "cause it shouldn't be");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   353
    assert(_survivor_length > 0, "invariant");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   354
    _survivor_tail->set_next_young_region(NULL);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   355
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   356
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   357
  // Don't clear the survivor list handles until the start of
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   358
  // the next evacuation pause - we need it in order to re-tag
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   359
  // the survivor regions from this evacuation pause as 'young'
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   360
  // at the start of the next.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   361
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   362
  _g1h->g1_policy()->finished_recalculating_age_indexes(false /* is_survivors */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   363
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   364
  assert(check_list_well_formed(), "young list should be well formed");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   365
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   366
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   367
void YoungList::print() {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   368
  HeapRegion* lists[] = {_head,   _survivor_head};
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   369
  const char* names[] = {"YOUNG", "SURVIVOR"};
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   370
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   371
  for (unsigned int list = 0; list < ARRAY_SIZE(lists); ++list) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   372
    gclog_or_tty->print_cr("%s LIST CONTENTS", names[list]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   373
    HeapRegion *curr = lists[list];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   374
    if (curr == NULL)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   375
      gclog_or_tty->print_cr("  empty");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   376
    while (curr != NULL) {
12508
d76458352d62 7143490: G1: Remove HeapRegion::_top_at_conc_mark_count
johnc
parents: 12382
diff changeset
   377
      gclog_or_tty->print_cr("  "HR_FORMAT", P: "PTR_FORMAT "N: "PTR_FORMAT", age: %4d",
d76458352d62 7143490: G1: Remove HeapRegion::_top_at_conc_mark_count
johnc
parents: 12382
diff changeset
   378
                             HR_FORMAT_PARAMS(curr),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   379
                             curr->prev_top_at_mark_start(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   380
                             curr->next_top_at_mark_start(),
12508
d76458352d62 7143490: G1: Remove HeapRegion::_top_at_conc_mark_count
johnc
parents: 12382
diff changeset
   381
                             curr->age_in_surv_rate_group_cond());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   382
      curr = curr->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   383
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   384
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   385
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   386
  gclog_or_tty->print_cr("");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   387
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   388
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   389
void G1CollectedHeap::push_dirty_cards_region(HeapRegion* hr)
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   390
{
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   391
  // Claim the right to put the region on the dirty cards region list
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   392
  // by installing a self pointer.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   393
  HeapRegion* next = hr->get_next_dirty_cards_region();
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   394
  if (next == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   395
    HeapRegion* res = (HeapRegion*)
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   396
      Atomic::cmpxchg_ptr(hr, hr->next_dirty_cards_region_addr(),
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   397
                          NULL);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   398
    if (res == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   399
      HeapRegion* head;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   400
      do {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   401
        // Put the region to the dirty cards region list.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   402
        head = _dirty_cards_region_list;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   403
        next = (HeapRegion*)
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   404
          Atomic::cmpxchg_ptr(hr, &_dirty_cards_region_list, head);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   405
        if (next == head) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   406
          assert(hr->get_next_dirty_cards_region() == hr,
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   407
                 "hr->get_next_dirty_cards_region() != hr");
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   408
          if (next == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   409
            // The last region in the list points to itself.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   410
            hr->set_next_dirty_cards_region(hr);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   411
          } else {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   412
            hr->set_next_dirty_cards_region(next);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   413
          }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   414
        }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   415
      } while (next != head);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   416
    }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   417
  }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   418
}
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   419
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   420
HeapRegion* G1CollectedHeap::pop_dirty_cards_region()
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   421
{
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   422
  HeapRegion* head;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   423
  HeapRegion* hr;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   424
  do {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   425
    head = _dirty_cards_region_list;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   426
    if (head == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   427
      return NULL;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   428
    }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   429
    HeapRegion* new_head = head->get_next_dirty_cards_region();
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   430
    if (head == new_head) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   431
      // The last region.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   432
      new_head = NULL;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   433
    }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   434
    hr = (HeapRegion*)Atomic::cmpxchg_ptr(new_head, &_dirty_cards_region_list,
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   435
                                          head);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   436
  } while (hr != head);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   437
  assert(hr != NULL, "invariant");
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   438
  hr->set_next_dirty_cards_region(NULL);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   439
  return hr;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   440
}
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   441
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   442
void G1CollectedHeap::stop_conc_gc_threads() {
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
   443
  _cg1r->stop();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   444
  _cmThread->stop();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   445
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   446
9935
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   447
#ifdef ASSERT
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   448
// A region is added to the collection set as it is retired
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   449
// so an address p can point to a region which will be in the
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   450
// collection set but has not yet been retired.  This method
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   451
// therefore is only accurate during a GC pause after all
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   452
// regions have been retired.  It is used for debugging
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   453
// to check if an nmethod has references to objects that can
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   454
// be move during a partial collection.  Though it can be
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   455
// inaccurate, it is sufficient for G1 because the conservative
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   456
// implementation of is_scavengable() for G1 will indicate that
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   457
// all nmethods must be scanned during a partial collection.
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   458
bool G1CollectedHeap::is_in_partial_collection(const void* p) {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   459
  HeapRegion* hr = heap_region_containing(p);
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   460
  return hr != NULL && hr->in_collection_set();
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   461
}
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   462
#endif
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   463
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   464
// Returns true if the reference points to an object that
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
   465
// can move in an incremental collection.
9935
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   466
bool G1CollectedHeap::is_scavengable(const void* p) {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   467
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   468
  G1CollectorPolicy* g1p = g1h->g1_policy();
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   469
  HeapRegion* hr = heap_region_containing(p);
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   470
  if (hr == NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
   471
     // null
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
   472
     assert(p == NULL, err_msg("Not NULL " PTR_FORMAT ,p));
9935
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   473
     return false;
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   474
  } else {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   475
    return !hr->isHumongous();
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   476
  }
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   477
}
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   478
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   479
void G1CollectedHeap::check_ct_logs_at_safepoint() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   480
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   481
  CardTableModRefBS* ct_bs = (CardTableModRefBS*)barrier_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   482
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   483
  // Count the dirty cards at the start.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   484
  CountNonCleanMemRegionClosure count1(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   485
  ct_bs->mod_card_iterate(&count1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   486
  int orig_count = count1.n();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   487
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   488
  // First clear the logged cards.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   489
  ClearLoggedCardTableEntryClosure clear;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   490
  dcqs.set_closure(&clear);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   491
  dcqs.apply_closure_to_all_completed_buffers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   492
  dcqs.iterate_closure_all_threads(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   493
  clear.print_histo();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   494
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   495
  // Now ensure that there's no dirty cards.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   496
  CountNonCleanMemRegionClosure count2(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   497
  ct_bs->mod_card_iterate(&count2);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   498
  if (count2.n() != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   499
    gclog_or_tty->print_cr("Card table has %d entries; %d originally",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   500
                           count2.n(), orig_count);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   501
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   502
  guarantee(count2.n() == 0, "Card table should be clean.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   503
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   504
  RedirtyLoggedCardTableEntryClosure redirty;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   505
  JavaThread::dirty_card_queue_set().set_closure(&redirty);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   506
  dcqs.apply_closure_to_all_completed_buffers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   507
  dcqs.iterate_closure_all_threads(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   508
  gclog_or_tty->print_cr("Log entries = %d, dirty cards = %d.",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   509
                         clear.calls(), orig_count);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   510
  guarantee(redirty.calls() == clear.calls(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   511
            "Or else mechanism is broken.");
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
  CountNonCleanMemRegionClosure count3(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   514
  ct_bs->mod_card_iterate(&count3);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   515
  if (count3.n() != orig_count) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   516
    gclog_or_tty->print_cr("Should have restored them all: orig = %d, final = %d.",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   517
                           orig_count, count3.n());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   518
    guarantee(count3.n() >= orig_count, "Should have restored them all.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   519
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   520
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   521
  JavaThread::dirty_card_queue_set().set_closure(_refine_cte_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   522
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   523
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   524
// Private class members.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   525
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   526
G1CollectedHeap* G1CollectedHeap::_g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   527
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   528
// Private methods.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   529
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   530
HeapRegion*
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   531
G1CollectedHeap::new_region_try_secondary_free_list() {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   532
  MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   533
  while (!_secondary_free_list.is_empty() || free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   534
    if (!_secondary_free_list.is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   535
      if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   536
        gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   537
                               "secondary_free_list has %u entries",
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   538
                               _secondary_free_list.length());
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   539
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   540
      // It looks as if there are free regions available on the
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   541
      // secondary_free_list. Let's move them to the free_list and try
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   542
      // again to allocate from it.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   543
      append_secondary_free_list();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   544
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   545
      assert(!_free_list.is_empty(), "if the secondary_free_list was not "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   546
             "empty we should have moved at least one entry to the free_list");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   547
      HeapRegion* res = _free_list.remove_head();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   548
      if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   549
        gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   550
                               "allocated "HR_FORMAT" from secondary_free_list",
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   551
                               HR_FORMAT_PARAMS(res));
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   552
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   553
      return res;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   554
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   555
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
   556
    // Wait here until we get notified either when (a) there are no
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   557
    // more free regions coming or (b) some regions have been moved on
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   558
    // the secondary_free_list.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   559
    SecondaryFreeList_lock->wait(Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   560
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   561
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   562
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   563
    gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   564
                           "could not allocate from secondary_free_list");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   565
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   566
  return NULL;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   567
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   568
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   569
HeapRegion* G1CollectedHeap::new_region(size_t word_size, bool do_expand) {
10677
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
   570
  assert(!isHumongous(word_size) || word_size <= HeapRegion::GrainWords,
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   571
         "the only time we use this to allocate a humongous region is "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   572
         "when we are allocating a single humongous region");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   573
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   574
  HeapRegion* res;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   575
  if (G1StressConcRegionFreeing) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   576
    if (!_secondary_free_list.is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   577
      if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   578
        gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   579
                               "forced to look at the secondary_free_list");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   580
      }
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   581
      res = new_region_try_secondary_free_list();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   582
      if (res != NULL) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   583
        return res;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   584
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   585
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   586
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   587
  res = _free_list.remove_head_or_null();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   588
  if (res == NULL) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   589
    if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   590
      gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   591
                             "res == NULL, trying the secondary_free_list");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   592
    }
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   593
    res = new_region_try_secondary_free_list();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   594
  }
11449
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   595
  if (res == NULL && do_expand && _expand_heap_after_alloc_failure) {
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   596
    // Currently, only attempts to allocate GC alloc regions set
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   597
    // do_expand to true. So, we should only reach here during a
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   598
    // safepoint. If this assumption changes we might have to
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   599
    // reconsider the use of _expand_heap_after_alloc_failure.
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   600
    assert(SafepointSynchronize::is_at_safepoint(), "invariant");
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   601
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   602
    ergo_verbose1(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   603
                  "attempt heap expansion",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   604
                  ergo_format_reason("region allocation request failed")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   605
                  ergo_format_byte("allocation request"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   606
                  word_size * HeapWordSize);
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   607
    if (expand(word_size * HeapWordSize)) {
11449
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   608
      // Given that expand() succeeded in expanding the heap, and we
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   609
      // always expand the heap by an amount aligned to the heap
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   610
      // region size, the free list should in theory not be empty. So
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   611
      // it would probably be OK to use remove_head(). But the extra
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   612
      // check for NULL is unlikely to be a performance issue here (we
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   613
      // just expanded the heap!) so let's just be conservative and
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   614
      // use remove_head_or_null().
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   615
      res = _free_list.remove_head_or_null();
11449
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   616
    } else {
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   617
      _expand_heap_after_alloc_failure = false;
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   618
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   619
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   620
  return res;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   621
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   622
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   623
uint G1CollectedHeap::humongous_obj_allocate_find_first(uint num_regions,
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   624
                                                        size_t word_size) {
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   625
  assert(isHumongous(word_size), "word_size should be humongous");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   626
  assert(num_regions * HeapRegion::GrainWords >= word_size, "pre-condition");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   627
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   628
  uint first = G1_NULL_HRS_INDEX;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   629
  if (num_regions == 1) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   630
    // Only one region to allocate, no need to go through the slower
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
   631
    // path. The caller will attempt the expansion if this fails, so
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   632
    // let's not try to expand here too.
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   633
    HeapRegion* hr = new_region(word_size, false /* do_expand */);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   634
    if (hr != NULL) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   635
      first = hr->hrs_index();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   636
    } else {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   637
      first = G1_NULL_HRS_INDEX;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   638
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   639
  } else {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   640
    // We can't allocate humongous regions while cleanupComplete() is
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   641
    // running, since some of the regions we find to be empty might not
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   642
    // yet be added to the free list and it is not straightforward to
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   643
    // know which list they are on so that we can remove them. Note
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   644
    // that we only need to do this if we need to allocate more than
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   645
    // one region to satisfy the current humongous allocation
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   646
    // request. If we are only allocating one region we use the common
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   647
    // region allocation code (see above).
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   648
    wait_while_free_regions_coming();
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   649
    append_secondary_free_list_if_not_empty_with_lock();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   650
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   651
    if (free_regions() >= num_regions) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   652
      first = _hrs.find_contiguous(num_regions);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   653
      if (first != G1_NULL_HRS_INDEX) {
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   654
        for (uint i = first; i < first + num_regions; ++i) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   655
          HeapRegion* hr = region_at(i);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   656
          assert(hr->is_empty(), "sanity");
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   657
          assert(is_on_master_free_list(hr), "sanity");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   658
          hr->set_pending_removal(true);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   659
        }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   660
        _free_list.remove_all_pending(num_regions);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   661
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   662
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   663
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   664
  return first;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   665
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   666
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   667
HeapWord*
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   668
G1CollectedHeap::humongous_obj_allocate_initialize_regions(uint first,
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   669
                                                           uint num_regions,
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   670
                                                           size_t word_size) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   671
  assert(first != G1_NULL_HRS_INDEX, "pre-condition");
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   672
  assert(isHumongous(word_size), "word_size should be humongous");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   673
  assert(num_regions * HeapRegion::GrainWords >= word_size, "pre-condition");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   674
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   675
  // Index of last region in the series + 1.
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   676
  uint last = first + num_regions;
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   677
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   678
  // We need to initialize the region(s) we just discovered. This is
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   679
  // a bit tricky given that it can happen concurrently with
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   680
  // refinement threads refining cards on these regions and
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   681
  // potentially wanting to refine the BOT as they are scanning
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   682
  // those cards (this can happen shortly after a cleanup; see CR
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   683
  // 6991377). So we have to set up the region(s) carefully and in
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   684
  // a specific order.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   685
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   686
  // The word size sum of all the regions we will allocate.
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   687
  size_t word_size_sum = (size_t) num_regions * HeapRegion::GrainWords;
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   688
  assert(word_size <= word_size_sum, "sanity");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   689
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   690
  // This will be the "starts humongous" region.
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   691
  HeapRegion* first_hr = region_at(first);
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   692
  // The header of the new object will be placed at the bottom of
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   693
  // the first region.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   694
  HeapWord* new_obj = first_hr->bottom();
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   695
  // This will be the new end of the first region in the series that
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
   696
  // should also match the end of the last region in the series.
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   697
  HeapWord* new_end = new_obj + word_size_sum;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   698
  // This will be the new top of the first region that will reflect
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   699
  // this allocation.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   700
  HeapWord* new_top = new_obj + word_size;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   701
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   702
  // First, we need to zero the header of the space that we will be
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   703
  // allocating. When we update top further down, some refinement
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   704
  // threads might try to scan the region. By zeroing the header we
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   705
  // ensure that any thread that will try to scan the region will
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   706
  // come across the zero klass word and bail out.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   707
  //
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   708
  // NOTE: It would not have been correct to have used
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   709
  // CollectedHeap::fill_with_object() and make the space look like
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   710
  // an int array. The thread that is doing the allocation will
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   711
  // later update the object header to a potentially different array
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   712
  // type and, for a very short period of time, the klass and length
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   713
  // fields will be inconsistent. This could cause a refinement
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   714
  // thread to calculate the object size incorrectly.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   715
  Copy::fill_to_words(new_obj, oopDesc::header_size(), 0);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   716
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   717
  // We will set up the first region as "starts humongous". This
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   718
  // will also update the BOT covering all the regions to reflect
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   719
  // that there is a single object that starts at the bottom of the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   720
  // first region.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   721
  first_hr->set_startsHumongous(new_top, new_end);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   722
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   723
  // Then, if there are any, we will set up the "continues
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   724
  // humongous" regions.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   725
  HeapRegion* hr = NULL;
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   726
  for (uint i = first + 1; i < last; ++i) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   727
    hr = region_at(i);
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   728
    hr->set_continuesHumongous(first_hr);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   729
  }
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   730
  // If we have "continues humongous" regions (hr != NULL), then the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   731
  // end of the last one should match new_end.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   732
  assert(hr == NULL || hr->end() == new_end, "sanity");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   733
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   734
  // Up to this point no concurrent thread would have been able to
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   735
  // do any scanning on any region in this series. All the top
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   736
  // fields still point to bottom, so the intersection between
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   737
  // [bottom,top] and [card_start,card_end] will be empty. Before we
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   738
  // update the top fields, we'll do a storestore to make sure that
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   739
  // no thread sees the update to top before the zeroing of the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   740
  // object header and the BOT initialization.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   741
  OrderAccess::storestore();
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   742
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   743
  // Now that the BOT and the object header have been initialized,
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   744
  // we can update top of the "starts humongous" region.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   745
  assert(first_hr->bottom() < new_top && new_top <= first_hr->end(),
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   746
         "new_top should be in this region");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   747
  first_hr->set_top(new_top);
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   748
  if (_hr_printer.is_active()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   749
    HeapWord* bottom = first_hr->bottom();
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   750
    HeapWord* end = first_hr->orig_end();
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   751
    if ((first + 1) == last) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   752
      // the series has a single humongous region
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   753
      _hr_printer.alloc(G1HRPrinter::SingleHumongous, first_hr, new_top);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   754
    } else {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   755
      // the series has more than one humongous regions
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   756
      _hr_printer.alloc(G1HRPrinter::StartsHumongous, first_hr, end);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   757
    }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   758
  }
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   759
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   760
  // Now, we will update the top fields of the "continues humongous"
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   761
  // regions. The reason we need to do this is that, otherwise,
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   762
  // these regions would look empty and this will confuse parts of
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   763
  // G1. For example, the code that looks for a consecutive number
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   764
  // of empty regions will consider them empty and try to
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   765
  // re-allocate them. We can extend is_empty() to also include
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   766
  // !continuesHumongous(), but it is easier to just update the top
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   767
  // fields here. The way we set top for all regions (i.e., top ==
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   768
  // end for all regions but the last one, top == new_top for the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   769
  // last one) is actually used when we will free up the humongous
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   770
  // region in free_humongous_region().
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   771
  hr = NULL;
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   772
  for (uint i = first + 1; i < last; ++i) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   773
    hr = region_at(i);
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   774
    if ((i + 1) == last) {
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   775
      // last continues humongous region
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   776
      assert(hr->bottom() < new_top && new_top <= hr->end(),
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   777
             "new_top should fall on this region");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   778
      hr->set_top(new_top);
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   779
      _hr_printer.alloc(G1HRPrinter::ContinuesHumongous, hr, new_top);
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   780
    } else {
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   781
      // not last one
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   782
      assert(new_top > hr->end(), "new_top should be above this region");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   783
      hr->set_top(hr->end());
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   784
      _hr_printer.alloc(G1HRPrinter::ContinuesHumongous, hr, hr->end());
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   785
    }
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   786
  }
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   787
  // If we have continues humongous regions (hr != NULL), then the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   788
  // end of the last one should match new_end and its top should
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   789
  // match new_top.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   790
  assert(hr == NULL ||
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   791
         (hr->end() == new_end && hr->top() == new_top), "sanity");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   792
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   793
  assert(first_hr->used() == word_size * HeapWordSize, "invariant");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   794
  _summary_bytes_used += first_hr->used();
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   795
  _humongous_set.add(first_hr);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   796
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   797
  return new_obj;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   798
}
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   799
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   800
// If could fit into free regions w/o expansion, try.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   801
// Otherwise, if can expand, do so.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   802
// Otherwise, if using ex regions might help, try with ex given back.
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   803
HeapWord* G1CollectedHeap::humongous_obj_allocate(size_t word_size) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   804
  assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   805
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   806
  verify_region_sets_optional();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   807
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   808
  size_t word_size_rounded = round_to(word_size, HeapRegion::GrainWords);
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   809
  uint num_regions = (uint) (word_size_rounded / HeapRegion::GrainWords);
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   810
  uint x_num = expansion_regions();
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   811
  uint fs = _hrs.free_suffix();
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   812
  uint first = humongous_obj_allocate_find_first(num_regions, word_size);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   813
  if (first == G1_NULL_HRS_INDEX) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   814
    // The only thing we can do now is attempt expansion.
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   815
    if (fs + x_num >= num_regions) {
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   816
      // If the number of regions we're trying to allocate for this
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   817
      // object is at most the number of regions in the free suffix,
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   818
      // then the call to humongous_obj_allocate_find_first() above
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   819
      // should have succeeded and we wouldn't be here.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   820
      //
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   821
      // We should only be trying to expand when the free suffix is
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   822
      // not sufficient for the object _and_ we have some expansion
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   823
      // room available.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   824
      assert(num_regions > fs, "earlier allocation should have succeeded");
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   825
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   826
      ergo_verbose1(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   827
                    "attempt heap expansion",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   828
                    ergo_format_reason("humongous allocation request failed")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   829
                    ergo_format_byte("allocation request"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   830
                    word_size * HeapWordSize);
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   831
      if (expand((num_regions - fs) * HeapRegion::GrainBytes)) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   832
        // Even though the heap was expanded, it might not have
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   833
        // reached the desired size. So, we cannot assume that the
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   834
        // allocation will succeed.
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   835
        first = humongous_obj_allocate_find_first(num_regions, word_size);
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   836
      }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   837
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   838
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   839
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   840
  HeapWord* result = NULL;
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   841
  if (first != G1_NULL_HRS_INDEX) {
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   842
    result =
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   843
      humongous_obj_allocate_initialize_regions(first, num_regions, word_size);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   844
    assert(result != NULL, "it should always return a valid result");
10671
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
   845
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
   846
    // A successful humongous object allocation changes the used space
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
   847
    // information of the old generation so we need to recalculate the
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
   848
    // sizes and update the jstat counters here.
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
   849
    g1mm()->update_sizes();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   850
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   851
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   852
  verify_region_sets_optional();
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   853
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   854
  return result;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   855
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   856
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   857
HeapWord* G1CollectedHeap::allocate_new_tlab(size_t word_size) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   858
  assert_heap_not_locked_and_not_at_safepoint();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   859
  assert(!isHumongous(word_size), "we do not allow humongous TLABs");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   860
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   861
  unsigned int dummy_gc_count_before;
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   862
  int dummy_gclocker_retry_count = 0;
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   863
  return attempt_allocation(word_size, &dummy_gc_count_before, &dummy_gclocker_retry_count);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   864
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   865
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   866
HeapWord*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   867
G1CollectedHeap::mem_allocate(size_t word_size,
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   868
                              bool*  gc_overhead_limit_was_exceeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   869
  assert_heap_not_locked_and_not_at_safepoint();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   870
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
   871
  // Loop until the allocation is satisfied, or unsatisfied after GC.
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   872
  for (int try_count = 1, gclocker_retry_count = 0; /* we'll return */; try_count += 1) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   873
    unsigned int gc_count_before;
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   874
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   875
    HeapWord* result = NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   876
    if (!isHumongous(word_size)) {
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   877
      result = attempt_allocation(word_size, &gc_count_before, &gclocker_retry_count);
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   878
    } else {
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   879
      result = attempt_allocation_humongous(word_size, &gc_count_before, &gclocker_retry_count);
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   880
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   881
    if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   882
      return result;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   883
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   884
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   885
    // Create the garbage collection operation...
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   886
    VM_G1CollectForAllocation op(gc_count_before, word_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   887
    // ...and get the VM thread to execute it.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   888
    VMThread::execute(&op);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   889
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   890
    if (op.prologue_succeeded() && op.pause_succeeded()) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   891
      // If the operation was successful we'll return the result even
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   892
      // if it is NULL. If the allocation attempt failed immediately
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   893
      // after a Full GC, it's unlikely we'll be able to allocate now.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   894
      HeapWord* result = op.result();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   895
      if (result != NULL && !isHumongous(word_size)) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   896
        // Allocations that take place on VM operations do not do any
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   897
        // card dirtying and we have to do it here. We only have to do
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   898
        // this for non-humongous allocations, though.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   899
        dirty_young_block(result, word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   900
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   901
      return result;
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   902
    } else {
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   903
      if (gclocker_retry_count > GCLockerRetryAllocationCount) {
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   904
        return NULL;
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   905
      }
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   906
      assert(op.result() == NULL,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   907
             "the result should be NULL if the VM op did not succeed");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   908
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   909
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   910
    // Give a warning if we seem to be looping forever.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   911
    if ((QueuedAllocationWarningCount > 0) &&
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   912
        (try_count % QueuedAllocationWarningCount == 0)) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   913
      warning("G1CollectedHeap::mem_allocate retries %d times", try_count);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   914
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   915
  }
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   916
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   917
  ShouldNotReachHere();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   918
  return NULL;
1374
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
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   921
HeapWord* G1CollectedHeap::attempt_allocation_slow(size_t word_size,
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   922
                                           unsigned int *gc_count_before_ret,
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   923
                                           int* gclocker_retry_count_ret) {
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   924
  // Make sure you read the note in attempt_allocation_humongous().
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   925
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   926
  assert_heap_not_locked_and_not_at_safepoint();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   927
  assert(!isHumongous(word_size), "attempt_allocation_slow() should not "
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   928
         "be called for humongous allocation requests");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   929
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   930
  // We should only get here after the first-level allocation attempt
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   931
  // (attempt_allocation()) failed to allocate.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   932
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   933
  // We will loop until a) we manage to successfully perform the
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   934
  // allocation or b) we successfully schedule a collection which
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   935
  // fails to perform the allocation. b) is the only case when we'll
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   936
  // return NULL.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   937
  HeapWord* result = NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   938
  for (int try_count = 1; /* we'll return */; try_count += 1) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   939
    bool should_try_gc;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   940
    unsigned int gc_count_before;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   941
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   942
    {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   943
      MutexLockerEx x(Heap_lock);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   944
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   945
      result = _mutator_alloc_region.attempt_allocation_locked(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   946
                                                      false /* bot_updates */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   947
      if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   948
        return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   949
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   950
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   951
      // If we reach here, attempt_allocation_locked() above failed to
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   952
      // allocate a new region. So the mutator alloc region should be NULL.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   953
      assert(_mutator_alloc_region.get() == NULL, "only way to get here");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   954
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   955
      if (GC_locker::is_active_and_needs_gc()) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   956
        if (g1_policy()->can_expand_young_list()) {
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   957
          // No need for an ergo verbose message here,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   958
          // can_expand_young_list() does this when it returns true.
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   959
          result = _mutator_alloc_region.attempt_allocation_force(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   960
                                                      false /* bot_updates */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   961
          if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   962
            return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   963
          }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   964
        }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   965
        should_try_gc = false;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   966
      } else {
12778
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   967
        // The GCLocker may not be active but the GCLocker initiated
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   968
        // GC may not yet have been performed (GCLocker::needs_gc()
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   969
        // returns true). In this case we do not try this GC and
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   970
        // wait until the GCLocker initiated GC is performed, and
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   971
        // then retry the allocation.
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   972
        if (GC_locker::needs_gc()) {
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   973
          should_try_gc = false;
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   974
        } else {
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   975
          // Read the GC count while still holding the Heap_lock.
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   976
          gc_count_before = total_collections();
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   977
          should_try_gc = true;
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   978
        }
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   979
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   980
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   981
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   982
    if (should_try_gc) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   983
      bool succeeded;
19549
60e5c7cafdca 8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents: 19341
diff changeset
   984
      result = do_collection_pause(word_size, gc_count_before, &succeeded,
60e5c7cafdca 8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents: 19341
diff changeset
   985
          GCCause::_g1_inc_collection_pause);
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   986
      if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   987
        assert(succeeded, "only way to get back a non-NULL result");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   988
        return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   989
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   990
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   991
      if (succeeded) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   992
        // If we get here we successfully scheduled a collection which
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   993
        // failed to allocate. No point in trying to allocate
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   994
        // further. We'll just return NULL.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   995
        MutexLockerEx x(Heap_lock);
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
   996
        *gc_count_before_ret = total_collections();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   997
        return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   998
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   999
    } else {
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1000
      if (*gclocker_retry_count_ret > GCLockerRetryAllocationCount) {
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1001
        MutexLockerEx x(Heap_lock);
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1002
        *gc_count_before_ret = total_collections();
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1003
        return NULL;
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1004
      }
12778
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1005
      // The GCLocker is either active or the GCLocker initiated
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1006
      // GC has not yet been performed. Stall until it is and
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1007
      // then retry the allocation.
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1008
      GC_locker::stall_until_clear();
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1009
      (*gclocker_retry_count_ret) += 1;
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1010
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1011
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1012
    // We can reach here if we were unsuccessful in scheduling a
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1013
    // collection (because another thread beat us to it) or if we were
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1014
    // stalled due to the GC locker. In either can we should retry the
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1015
    // allocation attempt in case another thread successfully
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1016
    // performed a collection and reclaimed enough space. We do the
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1017
    // first attempt (without holding the Heap_lock) here and the
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1018
    // follow-on attempt will be at the start of the next loop
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1019
    // iteration (after taking the Heap_lock).
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1020
    result = _mutator_alloc_region.attempt_allocation(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1021
                                                      false /* bot_updates */);
12227
371690c4f281 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 11756
diff changeset
  1022
    if (result != NULL) {
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1023
      return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1024
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1025
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1026
    // Give a warning if we seem to be looping forever.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1027
    if ((QueuedAllocationWarningCount > 0) &&
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1028
        (try_count % QueuedAllocationWarningCount == 0)) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1029
      warning("G1CollectedHeap::attempt_allocation_slow() "
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1030
              "retries %d times", try_count);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1031
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1032
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1033
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1034
  ShouldNotReachHere();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1035
  return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1036
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1037
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1038
HeapWord* G1CollectedHeap::attempt_allocation_humongous(size_t word_size,
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1039
                                          unsigned int * gc_count_before_ret,
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1040
                                          int* gclocker_retry_count_ret) {
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1041
  // The structure of this method has a lot of similarities to
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1042
  // attempt_allocation_slow(). The reason these two were not merged
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1043
  // into a single one is that such a method would require several "if
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1044
  // allocation is not humongous do this, otherwise do that"
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1045
  // conditional paths which would obscure its flow. In fact, an early
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1046
  // version of this code did use a unified method which was harder to
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1047
  // follow and, as a result, it had subtle bugs that were hard to
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1048
  // track down. So keeping these two methods separate allows each to
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1049
  // be more readable. It will be good to keep these two in sync as
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1050
  // much as possible.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1051
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1052
  assert_heap_not_locked_and_not_at_safepoint();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1053
  assert(isHumongous(word_size), "attempt_allocation_humongous() "
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1054
         "should only be called for humongous allocations");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1055
11581
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11580
diff changeset
  1056
  // Humongous objects can exhaust the heap quickly, so we should check if we
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11580
diff changeset
  1057
  // need to start a marking cycle at each humongous object allocation. We do
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11580
diff changeset
  1058
  // the check before we do the actual allocation. The reason for doing it
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11580
diff changeset
  1059
  // before the allocation is that we avoid having to keep track of the newly
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11580
diff changeset
  1060
  // allocated memory while we do a GC.
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  1061
  if (g1_policy()->need_to_start_conc_mark("concurrent humongous allocation",
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  1062
                                           word_size)) {
11581
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11580
diff changeset
  1063
    collect(GCCause::_g1_humongous_allocation);
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11580
diff changeset
  1064
  }
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11580
diff changeset
  1065
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1066
  // We will loop until a) we manage to successfully perform the
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1067
  // allocation or b) we successfully schedule a collection which
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1068
  // fails to perform the allocation. b) is the only case when we'll
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1069
  // return NULL.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1070
  HeapWord* result = NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1071
  for (int try_count = 1; /* we'll return */; try_count += 1) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1072
    bool should_try_gc;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1073
    unsigned int gc_count_before;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1074
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1075
    {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1076
      MutexLockerEx x(Heap_lock);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1077
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1078
      // Given that humongous objects are not allocated in young
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1079
      // regions, we'll first try to do the allocation without doing a
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1080
      // collection hoping that there's enough space in the heap.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1081
      result = humongous_obj_allocate(word_size);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1082
      if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1083
        return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1084
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1085
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1086
      if (GC_locker::is_active_and_needs_gc()) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1087
        should_try_gc = false;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1088
      } else {
12778
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1089
         // The GCLocker may not be active but the GCLocker initiated
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1090
        // GC may not yet have been performed (GCLocker::needs_gc()
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1091
        // returns true). In this case we do not try this GC and
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1092
        // wait until the GCLocker initiated GC is performed, and
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1093
        // then retry the allocation.
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1094
        if (GC_locker::needs_gc()) {
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1095
          should_try_gc = false;
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1096
        } else {
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1097
          // Read the GC count while still holding the Heap_lock.
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1098
          gc_count_before = total_collections();
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1099
          should_try_gc = true;
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1100
        }
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1101
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1102
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1103
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1104
    if (should_try_gc) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1105
      // If we failed to allocate the humongous object, we should try to
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1106
      // do a collection pause (if we're allowed) in case it reclaims
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1107
      // enough space for the allocation to succeed after the pause.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1108
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1109
      bool succeeded;
19549
60e5c7cafdca 8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents: 19341
diff changeset
  1110
      result = do_collection_pause(word_size, gc_count_before, &succeeded,
60e5c7cafdca 8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents: 19341
diff changeset
  1111
          GCCause::_g1_humongous_allocation);
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1112
      if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1113
        assert(succeeded, "only way to get back a non-NULL result");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1114
        return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1115
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1116
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1117
      if (succeeded) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1118
        // If we get here we successfully scheduled a collection which
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1119
        // failed to allocate. No point in trying to allocate
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1120
        // further. We'll just return NULL.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1121
        MutexLockerEx x(Heap_lock);
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  1122
        *gc_count_before_ret = total_collections();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1123
        return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1124
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1125
    } else {
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1126
      if (*gclocker_retry_count_ret > GCLockerRetryAllocationCount) {
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1127
        MutexLockerEx x(Heap_lock);
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1128
        *gc_count_before_ret = total_collections();
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1129
        return NULL;
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1130
      }
12778
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1131
      // The GCLocker is either active or the GCLocker initiated
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1132
      // GC has not yet been performed. Stall until it is and
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1133
      // then retry the allocation.
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1134
      GC_locker::stall_until_clear();
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1135
      (*gclocker_retry_count_ret) += 1;
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1136
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1137
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1138
    // We can reach here if we were unsuccessful in scheduling a
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1139
    // collection (because another thread beat us to it) or if we were
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1140
    // stalled due to the GC locker. In either can we should retry the
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1141
    // allocation attempt in case another thread successfully
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1142
    // performed a collection and reclaimed enough space.  Give a
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1143
    // warning if we seem to be looping forever.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1144
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1145
    if ((QueuedAllocationWarningCount > 0) &&
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1146
        (try_count % QueuedAllocationWarningCount == 0)) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1147
      warning("G1CollectedHeap::attempt_allocation_humongous() "
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1148
              "retries %d times", try_count);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1149
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1150
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1151
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1152
  ShouldNotReachHere();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1153
  return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1154
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1155
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1156
HeapWord* G1CollectedHeap::attempt_allocation_at_safepoint(size_t word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1157
                                       bool expect_null_mutator_alloc_region) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1158
  assert_at_safepoint(true /* should_be_vm_thread */);
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1159
  assert(_mutator_alloc_region.get() == NULL ||
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1160
                                             !expect_null_mutator_alloc_region,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1161
         "the current alloc region was unexpectedly found to be non-NULL");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1162
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1163
  if (!isHumongous(word_size)) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1164
    return _mutator_alloc_region.attempt_allocation_locked(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1165
                                                      false /* bot_updates */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1166
  } else {
11576
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1167
    HeapWord* result = humongous_obj_allocate(word_size);
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1168
    if (result != NULL && g1_policy()->need_to_start_conc_mark("STW humongous allocation")) {
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1169
      g1_policy()->set_initiate_conc_mark_if_possible();
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1170
    }
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1171
    return result;
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1172
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1173
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1174
  ShouldNotReachHere();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1175
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1176
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1177
class PostMCRemSetClearClosure: public HeapRegionClosure {
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1178
  G1CollectedHeap* _g1h;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1179
  ModRefBarrierSet* _mr_bs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1180
public:
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1181
  PostMCRemSetClearClosure(G1CollectedHeap* g1h, ModRefBarrierSet* mr_bs) :
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  1182
    _g1h(g1h), _mr_bs(mr_bs) {}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  1183
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1184
  bool doHeapRegion(HeapRegion* r) {
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  1185
    HeapRegionRemSet* hrrs = r->rem_set();
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  1186
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1187
    if (r->continuesHumongous()) {
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  1188
      // We'll assert that the strong code root list and RSet is empty
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  1189
      assert(hrrs->strong_code_roots_list_length() == 0, "sanity");
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  1190
      assert(hrrs->occupied() == 0, "RSet should be empty");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1191
      return false;
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1192
    }
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  1193
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1194
    _g1h->reset_gc_time_stamps(r);
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  1195
    hrrs->clear();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1196
    // You might think here that we could clear just the cards
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1197
    // corresponding to the used region.  But no: if we leave a dirty card
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1198
    // in a region we might allocate into, then it would prevent that card
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1199
    // from being enqueued, and cause it to be missed.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1200
    // Re: the performance cost: we shouldn't be doing full GC anyway!
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1201
    _mr_bs->clear(MemRegion(r->bottom(), r->end()));
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  1202
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1203
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1204
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1205
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1206
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1207
void G1CollectedHeap::clear_rsets_post_compaction() {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1208
  PostMCRemSetClearClosure rs_clear(this, mr_bs());
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1209
  heap_region_iterate(&rs_clear);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1210
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1211
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1212
class RebuildRSOutOfRegionClosure: public HeapRegionClosure {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1213
  G1CollectedHeap*   _g1h;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1214
  UpdateRSOopClosure _cl;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1215
  int                _worker_i;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1216
public:
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1217
  RebuildRSOutOfRegionClosure(G1CollectedHeap* g1, int worker_i = 0) :
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  1218
    _cl(g1->g1_rem_set(), worker_i),
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1219
    _worker_i(worker_i),
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1220
    _g1h(g1)
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1221
  { }
7385
eaca4b61b374 6978187: G1: assert(ParallelGCThreads> 1 || n_yielded() == _hrrs->occupied()) strikes again
johnc
parents: 6980
diff changeset
  1222
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1223
  bool doHeapRegion(HeapRegion* r) {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1224
    if (!r->continuesHumongous()) {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1225
      _cl.set_from(r);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1226
      r->oop_iterate(&_cl);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1227
    }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1228
    return false;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1229
  }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1230
};
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1231
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1232
class ParRebuildRSTask: public AbstractGangTask {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1233
  G1CollectedHeap* _g1;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1234
public:
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1235
  ParRebuildRSTask(G1CollectedHeap* g1)
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1236
    : AbstractGangTask("ParRebuildRSTask"),
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1237
      _g1(g1)
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1238
  { }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1239
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  1240
  void work(uint worker_id) {
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  1241
    RebuildRSOutOfRegionClosure rebuild_rs(_g1, worker_id);
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  1242
    _g1->heap_region_par_iterate_chunked(&rebuild_rs, worker_id,
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  1243
                                          _g1->workers()->active_workers(),
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1244
                                         HeapRegion::RebuildRSClaimValue);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1245
  }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1246
};
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1247
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1248
class PostCompactionPrinterClosure: public HeapRegionClosure {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1249
private:
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1250
  G1HRPrinter* _hr_printer;
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1251
public:
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1252
  bool doHeapRegion(HeapRegion* hr) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1253
    assert(!hr->is_young(), "not expecting to find young regions");
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1254
    // We only generate output for non-empty regions.
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1255
    if (!hr->is_empty()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1256
      if (!hr->isHumongous()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1257
        _hr_printer->post_compaction(hr, G1HRPrinter::Old);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1258
      } else if (hr->startsHumongous()) {
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1259
        if (hr->region_num() == 1) {
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1260
          // single humongous region
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1261
          _hr_printer->post_compaction(hr, G1HRPrinter::SingleHumongous);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1262
        } else {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1263
          _hr_printer->post_compaction(hr, G1HRPrinter::StartsHumongous);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1264
        }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1265
      } else {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1266
        assert(hr->continuesHumongous(), "only way to get here");
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1267
        _hr_printer->post_compaction(hr, G1HRPrinter::ContinuesHumongous);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1268
      }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1269
    }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1270
    return false;
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1271
  }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1272
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1273
  PostCompactionPrinterClosure(G1HRPrinter* hr_printer)
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1274
    : _hr_printer(hr_printer) { }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1275
};
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1276
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1277
void G1CollectedHeap::print_hrs_post_compaction() {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1278
  PostCompactionPrinterClosure cl(hr_printer());
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1279
  heap_region_iterate(&cl);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1280
}
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1281
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1282
bool G1CollectedHeap::do_collection(bool explicit_gc,
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1283
                                    bool clear_all_soft_refs,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1284
                                    size_t word_size) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1285
  assert_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1286
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  1287
  if (GC_locker::check_active_before_gc()) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1288
    return false;
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  1289
  }
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  1290
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1291
  STWGCTimer* gc_timer = G1MarkSweep::gc_timer();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1292
  gc_timer->register_gc_start(os::elapsed_counter());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1293
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1294
  SerialOldTracer* gc_tracer = G1MarkSweep::gc_tracer();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1295
  gc_tracer->report_gc_start(gc_cause(), gc_timer->gc_start());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1296
7896
08aadd7aa3ee 6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents: 7659
diff changeset
  1297
  SvcGCMarker sgcm(SvcGCMarker::FULL);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1298
  ResourceMark rm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1299
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11455
diff changeset
  1300
  print_heap_before_gc();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1301
  trace_heap_before_gc(gc_tracer);
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1302
17109
90e6c31bbbe4 8008966: NPG: Inefficient Metaspace counter functions cause large young GC regressions
jmasa
parents: 17108
diff changeset
  1303
  size_t metadata_prev_used = MetaspaceAux::allocated_used_bytes();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  1304
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  1305
  HRSPhaseSetter x(HRSPhaseFullGC);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1306
  verify_region_sets_optional();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1307
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1308
  const bool do_clear_all_soft_refs = clear_all_soft_refs ||
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1309
                           collector_policy()->should_clear_all_soft_refs();
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1310
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1311
  ClearedAllSoftRefs casr(do_clear_all_soft_refs, collector_policy());
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1312
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1313
  {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1314
    IsGCActiveMark x;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1315
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1316
    // Timing
12511
24c75d495b2f 7163848: G1: Log GC Cause for a GC
brutisso
parents: 12508
diff changeset
  1317
    assert(gc_cause() != GCCause::_java_lang_system_gc || explicit_gc, "invariant");
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12271
diff changeset
  1318
    gclog_or_tty->date_stamp(G1Log::fine() && PrintGCDateStamps);
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12271
diff changeset
  1319
    TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty);
12511
24c75d495b2f 7163848: G1: Log GC Cause for a GC
brutisso
parents: 12508
diff changeset
  1320
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1321
    {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1322
      GCTraceTime t(GCCauseString("Full GC", gc_cause()), G1Log::fine(), true, NULL);
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1323
      TraceCollectorStats tcs(g1mm()->full_collection_counters());
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1324
      TraceMemoryManagerStats tms(true /* fullGC */, gc_cause());
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1325
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1326
      double start = os::elapsedTime();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1327
      g1_policy()->record_full_collection_start();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1328
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1329
      // Note: When we have a more flexible GC logging framework that
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1330
      // allows us to add optional attributes to a GC log record we
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1331
      // could consider timing and reporting how long we wait in the
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1332
      // following two methods.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1333
      wait_while_free_regions_coming();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1334
      // If we start the compaction before the CM threads finish
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1335
      // scanning the root regions we might trip them over as we'll
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1336
      // be moving objects / updating references. So let's wait until
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1337
      // they are done. By telling them to abort, they should complete
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1338
      // early.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1339
      _cm->root_regions()->abort();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1340
      _cm->root_regions()->wait_until_scan_finished();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1341
      append_secondary_free_list_if_not_empty_with_lock();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1342
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1343
      gc_prologue(true);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1344
      increment_total_collections(true /* full gc */);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1345
      increment_old_marking_cycles_started();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1346
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1347
      assert(used() == recalculate_used(), "Should be equal");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1348
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1349
      verify_before_gc();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1350
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1351
      pre_full_gc_dump(gc_timer);
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1352
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1353
      COMPILER2_PRESENT(DerivedPointerTable::clear());
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1354
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1355
      // Disable discovery and empty the discovered lists
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1356
      // for the CM ref processor.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1357
      ref_processor_cm()->disable_discovery();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1358
      ref_processor_cm()->abandon_partial_discovery();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1359
      ref_processor_cm()->verify_no_references_recorded();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1360
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1361
      // Abandon current iterations of concurrent marking and concurrent
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1362
      // refinement, if any are in progress. We have to do this before
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1363
      // wait_until_scan_finished() below.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1364
      concurrent_mark()->abort();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1365
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1366
      // Make sure we'll choose a new allocation region afterwards.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1367
      release_mutator_alloc_region();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1368
      abandon_gc_alloc_regions();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1369
      g1_rem_set()->cleanupHRRS();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1370
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1371
      // We should call this after we retire any currently active alloc
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1372
      // regions so that all the ALLOC / RETIRE events are generated
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1373
      // before the start GC event.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1374
      _hr_printer.start_gc(true /* full */, (size_t) total_collections());
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1375
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1376
      // We may have added regions to the current incremental collection
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1377
      // set between the last GC or pause and now. We need to clear the
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1378
      // incremental collection set and then start rebuilding it afresh
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1379
      // after this full GC.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1380
      abandon_collection_set(g1_policy()->inc_cset_head());
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1381
      g1_policy()->clear_incremental_cset();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1382
      g1_policy()->stop_incremental_cset_building();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1383
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1384
      tear_down_region_sets(false /* free_list_only */);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1385
      g1_policy()->set_gcs_are_young(true);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1386
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1387
      // See the comments in g1CollectedHeap.hpp and
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1388
      // G1CollectedHeap::ref_processing_init() about
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1389
      // how reference processing currently works in G1.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1390
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1391
      // Temporarily make discovery by the STW ref processor single threaded (non-MT).
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1392
      ReferenceProcessorMTDiscoveryMutator stw_rp_disc_ser(ref_processor_stw(), false);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1393
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1394
      // Temporarily clear the STW ref processor's _is_alive_non_header field.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1395
      ReferenceProcessorIsAliveMutator stw_rp_is_alive_null(ref_processor_stw(), NULL);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1396
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1397
      ref_processor_stw()->enable_discovery(true /*verify_disabled*/, true /*verify_no_refs*/);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1398
      ref_processor_stw()->setup_policy(do_clear_all_soft_refs);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1399
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1400
      // Do collection work
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1401
      {
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1402
        HandleMark hm;  // Discard invalid handles created during gc
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1403
        G1MarkSweep::invoke_at_safepoint(ref_processor_stw(), do_clear_all_soft_refs);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1404
      }
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1405
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1406
      assert(free_regions() == 0, "we should not have added any free regions");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1407
      rebuild_region_sets(false /* free_list_only */);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1408
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1409
      // Enqueue any discovered reference objects that have
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1410
      // not been removed from the discovered lists.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1411
      ref_processor_stw()->enqueue_discovered_references();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1412
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1413
      COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1414
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1415
      MemoryService::track_memory_usage();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1416
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1417
      assert(!ref_processor_stw()->discovery_enabled(), "Postcondition");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1418
      ref_processor_stw()->verify_no_references_recorded();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1419
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1420
      // Delete metaspaces for unloaded class loaders and clean up loader_data graph
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1421
      ClassLoaderDataGraph::purge();
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  1422
      MetaspaceAux::verify_metrics();
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1423
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1424
      // Note: since we've just done a full GC, concurrent
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1425
      // marking is no longer active. Therefore we need not
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1426
      // re-enable reference discovery for the CM ref processor.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1427
      // That will be done at the start of the next marking cycle.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1428
      assert(!ref_processor_cm()->discovery_enabled(), "Postcondition");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1429
      ref_processor_cm()->verify_no_references_recorded();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1430
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1431
      reset_gc_time_stamp();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1432
      // Since everything potentially moved, we will clear all remembered
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1433
      // sets, and clear all cards.  Later we will rebuild remembered
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1434
      // sets. We will also reset the GC time stamps of the regions.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1435
      clear_rsets_post_compaction();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1436
      check_gc_time_stamps();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1437
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1438
      // Resize the heap if necessary.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1439
      resize_if_necessary_after_full_collection(explicit_gc ? 0 : word_size);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1440
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1441
      if (_hr_printer.is_active()) {
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1442
        // We should do this after we potentially resize the heap so
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1443
        // that all the COMMIT / UNCOMMIT events are generated before
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1444
        // the end GC event.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1445
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1446
        print_hrs_post_compaction();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1447
        _hr_printer.end_gc(true /* full */, (size_t) total_collections());
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1448
      }
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1449
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  1450
      G1HotCardCache* hot_card_cache = _cg1r->hot_card_cache();
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  1451
      if (hot_card_cache->use_cache()) {
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  1452
        hot_card_cache->reset_card_counts();
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  1453
        hot_card_cache->reset_hot_cache();
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1454
      }
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1455
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1456
      // Rebuild remembered sets of all regions.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1457
      if (G1CollectedHeap::use_parallel_gc_threads()) {
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1458
        uint n_workers =
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1459
          AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(),
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1460
                                                  workers()->active_workers(),
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1461
                                                  Threads::number_of_non_daemon_threads());
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1462
        assert(UseDynamicNumberOfGCThreads ||
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1463
               n_workers == workers()->total_workers(),
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1464
               "If not dynamic should be using all the  workers");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1465
        workers()->set_active_workers(n_workers);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1466
        // Set parallel threads in the heap (_n_par_threads) only
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1467
        // before a parallel phase and always reset it to 0 after
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1468
        // the phase so that the number of parallel threads does
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1469
        // no get carried forward to a serial phase where there
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1470
        // may be code that is "possibly_parallel".
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1471
        set_par_threads(n_workers);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1472
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1473
        ParRebuildRSTask rebuild_rs_task(this);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1474
        assert(check_heap_region_claim_values(
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1475
               HeapRegion::InitialClaimValue), "sanity check");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1476
        assert(UseDynamicNumberOfGCThreads ||
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1477
               workers()->active_workers() == workers()->total_workers(),
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1478
               "Unless dynamic should use total workers");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1479
        // Use the most recent number of  active workers
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1480
        assert(workers()->active_workers() > 0,
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1481
               "Active workers not properly set");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1482
        set_par_threads(workers()->active_workers());
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1483
        workers()->run_task(&rebuild_rs_task);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1484
        set_par_threads(0);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1485
        assert(check_heap_region_claim_values(
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1486
               HeapRegion::RebuildRSClaimValue), "sanity check");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1487
        reset_heap_region_claim_values();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1488
      } else {
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1489
        RebuildRSOutOfRegionClosure rebuild_rs(this);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1490
        heap_region_iterate(&rebuild_rs);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1491
      }
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1492
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  1493
      // Rebuild the strong code root lists for each region
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  1494
      rebuild_strong_code_roots();
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  1495
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1496
      if (true) { // FIXME
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1497
        MetaspaceGC::compute_new_size();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1498
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1499
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  1500
#ifdef TRACESPINNING
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1501
      ParallelTaskTerminator::print_termination_counts();
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  1502
#endif
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  1503
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1504
      // Discard all rset updates
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1505
      JavaThread::dirty_card_queue_set().abandon_logs();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1506
      assert(!G1DeferredRSUpdate
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1507
             || (G1DeferredRSUpdate &&
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1508
                (dirty_card_queue_set().completed_buffers_num() == 0)), "Should not be any");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1509
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1510
      _young_list->reset_sampled_info();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1511
      // At this point there should be no regions in the
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1512
      // entire heap tagged as young.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1513
      assert(check_young_list_empty(true /* check_heap */),
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1514
             "young list should be empty at this point");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1515
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1516
      // Update the number of full collections that have been completed.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1517
      increment_old_marking_cycles_completed(false /* concurrent */);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1518
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1519
      _hrs.verify_optional();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1520
      verify_region_sets_optional();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1521
17855
9d0719d7bb85 8015244: G1: Verification after a full GC is incorrectly placed.
johnc
parents: 17854
diff changeset
  1522
      verify_after_gc();
9d0719d7bb85 8015244: G1: Verification after a full GC is incorrectly placed.
johnc
parents: 17854
diff changeset
  1523
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1524
      // Start a new incremental collection set for the next pause
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1525
      assert(g1_policy()->collection_set() == NULL, "must be");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1526
      g1_policy()->start_incremental_cset_building();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1527
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1528
      // Clear the _cset_fast_test bitmap in anticipation of adding
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1529
      // regions to the incremental collection set for the next
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1530
      // evacuation pause.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1531
      clear_cset_fast_test();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1532
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1533
      init_mutator_alloc_region();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1534
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1535
      double end = os::elapsedTime();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1536
      g1_policy()->record_full_collection_end();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1537
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1538
      if (G1Log::fine()) {
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1539
        g1_policy()->print_heap_transition();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1540
      }
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1541
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1542
      // We must call G1MonitoringSupport::update_sizes() in the same scoping level
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1543
      // as an active TraceMemoryManagerStats object (i.e. before the destructor for the
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1544
      // TraceMemoryManagerStats is called) so that the G1 memory pools are updated
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1545
      // before any GC notifications are raised.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1546
      g1mm()->update_sizes();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1547
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1548
      gc_epilogue(true);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1549
    }
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1550
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1551
    if (G1Log::finer()) {
17396
4d281f3a57bf 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 17327
diff changeset
  1552
      g1_policy()->print_detailed_heap_transition(true /* full */);
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1553
    }
12935
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  1554
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  1555
    print_heap_after_gc();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1556
    trace_heap_after_gc(gc_tracer);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1557
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1558
    post_full_gc_dump(gc_timer);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1559
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1560
    gc_timer->register_gc_end(os::elapsed_counter());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1561
    gc_tracer->report_gc_end(gc_timer->gc_end(), gc_timer->time_partitions());
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1562
  }
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1563
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1564
  return true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1565
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1566
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1567
void G1CollectedHeap::do_full_collection(bool clear_all_soft_refs) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1568
  // do_collection() will return whether it succeeded in performing
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1569
  // the GC. Currently, there is no facility on the
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1570
  // do_full_collection() API to notify the caller than the collection
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1571
  // did not succeed (e.g., because it was locked out by the GC
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1572
  // locker). So, right now, we'll ignore the return value.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1573
  bool dummy = do_collection(true,                /* explicit_gc */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1574
                             clear_all_soft_refs,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1575
                             0                    /* word_size */);
1374
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1578
// This code is mostly copied from TenuredGeneration.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1579
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1580
G1CollectedHeap::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1581
resize_if_necessary_after_full_collection(size_t word_size) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1582
  assert(MinHeapFreeRatio <= MaxHeapFreeRatio, "sanity check");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1583
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1584
  // Include the current allocation, if any, and bytes that will be
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1585
  // pre-allocated to support collections, as "used".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1586
  const size_t used_after_gc = used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1587
  const size_t capacity_after_gc = capacity();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1588
  const size_t free_after_gc = capacity_after_gc - used_after_gc;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1589
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1590
  // This is enforced in arguments.cpp.
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1591
  assert(MinHeapFreeRatio <= MaxHeapFreeRatio,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1592
         "otherwise the code below doesn't make sense");
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1593
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1594
  // We don't have floating point command-line arguments
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1595
  const double minimum_free_percentage = (double) MinHeapFreeRatio / 100.0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1596
  const double maximum_used_percentage = 1.0 - minimum_free_percentage;
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1597
  const double maximum_free_percentage = (double) MaxHeapFreeRatio / 100.0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1598
  const double minimum_used_percentage = 1.0 - maximum_free_percentage;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1599
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1600
  const size_t min_heap_size = collector_policy()->min_heap_byte_size();
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1601
  const size_t max_heap_size = collector_policy()->max_heap_byte_size();
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1602
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1603
  // We have to be careful here as these two calculations can overflow
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1604
  // 32-bit size_t's.
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1605
  double used_after_gc_d = (double) used_after_gc;
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1606
  double minimum_desired_capacity_d = used_after_gc_d / maximum_used_percentage;
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1607
  double maximum_desired_capacity_d = used_after_gc_d / minimum_used_percentage;
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1608
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1609
  // Let's make sure that they are both under the max heap size, which
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1610
  // by default will make them fit into a size_t.
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1611
  double desired_capacity_upper_bound = (double) max_heap_size;
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1612
  minimum_desired_capacity_d = MIN2(minimum_desired_capacity_d,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1613
                                    desired_capacity_upper_bound);
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1614
  maximum_desired_capacity_d = MIN2(maximum_desired_capacity_d,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1615
                                    desired_capacity_upper_bound);
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1616
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1617
  // We can now safely turn them into size_t's.
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1618
  size_t minimum_desired_capacity = (size_t) minimum_desired_capacity_d;
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1619
  size_t maximum_desired_capacity = (size_t) maximum_desired_capacity_d;
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1620
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1621
  // This assert only makes sense here, before we adjust them
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1622
  // with respect to the min and max heap size.
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1623
  assert(minimum_desired_capacity <= maximum_desired_capacity,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1624
         err_msg("minimum_desired_capacity = "SIZE_FORMAT", "
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1625
                 "maximum_desired_capacity = "SIZE_FORMAT,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1626
                 minimum_desired_capacity, maximum_desired_capacity));
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1627
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1628
  // Should not be greater than the heap max size. No need to adjust
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1629
  // it with respect to the heap min size as it's a lower bound (i.e.,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1630
  // we'll try to make the capacity larger than it, not smaller).
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1631
  minimum_desired_capacity = MIN2(minimum_desired_capacity, max_heap_size);
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1632
  // Should not be less than the heap min size. No need to adjust it
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1633
  // with respect to the heap max size as it's an upper bound (i.e.,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1634
  // we'll try to make the capacity smaller than it, not greater).
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1635
  maximum_desired_capacity =  MAX2(maximum_desired_capacity, min_heap_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1636
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1637
  if (capacity_after_gc < minimum_desired_capacity) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1638
    // Don't expand unless it's significant
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1639
    size_t expand_bytes = minimum_desired_capacity - capacity_after_gc;
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1640
    ergo_verbose4(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1641
                  "attempt heap expansion",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1642
                  ergo_format_reason("capacity lower than "
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1643
                                     "min desired capacity after Full GC")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1644
                  ergo_format_byte("capacity")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1645
                  ergo_format_byte("occupancy")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1646
                  ergo_format_byte_perc("min desired capacity"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1647
                  capacity_after_gc, used_after_gc,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1648
                  minimum_desired_capacity, (double) MinHeapFreeRatio);
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1649
    expand(expand_bytes);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1650
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1651
    // No expansion, now see if we want to shrink
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1652
  } else if (capacity_after_gc > maximum_desired_capacity) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1653
    // Capacity too large, compute shrinking size
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1654
    size_t shrink_bytes = capacity_after_gc - maximum_desired_capacity;
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1655
    ergo_verbose4(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1656
                  "attempt heap shrinking",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1657
                  ergo_format_reason("capacity higher than "
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1658
                                     "max desired capacity after Full GC")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1659
                  ergo_format_byte("capacity")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1660
                  ergo_format_byte("occupancy")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1661
                  ergo_format_byte_perc("max desired capacity"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1662
                  capacity_after_gc, used_after_gc,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1663
                  maximum_desired_capacity, (double) MaxHeapFreeRatio);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1664
    shrink(shrink_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1665
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1666
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1667
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1668
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1669
HeapWord*
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1670
G1CollectedHeap::satisfy_failed_allocation(size_t word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1671
                                           bool* succeeded) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1672
  assert_at_safepoint(true /* should_be_vm_thread */);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1673
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1674
  *succeeded = true;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1675
  // Let's attempt the allocation first.
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1676
  HeapWord* result =
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1677
    attempt_allocation_at_safepoint(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1678
                                 false /* expect_null_mutator_alloc_region */);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1679
  if (result != NULL) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1680
    assert(*succeeded, "sanity");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1681
    return result;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1682
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1683
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1684
  // In a G1 heap, we're supposed to keep allocation from failing by
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1685
  // incremental pauses.  Therefore, at least for now, we'll favor
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1686
  // expansion over collection.  (This might change in the future if we can
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1687
  // do something smarter than full collection to satisfy a failed alloc.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1688
  result = expand_and_allocate(word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1689
  if (result != NULL) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1690
    assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1691
    return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1692
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1693
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1694
  // Expansion didn't work, we'll try to do a Full GC.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1695
  bool gc_succeeded = do_collection(false, /* explicit_gc */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1696
                                    false, /* clear_all_soft_refs */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1697
                                    word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1698
  if (!gc_succeeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1699
    *succeeded = false;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1700
    return NULL;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1701
  }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1702
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1703
  // Retry the allocation
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1704
  result = attempt_allocation_at_safepoint(word_size,
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1705
                                  true /* expect_null_mutator_alloc_region */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1706
  if (result != NULL) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1707
    assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1708
    return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1709
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1710
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1711
  // Then, try a Full GC that will collect all soft references.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1712
  gc_succeeded = do_collection(false, /* explicit_gc */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1713
                               true,  /* clear_all_soft_refs */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1714
                               word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1715
  if (!gc_succeeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1716
    *succeeded = false;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1717
    return NULL;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1718
  }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1719
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1720
  // Retry the allocation once more
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1721
  result = attempt_allocation_at_safepoint(word_size,
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1722
                                  true /* expect_null_mutator_alloc_region */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1723
  if (result != NULL) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1724
    assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1725
    return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1726
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1727
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1728
  assert(!collector_policy()->should_clear_all_soft_refs(),
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1729
         "Flag should have been handled and cleared prior to this point");
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1730
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1731
  // What else?  We might try synchronous finalization later.  If the total
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1732
  // space available is large enough for the allocation, then a more
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1733
  // complete compaction phase than we've tried so far might be
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1734
  // appropriate.
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1735
  assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1736
  return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1737
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1738
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1739
// Attempting to expand the heap sufficiently
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1740
// to support an allocation of the given "word_size".  If
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1741
// successful, perform the allocation and return the address of the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1742
// allocated block, or else "NULL".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1743
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1744
HeapWord* G1CollectedHeap::expand_and_allocate(size_t word_size) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1745
  assert_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1746
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1747
  verify_region_sets_optional();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1748
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1749
  size_t expand_bytes = MAX2(word_size * HeapWordSize, MinHeapDeltaBytes);
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1750
  ergo_verbose1(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1751
                "attempt heap expansion",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1752
                ergo_format_reason("allocation request failed")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1753
                ergo_format_byte("allocation request"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1754
                word_size * HeapWordSize);
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1755
  if (expand(expand_bytes)) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1756
    _hrs.verify_optional();
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1757
    verify_region_sets_optional();
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1758
    return attempt_allocation_at_safepoint(word_size,
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1759
                                 false /* expect_null_mutator_alloc_region */);
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1760
  }
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1761
  return NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1762
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1763
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1764
void G1CollectedHeap::update_committed_space(HeapWord* old_end,
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1765
                                             HeapWord* new_end) {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1766
  assert(old_end != new_end, "don't call this otherwise");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1767
  assert((HeapWord*) _g1_storage.high() == new_end, "invariant");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1768
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1769
  // Update the committed mem region.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1770
  _g1_committed.set_end(new_end);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1771
  // Tell the card table about the update.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1772
  Universe::heap()->barrier_set()->resize_covered_region(_g1_committed);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1773
  // Tell the BOT about the update.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1774
  _bot_shared->resize(_g1_committed.word_size());
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  1775
  // Tell the hot card cache about the update
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  1776
  _cg1r->hot_card_cache()->resize_card_counts(capacity());
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1777
}
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1778
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1779
bool G1CollectedHeap::expand(size_t expand_bytes) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1780
  size_t old_mem_size = _g1_storage.committed_size();
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1781
  size_t aligned_expand_bytes = ReservedSpace::page_align_size_up(expand_bytes);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1782
  aligned_expand_bytes = align_size_up(aligned_expand_bytes,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1783
                                       HeapRegion::GrainBytes);
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1784
  ergo_verbose2(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1785
                "expand the heap",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1786
                ergo_format_byte("requested expansion amount")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1787
                ergo_format_byte("attempted expansion amount"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1788
                expand_bytes, aligned_expand_bytes);
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1789
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1790
  // First commit the memory.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1791
  HeapWord* old_end = (HeapWord*) _g1_storage.high();
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1792
  bool successful = _g1_storage.expand_by(aligned_expand_bytes);
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1793
  if (successful) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1794
    // Then propagate this update to the necessary data structures.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1795
    HeapWord* new_end = (HeapWord*) _g1_storage.high();
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1796
    update_committed_space(old_end, new_end);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1797
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1798
    FreeRegionList expansion_list("Local Expansion List");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1799
    MemRegion mr = _hrs.expand_by(old_end, new_end, &expansion_list);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1800
    assert(mr.start() == old_end, "post-condition");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1801
    // mr might be a smaller region than what was requested if
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1802
    // expand_by() was unable to allocate the HeapRegion instances
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1803
    assert(mr.end() <= new_end, "post-condition");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1804
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1805
    size_t actual_expand_bytes = mr.byte_size();
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1806
    assert(actual_expand_bytes <= aligned_expand_bytes, "post-condition");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1807
    assert(actual_expand_bytes == expansion_list.total_capacity_bytes(),
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1808
           "post-condition");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1809
    if (actual_expand_bytes < aligned_expand_bytes) {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1810
      // We could not expand _hrs to the desired size. In this case we
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1811
      // need to shrink the committed space accordingly.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1812
      assert(mr.end() < new_end, "invariant");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1813
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1814
      size_t diff_bytes = aligned_expand_bytes - actual_expand_bytes;
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1815
      // First uncommit the memory.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1816
      _g1_storage.shrink_by(diff_bytes);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1817
      // Then propagate this update to the necessary data structures.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1818
      update_committed_space(new_end, mr.end());
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1819
    }
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1820
    _free_list.add_as_tail(&expansion_list);
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1821
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1822
    if (_hr_printer.is_active()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1823
      HeapWord* curr = mr.start();
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1824
      while (curr < mr.end()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1825
        HeapWord* curr_end = curr + HeapRegion::GrainWords;
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1826
        _hr_printer.commit(curr, curr_end);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1827
        curr = curr_end;
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1828
      }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1829
      assert(curr == mr.end(), "post-condition");
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1830
    }
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1831
    g1_policy()->record_new_heap_size(n_regions());
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1832
  } else {
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1833
    ergo_verbose0(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1834
                  "did not expand the heap",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1835
                  ergo_format_reason("heap expansion operation failed"));
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1836
    // The expansion of the virtual storage space was unsuccessful.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1837
    // Let's see if it was because we ran out of swap.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1838
    if (G1ExitOnExpansionFailure &&
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1839
        _g1_storage.uncommitted_size() >= aligned_expand_bytes) {
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1840
      // We had head room...
17087
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16994
diff changeset
  1841
      vm_exit_out_of_memory(aligned_expand_bytes, OOM_MMAP_ERROR, "G1 heap expansion");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1842
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1843
  }
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1844
  return successful;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1845
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1846
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1847
void G1CollectedHeap::shrink_helper(size_t shrink_bytes) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1848
  size_t old_mem_size = _g1_storage.committed_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1849
  size_t aligned_shrink_bytes =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1850
    ReservedSpace::page_align_size_down(shrink_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1851
  aligned_shrink_bytes = align_size_down(aligned_shrink_bytes,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1852
                                         HeapRegion::GrainBytes);
17323
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1853
  uint num_regions_to_remove = (uint)(shrink_bytes / HeapRegion::GrainBytes);
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1854
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1855
  uint num_regions_removed = _hrs.shrink_by(num_regions_to_remove);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1856
  HeapWord* old_end = (HeapWord*) _g1_storage.high();
17323
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1857
  size_t shrunk_bytes = num_regions_removed * HeapRegion::GrainBytes;
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1858
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1859
  ergo_verbose3(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1860
                "shrink the heap",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1861
                ergo_format_byte("requested shrinking amount")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1862
                ergo_format_byte("aligned shrinking amount")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1863
                ergo_format_byte("attempted shrinking amount"),
17323
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1864
                shrink_bytes, aligned_shrink_bytes, shrunk_bytes);
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1865
  if (num_regions_removed > 0) {
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1866
    _g1_storage.shrink_by(shrunk_bytes);
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1867
    HeapWord* new_end = (HeapWord*) _g1_storage.high();
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1868
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1869
    if (_hr_printer.is_active()) {
17323
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1870
      HeapWord* curr = old_end;
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1871
      while (curr > new_end) {
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1872
        HeapWord* curr_end = curr;
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1873
        curr -= HeapRegion::GrainWords;
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1874
        _hr_printer.uncommit(curr, curr_end);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1875
      }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1876
    }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1877
17323
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1878
    _expansion_regions += num_regions_removed;
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1879
    update_committed_space(old_end, new_end);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1880
    HeapRegionRemSet::shrink_heap(n_regions());
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1881
    g1_policy()->record_new_heap_size(n_regions());
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1882
  } else {
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1883
    ergo_verbose0(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1884
                  "did not shrink the heap",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1885
                  ergo_format_reason("heap shrinking operation failed"));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1886
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1887
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1888
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1889
void G1CollectedHeap::shrink(size_t shrink_bytes) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1890
  verify_region_sets_optional();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1891
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  1892
  // We should only reach here at the end of a Full GC which means we
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  1893
  // should not not be holding to any GC alloc regions. The method
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  1894
  // below will make sure of that and do any remaining clean up.
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  1895
  abandon_gc_alloc_regions();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  1896
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1897
  // Instead of tearing down / rebuilding the free lists here, we
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1898
  // could instead use the remove_all_pending() method on free_list to
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1899
  // remove only the ones that we need to remove.
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  1900
  tear_down_region_sets(true /* free_list_only */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1901
  shrink_helper(shrink_bytes);
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  1902
  rebuild_region_sets(true /* free_list_only */);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1903
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1904
  _hrs.verify_optional();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1905
  verify_region_sets_optional();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1906
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1907
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1908
// Public methods.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1909
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1910
#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
  1911
#pragma warning( disable:4355 ) // 'this' : used in base member initializer list
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1912
#endif // _MSC_VER
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1913
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1914
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1915
G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1916
  SharedHeap(policy_),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1917
  _g1_policy(policy_),
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  1918
  _dirty_card_queue_set(false),
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  1919
  _into_cset_dirty_card_queue_set(false),
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1920
  _is_alive_closure_cm(this),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1921
  _is_alive_closure_stw(this),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1922
  _ref_processor_cm(NULL),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1923
  _ref_processor_stw(NULL),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1924
  _process_strong_tasks(new SubTasksDone(G1H_PS_NumElements)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1925
  _bot_shared(NULL),
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1926
  _evac_failure_scan_stack(NULL),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1927
  _mark_in_progress(false),
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1928
  _cg1r(NULL), _summary_bytes_used(0),
10671
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
  1929
  _g1mm(NULL),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1930
  _refine_cte_cl(NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1931
  _full_collection(false),
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1932
  _free_list("Master Free List"),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1933
  _secondary_free_list("Secondary Free List"),
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  1934
  _old_set("Old Set"),
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1935
  _humongous_set("Master Humongous Set"),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1936
  _free_regions_coming(false),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1937
  _young_list(new YoungList(this)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1938
  _gc_time_stamp(0),
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  1939
  _retained_old_gc_alloc_region(NULL),
13466
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  1940
  _survivor_plab_stats(YoungPLABSize, PLABWeight),
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  1941
  _old_plab_stats(OldPLABSize, PLABWeight),
11449
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
  1942
  _expand_heap_after_alloc_failure(true),
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  1943
  _surviving_young_words(NULL),
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  1944
  _old_marking_cycles_started(0),
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  1945
  _old_marking_cycles_completed(0),
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1946
  _concurrent_cycle_started(false),
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  1947
  _in_cset_fast_test(NULL),
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  1948
  _in_cset_fast_test_base(NULL),
11248
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  1949
  _dirty_cards_region_list(NULL),
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  1950
  _worker_cset_start_region(NULL),
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1951
  _worker_cset_start_region_time_stamp(NULL),
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1952
  _gc_timer_stw(new (ResourceObj::C_HEAP, mtGC) STWGCTimer()),
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1953
  _gc_timer_cm(new (ResourceObj::C_HEAP, mtGC) ConcurrentGCTimer()),
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1954
  _gc_tracer_stw(new (ResourceObj::C_HEAP, mtGC) G1NewTracer()),
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1955
  _gc_tracer_cm(new (ResourceObj::C_HEAP, mtGC) G1OldTracer()) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1956
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1957
  _g1h = this;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1958
  if (_process_strong_tasks == NULL || !_process_strong_tasks->valid()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1959
    vm_exit_during_initialization("Failed necessary allocation.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1960
  }
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  1961
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  1962
  _humongous_object_threshold_in_words = HeapRegion::GrainWords / 2;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  1963
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1964
  int n_queues = MAX2((int)ParallelGCThreads, 1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1965
  _task_queues = new RefToScanQueueSet(n_queues);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1966
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1967
  int n_rem_sets = HeapRegionRemSet::num_par_rem_sets();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1968
  assert(n_rem_sets > 0, "Invariant.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1969
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12935
diff changeset
  1970
  _worker_cset_start_region = NEW_C_HEAP_ARRAY(HeapRegion*, n_queues, mtGC);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12935
diff changeset
  1971
  _worker_cset_start_region_time_stamp = NEW_C_HEAP_ARRAY(unsigned int, n_queues, mtGC);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1972
  _evacuation_failed_info_array = NEW_C_HEAP_ARRAY(EvacuationFailedInfo, n_queues, mtGC);
11248
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  1973
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1974
  for (int i = 0; i < n_queues; i++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1975
    RefToScanQueue* q = new RefToScanQueue();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1976
    q->initialize();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1977
    _task_queues->register_queue(i, q);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1978
    ::new (&_evacuation_failed_info_array[i]) EvacuationFailedInfo();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  1979
  }
11248
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  1980
  clear_cset_start_regions();
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  1981
13517
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  1982
  // Initialize the G1EvacuationFailureALot counters and flags.
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  1983
  NOT_PRODUCT(reset_evacuation_should_fail();)
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  1984
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1985
  guarantee(_task_queues != NULL, "task_queues allocation failure.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1986
}
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
jint G1CollectedHeap::initialize() {
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4481
diff changeset
  1989
  CollectedHeap::pre_initialize();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1990
  os::enable_vtime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1991
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12271
diff changeset
  1992
  G1Log::init();
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12271
diff changeset
  1993
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1994
  // Necessary to satisfy locking discipline assertions.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1995
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1996
  MutexLocker x(Heap_lock);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1997
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1998
  // We have to initialize the printer before committing the heap, as
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1999
  // it will be used then.
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  2000
  _hr_printer.set_active(G1PrintHeapRegions);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  2001
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2002
  // While there are no constraints in the GC code that HeapWordSize
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2003
  // be any particular value, there are multiple other areas in the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2004
  // system which believe this to be true (e.g. oop->object_size in some
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2005
  // cases incorrectly returns the size in wordSize units rather than
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2006
  // HeapWordSize).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2007
  guarantee(HeapWordSize == wordSize, "HeapWordSize must equal wordSize");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2008
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2009
  size_t init_byte_size = collector_policy()->initial_heap_byte_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2010
  size_t max_byte_size = collector_policy()->max_heap_byte_size();
19546
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19341
diff changeset
  2011
  size_t heap_alignment = collector_policy()->max_alignment();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2012
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2013
  // Ensure that the sizes are properly aligned.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2014
  Universe::check_alignment(init_byte_size, HeapRegion::GrainBytes, "g1 heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2015
  Universe::check_alignment(max_byte_size, HeapRegion::GrainBytes, "g1 heap");
19546
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19341
diff changeset
  2016
  Universe::check_alignment(max_byte_size, heap_alignment, "g1 heap");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2017
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2018
  _cg1r = new ConcurrentG1Refine(this);
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
  // Reserve the maximum.
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  2021
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2022
  // When compressed oops are enabled, the preferred heap base
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2023
  // is calculated by subtracting the requested size from the
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2024
  // 32Gb boundary and using the result as the base address for
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2025
  // heap reservation. If the requested size is not aligned to
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2026
  // HeapRegion::GrainBytes (i.e. the alignment that is passed
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2027
  // into the ReservedHeapSpace constructor) then the actual
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2028
  // base of the reserved heap may end up differing from the
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2029
  // address that was requested (i.e. the preferred heap base).
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2030
  // If this happens then we could end up using a non-optimal
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2031
  // compressed oops mode.
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2032
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2033
  ReservedSpace heap_rs = Universe::reserve_heap(max_byte_size,
19546
f6b7c9e96ea3 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 19341
diff changeset
  2034
                                                 heap_alignment);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2035
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2036
  // It is important to do this in a way such that concurrent readers can't
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2037
  // temporarily think something is in the heap.  (I've actually seen this
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2038
  // happen in asserts: DLD.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2039
  _reserved.set_word_size(0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2040
  _reserved.set_start((HeapWord*)heap_rs.base());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2041
  _reserved.set_end((HeapWord*)(heap_rs.base() + heap_rs.size()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2042
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2043
  _expansion_regions = (uint) (max_byte_size / HeapRegion::GrainBytes);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2044
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2045
  // Create the gen rem set (and barrier set) for the entire reserved region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2046
  _rem_set = collector_policy()->create_rem_set(_reserved, 2);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2047
  set_barrier_set(rem_set()->bs());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2048
  if (barrier_set()->is_a(BarrierSet::ModRef)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2049
    _mr_bs = (ModRefBarrierSet*)_barrier_set;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2050
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2051
    vm_exit_during_initialization("G1 requires a mod ref bs.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2052
    return JNI_ENOMEM;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2053
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2054
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2055
  // Also create a G1 rem set.
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  2056
  if (mr_bs()->is_a(BarrierSet::CardTableModRef)) {
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  2057
    _g1_rem_set = new G1RemSet(this, (CardTableModRefBS*)mr_bs());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2058
  } else {
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  2059
    vm_exit_during_initialization("G1 requires a cardtable mod ref bs.");
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  2060
    return JNI_ENOMEM;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2061
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2062
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2063
  // Carve out the G1 part of the heap.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2064
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2065
  ReservedSpace g1_rs   = heap_rs.first_part(max_byte_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2066
  _g1_reserved = MemRegion((HeapWord*)g1_rs.base(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2067
                           g1_rs.size()/HeapWordSize);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2068
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2069
  _g1_storage.initialize(g1_rs, 0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2070
  _g1_committed = MemRegion((HeapWord*)_g1_storage.low(), (size_t) 0);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2071
  _hrs.initialize((HeapWord*) _g1_reserved.start(),
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2072
                  (HeapWord*) _g1_reserved.end(),
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2073
                  _expansion_regions);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2074
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2075
  // Do later initialization work for concurrent refinement.
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2076
  _cg1r->init();
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2077
2996
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  2078
  // 6843694 - ensure that the maximum region index can fit
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  2079
  // in the remembered set structures.
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2080
  const uint max_region_idx = (1U << (sizeof(RegionIdx_t)*BitsPerByte-1)) - 1;
2996
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  2081
  guarantee((max_regions() - 1) <= max_region_idx, "too many regions");
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  2082
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  2083
  size_t max_cards_per_region = ((size_t)1 << (sizeof(CardIdx_t)*BitsPerByte-1)) - 1;
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  2084
  guarantee(HeapRegion::CardsPerRegion > 0, "make sure it's initialized");
10677
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
  2085
  guarantee(HeapRegion::CardsPerRegion < max_cards_per_region,
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  2086
            "too many cards per region");
2996
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  2087
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2088
  HeapRegionSet::set_unrealistically_long_length(max_regions() + 1);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2089
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2090
  _bot_shared = new G1BlockOffsetSharedArray(_reserved,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2091
                                             heap_word_size(init_byte_size));
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
  _g1h = this;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2094
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2095
  _in_cset_fast_test_length = max_regions();
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2096
  _in_cset_fast_test_base =
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12935
diff changeset
  2097
                   NEW_C_HEAP_ARRAY(bool, (size_t) _in_cset_fast_test_length, mtGC);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2098
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2099
  // We're biasing _in_cset_fast_test to avoid subtracting the
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2100
  // beginning of the heap every time we want to index; basically
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2101
  // it's the same with what we do with the card table.
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2102
  _in_cset_fast_test = _in_cset_fast_test_base -
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2103
               ((uintx) _g1_reserved.start() >> HeapRegion::LogOfHRGrainBytes);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2104
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2105
  // Clear the _cset_fast_test bitmap in anticipation of adding
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2106
  // regions to the incremental collection set for the first
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2107
  // evacuation pause.
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2108
  clear_cset_fast_test();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2109
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2110
  // Create the ConcurrentMark data structure and thread.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2111
  // (Must do this late, so that "max_regions" is defined.)
14740
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14634
diff changeset
  2112
  _cm = new ConcurrentMark(this, heap_rs);
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14634
diff changeset
  2113
  if (_cm == NULL || !_cm->completed_initialization()) {
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14634
diff changeset
  2114
    vm_shutdown_during_initialization("Could not create/initialize ConcurrentMark");
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14634
diff changeset
  2115
    return JNI_ENOMEM;
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14634
diff changeset
  2116
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2117
  _cmThread = _cm->cmThread();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2118
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2119
  // Initialize the from_card cache structure of HeapRegionRemSet.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2120
  HeapRegionRemSet::init_heap(max_regions());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2121
2344
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2259
diff changeset
  2122
  // Now expand into the initial heap size.
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  2123
  if (!expand(init_byte_size)) {
14740
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14634
diff changeset
  2124
    vm_shutdown_during_initialization("Failed to allocate initial heap.");
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  2125
    return JNI_ENOMEM;
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  2126
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2127
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2128
  // Perform any initialization actions delegated to the policy.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2129
  g1_policy()->init();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2130
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2131
  _refine_cte_cl =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2132
    new RefineCardTableEntryClosure(ConcurrentG1RefineThread::sts(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2133
                                    g1_rem_set(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2134
                                    concurrent_g1_refine());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2135
  JavaThread::dirty_card_queue_set().set_closure(_refine_cte_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2136
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2137
  JavaThread::satb_mark_queue_set().initialize(SATB_Q_CBL_mon,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2138
                                               SATB_Q_FL_lock,
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2139
                                               G1SATBProcessCompletedThreshold,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2140
                                               Shared_SATB_Q_lock);
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2141
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2142
  JavaThread::dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2143
                                                DirtyCardQ_FL_lock,
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2144
                                                concurrent_g1_refine()->yellow_zone(),
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2145
                                                concurrent_g1_refine()->red_zone(),
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2146
                                                Shared_DirtyCardQ_lock);
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2147
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2148
  if (G1DeferredRSUpdate) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2149
    dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2150
                                      DirtyCardQ_FL_lock,
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2151
                                      -1, // never trigger processing
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2152
                                      -1, // no limit on length
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2153
                                      Shared_DirtyCardQ_lock,
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2154
                                      &JavaThread::dirty_card_queue_set());
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2155
  }
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2156
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2157
  // Initialize the card queue set used to hold cards containing
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2158
  // references into the collection set.
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2159
  _into_cset_dirty_card_queue_set.initialize(DirtyCardQ_CBL_mon,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2160
                                             DirtyCardQ_FL_lock,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2161
                                             -1, // never trigger processing
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2162
                                             -1, // no limit on length
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2163
                                             Shared_DirtyCardQ_lock,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2164
                                             &JavaThread::dirty_card_queue_set());
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2165
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2166
  // In case we're keeping closure specialization stats, initialize those
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2167
  // counts and that mechanism.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2168
  SpecializationStats::clear();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2169
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2170
  // Here we allocate the dummy full region that is required by the
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2171
  // G1AllocRegion class. If we don't pass an address in the reserved
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2172
  // space here, lots of asserts fire.
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2173
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2174
  HeapRegion* dummy_region = new_heap_region(0 /* index of bottom region */,
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2175
                                             _g1_reserved.start());
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2176
  // We'll re-use the same region whether the alloc region will
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2177
  // require BOT updates or not and, if it doesn't, then a non-young
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2178
  // region will complain that it cannot support allocations without
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2179
  // BOT updates. So we'll tag the dummy region as young to avoid that.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2180
  dummy_region->set_young();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2181
  // Make sure it's full.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2182
  dummy_region->set_top(dummy_region->end());
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2183
  G1AllocRegion::setup(this, dummy_region);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2184
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2185
  init_mutator_alloc_region();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2186
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  2187
  // Do create of the monitoring and management support so that
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  2188
  // values in the heap have been properly initialized.
10671
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
  2189
  _g1mm = new G1MonitoringSupport(this);
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  2190
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2191
  return JNI_OK;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2192
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2193
19986
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19729
diff changeset
  2194
size_t G1CollectedHeap::conservative_max_heap_alignment() {
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19729
diff changeset
  2195
  return HeapRegion::max_region_size();
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19729
diff changeset
  2196
}
33d188c66ed9 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 19729
diff changeset
  2197
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2198
void G1CollectedHeap::ref_processing_init() {
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2199
  // Reference processing in G1 currently works as follows:
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2200
  //
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2201
  // * There are two reference processor instances. One is
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2202
  //   used to record and process discovered references
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2203
  //   during concurrent marking; the other is used to
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2204
  //   record and process references during STW pauses
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2205
  //   (both full and incremental).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2206
  // * Both ref processors need to 'span' the entire heap as
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2207
  //   the regions in the collection set may be dotted around.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2208
  //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2209
  // * For the concurrent marking ref processor:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2210
  //   * Reference discovery is enabled at initial marking.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2211
  //   * Reference discovery is disabled and the discovered
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2212
  //     references processed etc during remarking.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2213
  //   * Reference discovery is MT (see below).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2214
  //   * Reference discovery requires a barrier (see below).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2215
  //   * Reference processing may or may not be MT
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2216
  //     (depending on the value of ParallelRefProcEnabled
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2217
  //     and ParallelGCThreads).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2218
  //   * A full GC disables reference discovery by the CM
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2219
  //     ref processor and abandons any entries on it's
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2220
  //     discovered lists.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2221
  //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2222
  // * For the STW processor:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2223
  //   * Non MT discovery is enabled at the start of a full GC.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2224
  //   * Processing and enqueueing during a full GC is non-MT.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2225
  //   * During a full GC, references are processed after marking.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2226
  //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2227
  //   * Discovery (may or may not be MT) is enabled at the start
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2228
  //     of an incremental evacuation pause.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2229
  //   * References are processed near the end of a STW evacuation pause.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2230
  //   * For both types of GC:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2231
  //     * Discovery is atomic - i.e. not concurrent.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2232
  //     * Reference discovery will not need a barrier.
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2233
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2234
  SharedHeap::ref_processing_init();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2235
  MemRegion mr = reserved_region();
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2236
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2237
  // Concurrent Mark ref processor
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2238
  _ref_processor_cm =
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8680
diff changeset
  2239
    new ReferenceProcessor(mr,    // span
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2240
                           ParallelRefProcEnabled && (ParallelGCThreads > 1),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2241
                                // mt processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2242
                           (int) ParallelGCThreads,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2243
                                // degree of mt processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2244
                           (ParallelGCThreads > 1) || (ConcGCThreads > 1),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2245
                                // mt discovery
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2246
                           (int) MAX2(ParallelGCThreads, ConcGCThreads),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2247
                                // degree of mt discovery
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2248
                           false,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2249
                                // Reference discovery is not atomic
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2250
                           &_is_alive_closure_cm,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2251
                                // is alive closure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2252
                                // (for efficiency/performance)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2253
                           true);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2254
                                // Setting next fields of discovered
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2255
                                // lists requires a barrier.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2256
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2257
  // STW ref processor
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2258
  _ref_processor_stw =
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2259
    new ReferenceProcessor(mr,    // span
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2260
                           ParallelRefProcEnabled && (ParallelGCThreads > 1),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2261
                                // mt processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2262
                           MAX2((int)ParallelGCThreads, 1),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2263
                                // degree of mt processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2264
                           (ParallelGCThreads > 1),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2265
                                // mt discovery
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2266
                           MAX2((int)ParallelGCThreads, 1),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2267
                                // degree of mt discovery
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2268
                           true,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2269
                                // Reference discovery is atomic
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2270
                           &_is_alive_closure_stw,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2271
                                // is alive closure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2272
                                // (for efficiency/performance)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2273
                           false);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2274
                                // Setting next fields of discovered
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2275
                                // lists requires a barrier.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2276
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2277
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2278
size_t G1CollectedHeap::capacity() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2279
  return _g1_committed.byte_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2280
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2281
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2282
void G1CollectedHeap::reset_gc_time_stamps(HeapRegion* hr) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2283
  assert(!hr->continuesHumongous(), "pre-condition");
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2284
  hr->reset_gc_time_stamp();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2285
  if (hr->startsHumongous()) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2286
    uint first_index = hr->hrs_index() + 1;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2287
    uint last_index = hr->last_hc_index();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2288
    for (uint i = first_index; i < last_index; i += 1) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2289
      HeapRegion* chr = region_at(i);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2290
      assert(chr->continuesHumongous(), "sanity");
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2291
      chr->reset_gc_time_stamp();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2292
    }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2293
  }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2294
}
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2295
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2296
#ifndef PRODUCT
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2297
class CheckGCTimeStampsHRClosure : public HeapRegionClosure {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2298
private:
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2299
  unsigned _gc_time_stamp;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2300
  bool _failures;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2301
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2302
public:
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2303
  CheckGCTimeStampsHRClosure(unsigned gc_time_stamp) :
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2304
    _gc_time_stamp(gc_time_stamp), _failures(false) { }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2305
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2306
  virtual bool doHeapRegion(HeapRegion* hr) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2307
    unsigned region_gc_time_stamp = hr->get_gc_time_stamp();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2308
    if (_gc_time_stamp != region_gc_time_stamp) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2309
      gclog_or_tty->print_cr("Region "HR_FORMAT" has GC time stamp = %d, "
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2310
                             "expected %d", HR_FORMAT_PARAMS(hr),
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2311
                             region_gc_time_stamp, _gc_time_stamp);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2312
      _failures = true;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2313
    }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2314
    return false;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2315
  }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2316
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2317
  bool failures() { return _failures; }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2318
};
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2319
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2320
void G1CollectedHeap::check_gc_time_stamps() {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2321
  CheckGCTimeStampsHRClosure cl(_gc_time_stamp);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2322
  heap_region_iterate(&cl);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2323
  guarantee(!cl.failures(), "all GC time stamps should have been reset");
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2324
}
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2325
#endif // PRODUCT
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2326
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2327
void G1CollectedHeap::iterate_dirty_card_closure(CardTableEntryClosure* cl,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2328
                                                 DirtyCardQueue* into_cset_dcq,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2329
                                                 bool concurrent,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2330
                                                 int worker_i) {
3589
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  2331
  // Clean cards in the hot card cache
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2332
  G1HotCardCache* hot_card_cache = _cg1r->hot_card_cache();
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2333
  hot_card_cache->drain(worker_i, g1_rem_set(), into_cset_dcq);
3589
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  2334
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2335
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2336
  int n_completed_buffers = 0;
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2337
  while (dcqs.apply_closure_to_completed_buffer(cl, worker_i, 0, true)) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2338
    n_completed_buffers++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2339
  }
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  2340
  g1_policy()->phase_times()->record_update_rs_processed_buffers(worker_i, n_completed_buffers);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2341
  dcqs.clear_n_completed_buffers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2342
  assert(!dcqs.completed_buffers_exist_dirty(), "Completed buffers exist!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2343
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2344
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2345
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2346
// Computes the sum of the storage used by the various regions.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2347
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2348
size_t G1CollectedHeap::used() const {
3279
1af8fdb08664 6863216: Clean up debugging debris inadvertently pushed with 6700789
ysr
parents: 3278
diff changeset
  2349
  assert(Heap_lock->owner() != NULL,
1af8fdb08664 6863216: Clean up debugging debris inadvertently pushed with 6700789
ysr
parents: 3278
diff changeset
  2350
         "Should be owned on this thread's behalf.");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2351
  size_t result = _summary_bytes_used;
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2352
  // Read only once in case it is set to NULL concurrently
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2353
  HeapRegion* hr = _mutator_alloc_region.get();
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2354
  if (hr != NULL)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2355
    result += hr->used();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2356
  return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2357
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2358
3263
23d2d46c6d08 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 3262
diff changeset
  2359
size_t G1CollectedHeap::used_unlocked() const {
23d2d46c6d08 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 3262
diff changeset
  2360
  size_t result = _summary_bytes_used;
23d2d46c6d08 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 3262
diff changeset
  2361
  return result;
23d2d46c6d08 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 3262
diff changeset
  2362
}
23d2d46c6d08 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 3262
diff changeset
  2363
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2364
class SumUsedClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2365
  size_t _used;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2366
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2367
  SumUsedClosure() : _used(0) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2368
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2369
    if (!r->continuesHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2370
      _used += r->used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2371
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2372
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2373
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2374
  size_t result() { return _used; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2375
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2376
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2377
size_t G1CollectedHeap::recalculate_used() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2378
  SumUsedClosure blk;
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2379
  heap_region_iterate(&blk);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2380
  return blk.result();
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
size_t G1CollectedHeap::unsafe_max_alloc() {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2384
  if (free_regions() > 0) return HeapRegion::GrainBytes;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2385
  // otherwise, is there space in the current allocation region?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2386
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2387
  // We need to store the current allocation region in a local variable
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2388
  // here. The problem is that this method doesn't take any locks and
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2389
  // there may be other threads which overwrite the current allocation
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2390
  // region field. attempt_allocation(), for example, sets it to NULL
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2391
  // and this can happen *after* the NULL check here but before the call
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2392
  // to free(), resulting in a SIGSEGV. Note that this doesn't appear
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2393
  // to be a problem in the optimized build, since the two loads of the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2394
  // current allocation region field are optimized away.
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2395
  HeapRegion* hr = _mutator_alloc_region.get();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2396
  if (hr == NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2397
    return 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2398
  }
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2399
  return hr->free();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2400
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2401
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2402
bool G1CollectedHeap::should_do_concurrent_full_gc(GCCause::Cause cause) {
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2403
  switch (cause) {
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2404
    case GCCause::_gc_locker:               return GCLockerInvokesConcurrent;
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2405
    case GCCause::_java_lang_system_gc:     return ExplicitGCInvokesConcurrent;
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2406
    case GCCause::_g1_humongous_allocation: return true;
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2407
    default:                                return false;
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2408
  }
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2409
}
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2410
9334
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2411
#ifndef PRODUCT
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2412
void G1CollectedHeap::allocate_dummy_regions() {
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2413
  // Let's fill up most of the region
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2414
  size_t word_size = HeapRegion::GrainWords - 1024;
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2415
  // And as a result the region we'll allocate will be humongous.
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2416
  guarantee(isHumongous(word_size), "sanity");
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2417
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2418
  for (uintx i = 0; i < G1DummyRegionsPerGC; ++i) {
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2419
    // Let's use the existing mechanism for the allocation
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2420
    HeapWord* dummy_obj = humongous_obj_allocate(word_size);
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2421
    if (dummy_obj != NULL) {
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2422
      MemRegion mr(dummy_obj, word_size);
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2423
      CollectedHeap::fill_with_object(mr);
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2424
    } else {
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2425
      // If we can't allocate once, we probably cannot allocate
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2426
      // again. Let's get out of the loop.
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2427
      break;
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2428
    }
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2429
  }
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2430
}
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2431
#endif // !PRODUCT
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2432
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2433
void G1CollectedHeap::increment_old_marking_cycles_started() {
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2434
  assert(_old_marking_cycles_started == _old_marking_cycles_completed ||
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2435
    _old_marking_cycles_started == _old_marking_cycles_completed + 1,
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2436
    err_msg("Wrong marking cycle count (started: %d, completed: %d)",
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2437
    _old_marking_cycles_started, _old_marking_cycles_completed));
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2438
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2439
  _old_marking_cycles_started++;
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2440
}
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2441
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2442
void G1CollectedHeap::increment_old_marking_cycles_completed(bool concurrent) {
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2443
  MonitorLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2444
7455
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2445
  // We assume that if concurrent == true, then the caller is a
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2446
  // concurrent thread that was joined the Suspendible Thread
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2447
  // Set. If there's ever a cheap way to check this, we should add an
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2448
  // assert here.
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2449
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2450
  // Given that this method is called at the end of a Full GC or of a
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2451
  // concurrent cycle, and those can be nested (i.e., a Full GC can
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2452
  // interrupt a concurrent cycle), the number of full collections
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2453
  // completed should be either one (in the case where there was no
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2454
  // nesting) or two (when a Full GC interrupted a concurrent cycle)
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2455
  // behind the number of full collections started.
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2456
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2457
  // This is the case for the inner caller, i.e. a Full GC.
7455
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2458
  assert(concurrent ||
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2459
         (_old_marking_cycles_started == _old_marking_cycles_completed + 1) ||
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2460
         (_old_marking_cycles_started == _old_marking_cycles_completed + 2),
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2461
         err_msg("for inner caller (Full GC): _old_marking_cycles_started = %u "
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2462
                 "is inconsistent with _old_marking_cycles_completed = %u",
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2463
                 _old_marking_cycles_started, _old_marking_cycles_completed));
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2464
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2465
  // This is the case for the outer caller, i.e. the concurrent cycle.
7455
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2466
  assert(!concurrent ||
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2467
         (_old_marking_cycles_started == _old_marking_cycles_completed + 1),
7455
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2468
         err_msg("for outer caller (concurrent cycle): "
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2469
                 "_old_marking_cycles_started = %u "
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2470
                 "is inconsistent with _old_marking_cycles_completed = %u",
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2471
                 _old_marking_cycles_started, _old_marking_cycles_completed));
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2472
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2473
  _old_marking_cycles_completed += 1;
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2474
6766
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2475
  // We need to clear the "in_progress" flag in the CM thread before
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2476
  // we wake up any waiters (especially when ExplicitInvokesConcurrent
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2477
  // is set) so that if a waiter requests another System.gc() it doesn't
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2478
  // incorrectly see that a marking cycle is still in progress.
7455
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2479
  if (concurrent) {
6766
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2480
    _cmThread->clear_in_progress();
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2481
  }
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2482
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2483
  // This notify_all() will ensure that a thread that called
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2484
  // System.gc() with (with ExplicitGCInvokesConcurrent set or not)
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2485
  // and it's waiting for a full GC to finish will be woken up. It is
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2486
  // waiting in VM_G1IncCollectionPause::doit_epilogue().
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2487
  FullGCCount_lock->notify_all();
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2488
}
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2489
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2490
void G1CollectedHeap::register_concurrent_cycle_start(jlong start_time) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2491
  _concurrent_cycle_started = true;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2492
  _gc_timer_cm->register_gc_start(start_time);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2493
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2494
  _gc_tracer_cm->report_gc_start(gc_cause(), _gc_timer_cm->gc_start());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2495
  trace_heap_before_gc(_gc_tracer_cm);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2496
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2497
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2498
void G1CollectedHeap::register_concurrent_cycle_end() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2499
  if (_concurrent_cycle_started) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2500
    if (_cm->has_aborted()) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2501
      _gc_tracer_cm->report_concurrent_mode_failure();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2502
    }
19729
0ddd2b7bb9bd 8020692: TestGCEventMixed.java failed because of timestamp in event after end event
ehelin
parents: 19552
diff changeset
  2503
0ddd2b7bb9bd 8020692: TestGCEventMixed.java failed because of timestamp in event after end event
ehelin
parents: 19552
diff changeset
  2504
    _gc_timer_cm->register_gc_end(os::elapsed_counter());
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2505
    _gc_tracer_cm->report_gc_end(_gc_timer_cm->gc_end(), _gc_timer_cm->time_partitions());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2506
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2507
    _concurrent_cycle_started = false;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2508
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2509
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2510
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2511
void G1CollectedHeap::trace_heap_after_concurrent_cycle() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2512
  if (_concurrent_cycle_started) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2513
    trace_heap_after_gc(_gc_tracer_cm);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2514
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2515
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2516
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2517
G1YCType G1CollectedHeap::yc_type() {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2518
  bool is_young = g1_policy()->gcs_are_young();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2519
  bool is_initial_mark = g1_policy()->during_initial_mark_pause();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2520
  bool is_during_mark = mark_in_progress();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2521
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2522
  if (is_initial_mark) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2523
    return InitialMark;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2524
  } else if (is_during_mark) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2525
    return DuringMark;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2526
  } else if (is_young) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2527
    return Normal;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2528
  } else {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2529
    return Mixed;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2530
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2531
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2532
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2533
void G1CollectedHeap::collect(GCCause::Cause cause) {
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2534
  assert_heap_not_locked();
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2535
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2536
  unsigned int gc_count_before;
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2537
  unsigned int old_marking_count_before;
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2538
  bool retry_gc;
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2539
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2540
  do {
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2541
    retry_gc = false;
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2542
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2543
    {
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2544
      MutexLocker ml(Heap_lock);
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2545
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2546
      // Read the GC count while holding the Heap_lock
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2547
      gc_count_before = total_collections();
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2548
      old_marking_count_before = _old_marking_cycles_started;
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2549
    }
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2550
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2551
    if (should_do_concurrent_full_gc(cause)) {
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2552
      // Schedule an initial-mark evacuation pause that will start a
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2553
      // concurrent cycle. We're setting word_size to 0 which means that
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2554
      // we are not requesting a post-GC allocation.
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2555
      VM_G1IncCollectionPause op(gc_count_before,
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2556
                                 0,     /* word_size */
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2557
                                 true,  /* should_initiate_conc_mark */
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2558
                                 g1_policy()->max_pause_time_ms(),
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2559
                                 cause);
12227
371690c4f281 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 11756
diff changeset
  2560
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2561
      VMThread::execute(&op);
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2562
      if (!op.pause_succeeded()) {
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2563
        if (old_marking_count_before == _old_marking_cycles_started) {
12227
371690c4f281 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 11756
diff changeset
  2564
          retry_gc = op.should_retry_gc();
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2565
        } else {
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2566
          // A Full GC happened while we were trying to schedule the
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2567
          // initial-mark GC. No point in starting a new cycle given
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2568
          // that the whole heap was collected anyway.
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2569
        }
12227
371690c4f281 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 11756
diff changeset
  2570
371690c4f281 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 11756
diff changeset
  2571
        if (retry_gc) {
371690c4f281 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 11756
diff changeset
  2572
          if (GC_locker::is_active_and_needs_gc()) {
371690c4f281 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 11756
diff changeset
  2573
            GC_locker::stall_until_clear();
371690c4f281 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 11756
diff changeset
  2574
          }
371690c4f281 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 11756
diff changeset
  2575
        }
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2576
      }
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2577
    } else {
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2578
      if (cause == GCCause::_gc_locker
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2579
          DEBUG_ONLY(|| cause == GCCause::_scavenge_alot)) {
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2580
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2581
        // Schedule a standard evacuation pause. We're setting word_size
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2582
        // to 0 which means that we are not requesting a post-GC allocation.
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2583
        VM_G1IncCollectionPause op(gc_count_before,
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2584
                                   0,     /* word_size */
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2585
                                   false, /* should_initiate_conc_mark */
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2586
                                   g1_policy()->max_pause_time_ms(),
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2587
                                   cause);
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2588
        VMThread::execute(&op);
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2589
      } else {
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2590
        // Schedule a Full GC.
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2591
        VM_G1CollectFull op(gc_count_before, old_marking_count_before, cause);
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2592
        VMThread::execute(&op);
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2593
      }
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2594
    }
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2595
  } while (retry_gc);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2596
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2597
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2598
bool G1CollectedHeap::is_in(const void* p) const {
11247
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 11176
diff changeset
  2599
  if (_g1_committed.contains(p)) {
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 11176
diff changeset
  2600
    // Given that we know that p is in the committed space,
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 11176
diff changeset
  2601
    // heap_region_containing_raw() should successfully
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 11176
diff changeset
  2602
    // return the containing region.
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 11176
diff changeset
  2603
    HeapRegion* hr = heap_region_containing_raw(p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2604
    return hr->is_in(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2605
  } else {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2606
    return false;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2607
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2608
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2609
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2610
// Iteration functions.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2611
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2612
// Iterates an OopClosure over all ref-containing fields of objects
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2613
// within a HeapRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2614
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2615
class IterateOopClosureRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2616
  MemRegion _mr;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2617
  ExtendedOopClosure* _cl;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2618
public:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2619
  IterateOopClosureRegionClosure(MemRegion mr, ExtendedOopClosure* cl)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2620
    : _mr(mr), _cl(cl) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2621
  bool doHeapRegion(HeapRegion* r) {
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2622
    if (!r->continuesHumongous()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2623
      r->oop_iterate(_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2624
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2625
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2626
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2627
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2628
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2629
void G1CollectedHeap::oop_iterate(ExtendedOopClosure* cl) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2630
  IterateOopClosureRegionClosure blk(_g1_committed, cl);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2631
  heap_region_iterate(&blk);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2632
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2633
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2634
void G1CollectedHeap::oop_iterate(MemRegion mr, ExtendedOopClosure* cl) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2635
  IterateOopClosureRegionClosure blk(mr, cl);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2636
  heap_region_iterate(&blk);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2637
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2638
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2639
// Iterates an ObjectClosure over all objects within a HeapRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2640
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2641
class IterateObjectClosureRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2642
  ObjectClosure* _cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2643
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2644
  IterateObjectClosureRegionClosure(ObjectClosure* cl) : _cl(cl) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2645
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2646
    if (! r->continuesHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2647
      r->object_iterate(_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2648
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2649
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2650
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2651
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2652
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2653
void G1CollectedHeap::object_iterate(ObjectClosure* cl) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2654
  IterateObjectClosureRegionClosure blk(cl);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2655
  heap_region_iterate(&blk);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2656
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2657
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2658
// Calls a SpaceClosure on a HeapRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2659
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2660
class SpaceClosureRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2661
  SpaceClosure* _cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2662
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2663
  SpaceClosureRegionClosure(SpaceClosure* cl) : _cl(cl) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2664
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2665
    _cl->do_space(r);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2666
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2667
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2668
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2669
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2670
void G1CollectedHeap::space_iterate(SpaceClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2671
  SpaceClosureRegionClosure blk(cl);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2672
  heap_region_iterate(&blk);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2673
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2674
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2675
void G1CollectedHeap::heap_region_iterate(HeapRegionClosure* cl) const {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2676
  _hrs.iterate(cl);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2677
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2678
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2679
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2680
G1CollectedHeap::heap_region_par_iterate_chunked(HeapRegionClosure* cl,
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2681
                                                 uint worker_id,
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  2682
                                                 uint no_of_par_workers,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2683
                                                 jint claim_value) {
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2684
  const uint regions = n_regions();
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  2685
  const uint max_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2686
                             no_of_par_workers :
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2687
                             1);
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2688
  assert(UseDynamicNumberOfGCThreads ||
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2689
         no_of_par_workers == workers()->total_workers(),
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2690
         "Non dynamic should use fixed number of workers");
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2691
  // try to spread out the starting points of the workers
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2692
  const HeapRegion* start_hr =
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2693
                        start_region_for_worker(worker_id, no_of_par_workers);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2694
  const uint start_index = start_hr->hrs_index();
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2695
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2696
  // each worker will actually look at all regions
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2697
  for (uint count = 0; count < regions; ++count) {
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2698
    const uint index = (start_index + count) % regions;
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2699
    assert(0 <= index && index < regions, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2700
    HeapRegion* r = region_at(index);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2701
    // we'll ignore "continues humongous" regions (we'll process them
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2702
    // when we come across their corresponding "start humongous"
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2703
    // region) and regions already claimed
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2704
    if (r->claim_value() == claim_value || r->continuesHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2705
      continue;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2706
    }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2707
    // OK, try to claim it
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2708
    if (r->claimHeapRegion(claim_value)) {
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2709
      // success!
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2710
      assert(!r->continuesHumongous(), "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2711
      if (r->startsHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2712
        // If the region is "starts humongous" we'll iterate over its
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2713
        // "continues humongous" first; in fact we'll do them
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2714
        // first. The order is important. In on case, calling the
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2715
        // closure on the "starts humongous" region might de-allocate
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2716
        // and clear all its "continues humongous" regions and, as a
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2717
        // result, we might end up processing them twice. So, we'll do
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2718
        // them first (notice: most closures will ignore them anyway) and
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2719
        // then we'll do the "starts humongous" region.
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2720
        for (uint ch_index = index + 1; ch_index < regions; ++ch_index) {
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2721
          HeapRegion* chr = region_at(ch_index);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2722
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2723
          // if the region has already been claimed or it's not
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2724
          // "continues humongous" we're done
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2725
          if (chr->claim_value() == claim_value ||
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2726
              !chr->continuesHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2727
            break;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2728
          }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2729
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2730
          // No one should have claimed it directly. We can given
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2731
          // that we claimed its "starts humongous" region.
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2732
          assert(chr->claim_value() != claim_value, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2733
          assert(chr->humongous_start_region() == r, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2734
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2735
          if (chr->claimHeapRegion(claim_value)) {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  2736
            // we should always be able to claim it; no one else should
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2737
            // be trying to claim this region
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2738
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2739
            bool res2 = cl->doHeapRegion(chr);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2740
            assert(!res2, "Should not abort");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2741
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2742
            // Right now, this holds (i.e., no closure that actually
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2743
            // does something with "continues humongous" regions
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2744
            // clears them). We might have to weaken it in the future,
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2745
            // but let's leave these two asserts here for extra safety.
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2746
            assert(chr->continuesHumongous(), "should still be the case");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2747
            assert(chr->humongous_start_region() == r, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2748
          } else {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2749
            guarantee(false, "we should not reach here");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2750
          }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2751
        }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2752
      }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2753
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2754
      assert(!r->continuesHumongous(), "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2755
      bool res = cl->doHeapRegion(r);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2756
      assert(!res, "Should not abort");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2757
    }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2758
  }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2759
}
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2760
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2761
class ResetClaimValuesClosure: public HeapRegionClosure {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2762
public:
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2763
  bool doHeapRegion(HeapRegion* r) {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2764
    r->set_claim_value(HeapRegion::InitialClaimValue);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2765
    return false;
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2766
  }
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2767
};
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2768
11451
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  2769
void G1CollectedHeap::reset_heap_region_claim_values() {
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2770
  ResetClaimValuesClosure blk;
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2771
  heap_region_iterate(&blk);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2772
}
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2773
11451
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  2774
void G1CollectedHeap::reset_cset_heap_region_claim_values() {
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  2775
  ResetClaimValuesClosure blk;
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  2776
  collection_set_iterate(&blk);
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  2777
}
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  2778
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2779
#ifdef ASSERT
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2780
// This checks whether all regions in the heap have the correct claim
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2781
// value. I also piggy-backed on this a check to ensure that the
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2782
// humongous_start_region() information on "continues humongous"
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2783
// regions is correct.
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2784
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2785
class CheckClaimValuesClosure : public HeapRegionClosure {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2786
private:
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2787
  jint _claim_value;
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2788
  uint _failures;
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2789
  HeapRegion* _sh_region;
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2790
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2791
public:
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2792
  CheckClaimValuesClosure(jint claim_value) :
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2793
    _claim_value(claim_value), _failures(0), _sh_region(NULL) { }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2794
  bool doHeapRegion(HeapRegion* r) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2795
    if (r->claim_value() != _claim_value) {
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2796
      gclog_or_tty->print_cr("Region " HR_FORMAT ", "
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2797
                             "claim value = %d, should be %d",
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2798
                             HR_FORMAT_PARAMS(r),
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2799
                             r->claim_value(), _claim_value);
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2800
      ++_failures;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2801
    }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2802
    if (!r->isHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2803
      _sh_region = NULL;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2804
    } else if (r->startsHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2805
      _sh_region = r;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2806
    } else if (r->continuesHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2807
      if (r->humongous_start_region() != _sh_region) {
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2808
        gclog_or_tty->print_cr("Region " HR_FORMAT ", "
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2809
                               "HS = "PTR_FORMAT", should be "PTR_FORMAT,
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2810
                               HR_FORMAT_PARAMS(r),
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2811
                               r->humongous_start_region(),
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2812
                               _sh_region);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2813
        ++_failures;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2814
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2815
    }
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2816
    return false;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2817
  }
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2818
  uint failures() { return _failures; }
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2819
};
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2820
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2821
bool G1CollectedHeap::check_heap_region_claim_values(jint claim_value) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2822
  CheckClaimValuesClosure cl(claim_value);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2823
  heap_region_iterate(&cl);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2824
  return cl.failures() == 0;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2825
}
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2826
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2827
class CheckClaimValuesInCSetHRClosure: public HeapRegionClosure {
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2828
private:
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2829
  jint _claim_value;
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2830
  uint _failures;
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2831
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2832
public:
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2833
  CheckClaimValuesInCSetHRClosure(jint claim_value) :
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2834
    _claim_value(claim_value), _failures(0) { }
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2835
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2836
  uint failures() { return _failures; }
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2837
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2838
  bool doHeapRegion(HeapRegion* hr) {
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2839
    assert(hr->in_collection_set(), "how?");
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2840
    assert(!hr->isHumongous(), "H-region in CSet");
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2841
    if (hr->claim_value() != _claim_value) {
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2842
      gclog_or_tty->print_cr("CSet Region " HR_FORMAT ", "
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2843
                             "claim value = %d, should be %d",
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2844
                             HR_FORMAT_PARAMS(hr),
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2845
                             hr->claim_value(), _claim_value);
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2846
      _failures += 1;
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2847
    }
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2848
    return false;
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2849
  }
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2850
};
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2851
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2852
bool G1CollectedHeap::check_cset_heap_region_claim_values(jint claim_value) {
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2853
  CheckClaimValuesInCSetHRClosure cl(claim_value);
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2854
  collection_set_iterate(&cl);
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2855
  return cl.failures() == 0;
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2856
}
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2857
#endif // ASSERT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2858
11248
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2859
// Clear the cached CSet starting regions and (more importantly)
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2860
// the time stamps. Called when we reset the GC time stamp.
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2861
void G1CollectedHeap::clear_cset_start_regions() {
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2862
  assert(_worker_cset_start_region != NULL, "sanity");
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2863
  assert(_worker_cset_start_region_time_stamp != NULL, "sanity");
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2864
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2865
  int n_queues = MAX2((int)ParallelGCThreads, 1);
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2866
  for (int i = 0; i < n_queues; i++) {
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2867
    _worker_cset_start_region[i] = NULL;
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2868
    _worker_cset_start_region_time_stamp[i] = 0;
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2869
  }
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2870
}
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2871
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2872
// Given the id of a worker, obtain or calculate a suitable
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2873
// starting region for iterating over the current collection set.
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2874
HeapRegion* G1CollectedHeap::start_cset_region_for_worker(int worker_i) {
11248
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2875
  assert(get_gc_time_stamp() > 0, "should have been updated by now");
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2876
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2877
  HeapRegion* result = NULL;
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2878
  unsigned gc_time_stamp = get_gc_time_stamp();
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2879
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2880
  if (_worker_cset_start_region_time_stamp[worker_i] == gc_time_stamp) {
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2881
    // Cached starting region for current worker was set
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2882
    // during the current pause - so it's valid.
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2883
    // Note: the cached starting heap region may be NULL
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2884
    // (when the collection set is empty).
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2885
    result = _worker_cset_start_region[worker_i];
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2886
    assert(result == NULL || result->in_collection_set(), "sanity");
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2887
    return result;
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2888
  }
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2889
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2890
  // The cached entry was not valid so let's calculate
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2891
  // a suitable starting heap region for this worker.
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2892
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2893
  // We want the parallel threads to start their collection
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2894
  // set iteration at different collection set regions to
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2895
  // avoid contention.
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2896
  // If we have:
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2897
  //          n collection set regions
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2898
  //          p threads
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2899
  // Then thread t will start at region floor ((t * n) / p)
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2900
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2901
  result = g1_policy()->collection_set();
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2902
  if (G1CollectedHeap::use_parallel_gc_threads()) {
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2903
    uint cs_size = g1_policy()->cset_region_length();
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  2904
    uint active_workers = workers()->active_workers();
11248
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2905
    assert(UseDynamicNumberOfGCThreads ||
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2906
             active_workers == workers()->total_workers(),
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2907
             "Unless dynamic should use total workers");
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2908
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2909
    uint end_ind   = (cs_size * worker_i) / active_workers;
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2910
    uint start_ind = 0;
11248
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2911
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2912
    if (worker_i > 0 &&
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2913
        _worker_cset_start_region_time_stamp[worker_i - 1] == gc_time_stamp) {
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2914
      // Previous workers starting region is valid
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2915
      // so let's iterate from there
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2916
      start_ind = (cs_size * (worker_i - 1)) / active_workers;
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2917
      result = _worker_cset_start_region[worker_i - 1];
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2918
    }
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2919
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2920
    for (uint i = start_ind; i < end_ind; i++) {
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2921
      result = result->next_in_collection_set();
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2922
    }
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2923
  }
11248
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2924
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2925
  // Note: the calculated starting heap region may be NULL
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2926
  // (when the collection set is empty).
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2927
  assert(result == NULL || result->in_collection_set(), "sanity");
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2928
  assert(_worker_cset_start_region_time_stamp[worker_i] != gc_time_stamp,
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2929
         "should be updated only once per pause");
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2930
  _worker_cset_start_region[worker_i] = result;
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2931
  OrderAccess::storestore();
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2932
  _worker_cset_start_region_time_stamp[worker_i] = gc_time_stamp;
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2933
  return result;
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2934
}
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2935
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2936
HeapRegion* G1CollectedHeap::start_region_for_worker(uint worker_i,
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2937
                                                     uint no_of_par_workers) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2938
  uint worker_num =
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2939
           G1CollectedHeap::use_parallel_gc_threads() ? no_of_par_workers : 1U;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2940
  assert(UseDynamicNumberOfGCThreads ||
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2941
         no_of_par_workers == workers()->total_workers(),
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2942
         "Non dynamic should use fixed number of workers");
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2943
  const uint start_index = n_regions() * worker_i / worker_num;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2944
  return region_at(start_index);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2945
}
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2946
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2947
void G1CollectedHeap::collection_set_iterate(HeapRegionClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2948
  HeapRegion* r = g1_policy()->collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2949
  while (r != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2950
    HeapRegion* next = r->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2951
    if (cl->doHeapRegion(r)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2952
      cl->incomplete();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2953
      return;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2954
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2955
    r = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2956
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2957
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2958
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2959
void G1CollectedHeap::collection_set_iterate_from(HeapRegion* r,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2960
                                                  HeapRegionClosure *cl) {
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2961
  if (r == NULL) {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2962
    // The CSet is empty so there's nothing to do.
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2963
    return;
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2964
  }
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2965
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2966
  assert(r->in_collection_set(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2967
         "Start region must be a member of the collection set.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2968
  HeapRegion* cur = r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2969
  while (cur != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2970
    HeapRegion* next = cur->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2971
    if (cl->doHeapRegion(cur) && false) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2972
      cl->incomplete();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2973
      return;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2974
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2975
    cur = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2976
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2977
  cur = g1_policy()->collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2978
  while (cur != r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2979
    HeapRegion* next = cur->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2980
    if (cl->doHeapRegion(cur) && false) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2981
      cl->incomplete();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2982
      return;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2983
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2984
    cur = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2985
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2986
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2987
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2988
CompactibleSpace* G1CollectedHeap::first_compactible_space() {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2989
  return n_regions() > 0 ? region_at(0) : NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2990
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2991
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2992
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2993
Space* G1CollectedHeap::space_containing(const void* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2994
  Space* res = heap_region_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2995
  return res;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2996
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2997
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2998
HeapWord* G1CollectedHeap::block_start(const void* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2999
  Space* sp = space_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3000
  if (sp != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3001
    return sp->block_start(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3002
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3003
  return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3004
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3005
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3006
size_t G1CollectedHeap::block_size(const HeapWord* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3007
  Space* sp = space_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3008
  assert(sp != NULL, "block_size of address outside of heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3009
  return sp->block_size(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3010
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3011
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3012
bool G1CollectedHeap::block_is_obj(const HeapWord* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3013
  Space* sp = space_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3014
  return sp->block_is_obj(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3015
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3016
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3017
bool G1CollectedHeap::supports_tlab_allocation() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3018
  return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3019
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3020
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3021
size_t G1CollectedHeap::tlab_capacity(Thread* ignored) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3022
  return HeapRegion::GrainBytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3023
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3024
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3025
size_t G1CollectedHeap::unsafe_max_tlab_alloc(Thread* ignored) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3026
  // Return the remaining space in the cur alloc region, but not less than
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3027
  // the min TLAB size.
5078
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  3028
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  3029
  // Also, this value can be at most the humongous object threshold,
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  3030
  // since we can't allow tlabs to grow big enough to accommodate
5078
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  3031
  // humongous objects.
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  3032
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3033
  HeapRegion* hr = _mutator_alloc_region.get();
5078
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  3034
  size_t max_tlab_size = _humongous_object_threshold_in_words * wordSize;
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3035
  if (hr == NULL) {
5078
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  3036
    return max_tlab_size;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3037
  } else {
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3038
    return MIN2(MAX2(hr->free(), (size_t) MinTLABSize), max_tlab_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3039
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3040
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3041
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3042
size_t G1CollectedHeap::max_capacity() const {
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  3043
  return _g1_reserved.byte_size();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3044
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3045
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3046
jlong G1CollectedHeap::millis_since_last_gc() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3047
  // assert(false, "NYI");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3048
  return 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3049
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3050
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3051
void G1CollectedHeap::prepare_for_verify() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3052
  if (SafepointSynchronize::is_at_safepoint() || ! UseTLAB) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3053
    ensure_parsability(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3054
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3055
  g1_rem_set()->prepare_for_verify();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3056
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3057
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3058
bool G1CollectedHeap::allocated_since_marking(oop obj, HeapRegion* hr,
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3059
                                              VerifyOption vo) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3060
  switch (vo) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3061
  case VerifyOption_G1UsePrevMarking:
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3062
    return hr->obj_allocated_since_prev_marking(obj);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3063
  case VerifyOption_G1UseNextMarking:
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3064
    return hr->obj_allocated_since_next_marking(obj);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3065
  case VerifyOption_G1UseMarkWord:
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3066
    return false;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3067
  default:
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3068
    ShouldNotReachHere();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3069
  }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3070
  return false; // keep some compilers happy
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3071
}
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3072
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3073
HeapWord* G1CollectedHeap::top_at_mark_start(HeapRegion* hr, VerifyOption vo) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3074
  switch (vo) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3075
  case VerifyOption_G1UsePrevMarking: return hr->prev_top_at_mark_start();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3076
  case VerifyOption_G1UseNextMarking: return hr->next_top_at_mark_start();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3077
  case VerifyOption_G1UseMarkWord:    return NULL;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3078
  default:                            ShouldNotReachHere();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3079
  }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3080
  return NULL; // keep some compilers happy
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3081
}
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3082
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3083
bool G1CollectedHeap::is_marked(oop obj, VerifyOption vo) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3084
  switch (vo) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3085
  case VerifyOption_G1UsePrevMarking: return isMarkedPrev(obj);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3086
  case VerifyOption_G1UseNextMarking: return isMarkedNext(obj);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3087
  case VerifyOption_G1UseMarkWord:    return obj->is_gc_marked();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3088
  default:                            ShouldNotReachHere();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3089
  }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3090
  return false; // keep some compilers happy
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3091
}
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3092
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3093
const char* G1CollectedHeap::top_at_mark_start_str(VerifyOption vo) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3094
  switch (vo) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3095
  case VerifyOption_G1UsePrevMarking: return "PTAMS";
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3096
  case VerifyOption_G1UseNextMarking: return "NTAMS";
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3097
  case VerifyOption_G1UseMarkWord:    return "NONE";
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3098
  default:                            ShouldNotReachHere();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3099
  }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3100
  return NULL; // keep some compilers happy
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3101
}
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3102
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3103
// TODO: VerifyRootsClosure extends OopsInGenClosure so that we can
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3104
//       pass it as the perm_blk to SharedHeap::process_strong_roots.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3105
//       When process_strong_roots stop calling perm_blk->younger_refs_iterate
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3106
//       we can change this closure to extend the simpler OopClosure.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3107
class VerifyRootsClosure: public OopsInGenClosure {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3108
private:
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3109
  G1CollectedHeap* _g1h;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3110
  VerifyOption     _vo;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3111
  bool             _failures;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3112
public:
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3113
  // _vo == UsePrevMarking -> use "prev" marking information,
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3114
  // _vo == UseNextMarking -> use "next" marking information,
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3115
  // _vo == UseMarkWord    -> use mark word from object header.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3116
  VerifyRootsClosure(VerifyOption vo) :
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3117
    _g1h(G1CollectedHeap::heap()),
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3118
    _vo(vo),
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3119
    _failures(false) { }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3120
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3121
  bool failures() { return _failures; }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3122
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3123
  template <class T> void do_oop_nv(T* p) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3124
    T heap_oop = oopDesc::load_heap_oop(p);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3125
    if (!oopDesc::is_null(heap_oop)) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3126
      oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3127
      if (_g1h->is_obj_dead_cond(obj, _vo)) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3128
        gclog_or_tty->print_cr("Root location "PTR_FORMAT" "
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3129
                              "points to dead obj "PTR_FORMAT, p, (void*) obj);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3130
        if (_vo == VerifyOption_G1UseMarkWord) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3131
          gclog_or_tty->print_cr("  Mark word: "PTR_FORMAT, (void*)(obj->mark()));
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3132
        }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3133
        obj->print_on(gclog_or_tty);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3134
        _failures = true;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3135
      }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3136
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3137
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3138
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3139
  void do_oop(oop* p)       { do_oop_nv(p); }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3140
  void do_oop(narrowOop* p) { do_oop_nv(p); }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3141
};
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3142
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3143
class G1VerifyCodeRootOopClosure: public OopsInGenClosure {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3144
  G1CollectedHeap* _g1h;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3145
  OopClosure* _root_cl;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3146
  nmethod* _nm;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3147
  VerifyOption _vo;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3148
  bool _failures;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3149
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3150
  template <class T> void do_oop_work(T* p) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3151
    // First verify that this root is live
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3152
    _root_cl->do_oop(p);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3153
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3154
    if (!G1VerifyHeapRegionCodeRoots) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3155
      // We're not verifying the code roots attached to heap region.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3156
      return;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3157
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3158
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3159
    // Don't check the code roots during marking verification in a full GC
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3160
    if (_vo == VerifyOption_G1UseMarkWord) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3161
      return;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3162
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3163
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3164
    // Now verify that the current nmethod (which contains p) is
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3165
    // in the code root list of the heap region containing the
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3166
    // object referenced by p.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3167
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3168
    T heap_oop = oopDesc::load_heap_oop(p);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3169
    if (!oopDesc::is_null(heap_oop)) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3170
      oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3171
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3172
      // Now fetch the region containing the object
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3173
      HeapRegion* hr = _g1h->heap_region_containing(obj);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3174
      HeapRegionRemSet* hrrs = hr->rem_set();
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3175
      // Verify that the strong code root list for this region
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3176
      // contains the nmethod
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3177
      if (!hrrs->strong_code_roots_list_contains(_nm)) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3178
        gclog_or_tty->print_cr("Code root location "PTR_FORMAT" "
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3179
                              "from nmethod "PTR_FORMAT" not in strong "
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3180
                              "code roots for region ["PTR_FORMAT","PTR_FORMAT")",
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3181
                              p, _nm, hr->bottom(), hr->end());
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3182
        _failures = true;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3183
      }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3184
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3185
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3186
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3187
public:
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3188
  G1VerifyCodeRootOopClosure(G1CollectedHeap* g1h, OopClosure* root_cl, VerifyOption vo):
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3189
    _g1h(g1h), _root_cl(root_cl), _vo(vo), _nm(NULL), _failures(false) {}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3190
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3191
  void do_oop(oop* p) { do_oop_work(p); }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3192
  void do_oop(narrowOop* p) { do_oop_work(p); }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3193
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3194
  void set_nmethod(nmethod* nm) { _nm = nm; }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3195
  bool failures() { return _failures; }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3196
};
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3197
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3198
class G1VerifyCodeRootBlobClosure: public CodeBlobClosure {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3199
  G1VerifyCodeRootOopClosure* _oop_cl;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3200
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3201
public:
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3202
  G1VerifyCodeRootBlobClosure(G1VerifyCodeRootOopClosure* oop_cl):
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3203
    _oop_cl(oop_cl) {}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3204
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3205
  void do_code_blob(CodeBlob* cb) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3206
    nmethod* nm = cb->as_nmethod_or_null();
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3207
    if (nm != NULL) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3208
      _oop_cl->set_nmethod(nm);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3209
      nm->oops_do(_oop_cl);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3210
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3211
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3212
};
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3213
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3214
class YoungRefCounterClosure : public OopClosure {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3215
  G1CollectedHeap* _g1h;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3216
  int              _count;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3217
 public:
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3218
  YoungRefCounterClosure(G1CollectedHeap* g1h) : _g1h(g1h), _count(0) {}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3219
  void do_oop(oop* p)       { if (_g1h->is_in_young(*p)) { _count++; } }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3220
  void do_oop(narrowOop* p) { ShouldNotReachHere(); }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3221
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3222
  int count() { return _count; }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3223
  void reset_count() { _count = 0; };
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3224
};
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3225
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3226
class VerifyKlassClosure: public KlassClosure {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3227
  YoungRefCounterClosure _young_ref_counter_closure;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3228
  OopClosure *_oop_closure;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3229
 public:
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3230
  VerifyKlassClosure(G1CollectedHeap* g1h, OopClosure* cl) : _young_ref_counter_closure(g1h), _oop_closure(cl) {}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3231
  void do_klass(Klass* k) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3232
    k->oops_do(_oop_closure);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3233
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3234
    _young_ref_counter_closure.reset_count();
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3235
    k->oops_do(&_young_ref_counter_closure);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3236
    if (_young_ref_counter_closure.count() > 0) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3237
      guarantee(k->has_modified_oops(), err_msg("Klass %p, has young refs but is not dirty.", k));
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3238
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3239
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3240
};
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3241
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3242
class VerifyLivenessOopClosure: public OopClosure {
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3243
  G1CollectedHeap* _g1h;
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3244
  VerifyOption _vo;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3245
public:
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3246
  VerifyLivenessOopClosure(G1CollectedHeap* g1h, VerifyOption vo):
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3247
    _g1h(g1h), _vo(vo)
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3248
  { }
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3249
  void do_oop(narrowOop *p) { do_oop_work(p); }
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3250
  void do_oop(      oop *p) { do_oop_work(p); }
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3251
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3252
  template <class T> void do_oop_work(T *p) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3253
    oop obj = oopDesc::load_decode_heap_oop(p);
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3254
    guarantee(obj == NULL || !_g1h->is_obj_dead_cond(obj, _vo),
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3255
              "Dead object referenced by a not dead object");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3256
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3257
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3258
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3259
class VerifyObjsInRegionClosure: public ObjectClosure {
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  3260
private:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3261
  G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3262
  size_t _live_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3263
  HeapRegion *_hr;
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3264
  VerifyOption _vo;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3265
public:
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3266
  // _vo == UsePrevMarking -> use "prev" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3267
  // _vo == UseNextMarking -> use "next" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3268
  // _vo == UseMarkWord    -> use mark word from object header.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3269
  VerifyObjsInRegionClosure(HeapRegion *hr, VerifyOption vo)
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3270
    : _live_bytes(0), _hr(hr), _vo(vo) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3271
    _g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3272
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3273
  void do_object(oop o) {
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3274
    VerifyLivenessOopClosure isLive(_g1h, _vo);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3275
    assert(o != NULL, "Huh?");
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3276
    if (!_g1h->is_obj_dead_cond(o, _vo)) {
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3277
      // If the object is alive according to the mark word,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3278
      // then verify that the marking information agrees.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3279
      // Note we can't verify the contra-positive of the
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3280
      // above: if the object is dead (according to the mark
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3281
      // word), it may not be marked, or may have been marked
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3282
      // but has since became dead, or may have been allocated
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3283
      // since the last marking.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3284
      if (_vo == VerifyOption_G1UseMarkWord) {
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3285
        guarantee(!_g1h->is_obj_dead(o), "mark word and concurrent mark mismatch");
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3286
      }
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3287
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3288
      o->oop_iterate_no_header(&isLive);
5345
d3bd6e8757d8 6943926: G1: Integer overflow during heap region verification
johnc
parents: 5344
diff changeset
  3289
      if (!_hr->obj_allocated_since_prev_marking(o)) {
d3bd6e8757d8 6943926: G1: Integer overflow during heap region verification
johnc
parents: 5344
diff changeset
  3290
        size_t obj_size = o->size();    // Make sure we don't overflow
d3bd6e8757d8 6943926: G1: Integer overflow during heap region verification
johnc
parents: 5344
diff changeset
  3291
        _live_bytes += (obj_size * HeapWordSize);
d3bd6e8757d8 6943926: G1: Integer overflow during heap region verification
johnc
parents: 5344
diff changeset
  3292
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3293
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3294
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3295
  size_t live_bytes() { return _live_bytes; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3296
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3297
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3298
class PrintObjsInRegionClosure : public ObjectClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3299
  HeapRegion *_hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3300
  G1CollectedHeap *_g1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3301
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3302
  PrintObjsInRegionClosure(HeapRegion *hr) : _hr(hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3303
    _g1 = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3304
  };
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3305
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3306
  void do_object(oop o) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3307
    if (o != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3308
      HeapWord *start = (HeapWord *) o;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3309
      size_t word_sz = o->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3310
      gclog_or_tty->print("\nPrinting obj "PTR_FORMAT" of size " SIZE_FORMAT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3311
                          " isMarkedPrev %d isMarkedNext %d isAllocSince %d\n",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3312
                          (void*) o, word_sz,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3313
                          _g1->isMarkedPrev(o),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3314
                          _g1->isMarkedNext(o),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3315
                          _hr->obj_allocated_since_prev_marking(o));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3316
      HeapWord *end = start + word_sz;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3317
      HeapWord *cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3318
      int *val;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3319
      for (cur = start; cur < end; cur++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3320
        val = (int *) cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3321
        gclog_or_tty->print("\t "PTR_FORMAT":"PTR_FORMAT"\n", val, *val);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3322
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3323
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3324
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3325
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3326
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3327
class VerifyRegionClosure: public HeapRegionClosure {
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  3328
private:
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3329
  bool             _par;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3330
  VerifyOption     _vo;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3331
  bool             _failures;
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  3332
public:
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3333
  // _vo == UsePrevMarking -> use "prev" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3334
  // _vo == UseNextMarking -> use "next" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3335
  // _vo == UseMarkWord    -> use mark word from object header.
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3336
  VerifyRegionClosure(bool par, VerifyOption vo)
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3337
    : _par(par),
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3338
      _vo(vo),
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3339
      _failures(false) {}
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3340
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3341
  bool failures() {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3342
    return _failures;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3343
  }
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3344
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3345
  bool doHeapRegion(HeapRegion* r) {
2249
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  3346
    if (!r->continuesHumongous()) {
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3347
      bool failures = false;
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3348
      r->verify(_vo, &failures);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3349
      if (failures) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3350
        _failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3351
      } else {
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3352
        VerifyObjsInRegionClosure not_dead_yet_cl(r, _vo);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3353
        r->object_iterate(&not_dead_yet_cl);
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3354
        if (_vo != VerifyOption_G1UseNextMarking) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3355
          if (r->max_live_bytes() < not_dead_yet_cl.live_bytes()) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3356
            gclog_or_tty->print_cr("["PTR_FORMAT","PTR_FORMAT"] "
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3357
                                   "max_live_bytes "SIZE_FORMAT" "
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3358
                                   "< calculated "SIZE_FORMAT,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3359
                                   r->bottom(), r->end(),
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3360
                                   r->max_live_bytes(),
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3361
                                 not_dead_yet_cl.live_bytes());
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3362
            _failures = true;
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3363
          }
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3364
        } else {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3365
          // When vo == UseNextMarking we cannot currently do a sanity
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3366
          // check on the live bytes as the calculation has not been
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3367
          // finalized yet.
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3368
        }
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3369
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3370
    }
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3371
    return false; // stop the region iteration if we hit a failure
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3372
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3373
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3374
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3375
// This is the task used for parallel verification of the heap regions
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3376
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3377
class G1ParVerifyTask: public AbstractGangTask {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3378
private:
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3379
  G1CollectedHeap* _g1h;
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3380
  VerifyOption     _vo;
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3381
  bool             _failures;
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3382
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3383
public:
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3384
  // _vo == UsePrevMarking -> use "prev" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3385
  // _vo == UseNextMarking -> use "next" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3386
  // _vo == UseMarkWord    -> use mark word from object header.
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3387
  G1ParVerifyTask(G1CollectedHeap* g1h, VerifyOption vo) :
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3388
    AbstractGangTask("Parallel verify task"),
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3389
    _g1h(g1h),
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3390
    _vo(vo),
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3391
    _failures(false) { }
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3392
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3393
  bool failures() {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3394
    return _failures;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3395
  }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3396
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  3397
  void work(uint worker_id) {
2249
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  3398
    HandleMark hm;
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3399
    VerifyRegionClosure blk(true, _vo);
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  3400
    _g1h->heap_region_par_iterate_chunked(&blk, worker_id,
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3401
                                          _g1h->workers()->active_workers(),
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3402
                                          HeapRegion::ParVerifyClaimValue);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3403
    if (blk.failures()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3404
      _failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3405
    }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3406
  }
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3407
};
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3408
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3409
void G1CollectedHeap::verify(bool silent, VerifyOption vo) {
16606
926ac1e006db 8010463: G1: Crashes with -UseTLAB and heap verification
johnc
parents: 16604
diff changeset
  3410
  if (SafepointSynchronize::is_at_safepoint()) {
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3411
    assert(Thread::current()->is_VM_thread(),
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3412
           "Expected to be executed serially by the VM thread at this point");
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3413
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3414
    if (!silent) { gclog_or_tty->print("Roots "); }
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3415
    VerifyRootsClosure rootsCl(vo);
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3416
    G1VerifyCodeRootOopClosure codeRootsCl(this, &rootsCl, vo);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3417
    G1VerifyCodeRootBlobClosure blobsCl(&codeRootsCl);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3418
    VerifyKlassClosure klassCl(this, &rootsCl);
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3419
9342
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  3420
    // We apply the relevant closures to all the oops in the
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  3421
    // system dictionary, the string table and the code cache.
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  3422
    const int so = SO_AllClasses | SO_Strings | SO_CodeCache;
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3423
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3424
    // Need cleared claim bits for the strong roots processing
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3425
    ClassLoaderDataGraph::clear_claimed_marks();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3426
9342
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  3427
    process_strong_roots(true,      // activate StrongRootsScope
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3428
                         false,     // we set "is scavenging" to false,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3429
                                    // so we don't reset the dirty cards.
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  3430
                         ScanningOption(so),  // roots scanning options
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3431
                         &rootsCl,
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  3432
                         &blobsCl,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3433
                         &klassCl
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3434
                         );
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3435
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3436
    bool failures = rootsCl.failures() || codeRootsCl.failures();
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3437
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3438
    if (vo != VerifyOption_G1UseMarkWord) {
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3439
      // If we're verifying during a full GC then the region sets
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3440
      // will have been torn down at the start of the GC. Therefore
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3441
      // verifying the region sets will fail. So we only verify
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3442
      // the region sets when not in a full GC.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3443
      if (!silent) { gclog_or_tty->print("HeapRegionSets "); }
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3444
      verify_region_sets();
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3445
    }
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3446
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3447
    if (!silent) { gclog_or_tty->print("HeapRegions "); }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3448
    if (GCParallelVerificationEnabled && ParallelGCThreads > 1) {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3449
      assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3450
             "sanity check");
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3451
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3452
      G1ParVerifyTask task(this, vo);
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3453
      assert(UseDynamicNumberOfGCThreads ||
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3454
        workers()->active_workers() == workers()->total_workers(),
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3455
        "If not dynamic should be using all the workers");
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3456
      int n_workers = workers()->active_workers();
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3457
      set_par_threads(n_workers);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3458
      workers()->run_task(&task);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3459
      set_par_threads(0);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3460
      if (task.failures()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3461
        failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3462
      }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3463
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3464
      // Checks that the expected amount of parallel work was done.
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3465
      // The implication is that n_workers is > 0.
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3466
      assert(check_heap_region_claim_values(HeapRegion::ParVerifyClaimValue),
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3467
             "sanity check");
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3468
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3469
      reset_heap_region_claim_values();
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3470
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3471
      assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3472
             "sanity check");
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3473
    } else {
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3474
      VerifyRegionClosure blk(false, vo);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  3475
      heap_region_iterate(&blk);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3476
      if (blk.failures()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3477
        failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3478
      }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3479
    }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3480
    if (!silent) gclog_or_tty->print("RemSet ");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3481
    rem_set()->verify();
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3482
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3483
    if (failures) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3484
      gclog_or_tty->print_cr("Heap:");
10997
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3485
      // It helps to have the per-region information in the output to
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3486
      // help us track down what went wrong. This is why we call
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3487
      // print_extended_on() instead of print_on().
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3488
      print_extended_on(gclog_or_tty);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3489
      gclog_or_tty->print_cr("");
5542
be05c5ffe905 6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents: 5540
diff changeset
  3490
#ifndef PRODUCT
4099
77d31ea5a439 6890137: G1: revamp reachable object dump
tonyp
parents: 4023
diff changeset
  3491
      if (VerifyDuringGC && G1VerifyDuringGCPrintReachable) {
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5343
diff changeset
  3492
        concurrent_mark()->print_reachable("at-verification-failure",
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3493
                                           vo, false /* all */);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3494
      }
5542
be05c5ffe905 6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents: 5540
diff changeset
  3495
#endif
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3496
      gclog_or_tty->flush();
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3497
    }
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3498
    guarantee(!failures, "there should not have been any failures");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3499
  } else {
16606
926ac1e006db 8010463: G1: Crashes with -UseTLAB and heap verification
johnc
parents: 16604
diff changeset
  3500
    if (!silent)
926ac1e006db 8010463: G1: Crashes with -UseTLAB and heap verification
johnc
parents: 16604
diff changeset
  3501
      gclog_or_tty->print("(SKIPPING roots, heapRegionSets, heapRegions, remset) ");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3502
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3503
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3504
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3505
void G1CollectedHeap::verify(bool silent) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3506
  verify(silent, VerifyOption_G1UsePrevMarking);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3507
}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3508
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3509
double G1CollectedHeap::verify(bool guard, const char* msg) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3510
  double verify_time_ms = 0.0;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3511
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3512
  if (guard && total_collections() >= VerifyGCStartAt) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3513
    double verify_start = os::elapsedTime();
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3514
    HandleMark hm;  // Discard invalid handles created during verification
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3515
    prepare_for_verify();
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3516
    Universe::verify(VerifyOption_G1UsePrevMarking, msg);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3517
    verify_time_ms = (os::elapsedTime() - verify_start) * 1000;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3518
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3519
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3520
  return verify_time_ms;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3521
}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3522
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3523
void G1CollectedHeap::verify_before_gc() {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3524
  double verify_time_ms = verify(VerifyBeforeGC, " VerifyBeforeGC:");
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3525
  g1_policy()->phase_times()->record_verify_before_time_ms(verify_time_ms);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3526
}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3527
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3528
void G1CollectedHeap::verify_after_gc() {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3529
  double verify_time_ms = verify(VerifyAfterGC, " VerifyAfterGC:");
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3530
  g1_policy()->phase_times()->record_verify_after_time_ms(verify_time_ms);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3531
}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3532
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3533
class PrintRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3534
  outputStream* _st;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3535
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3536
  PrintRegionClosure(outputStream* st) : _st(st) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3537
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3538
    r->print_on(_st);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3539
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3540
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3541
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3542
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3543
void G1CollectedHeap::print_on(outputStream* st) const {
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3544
  st->print(" %-20s", "garbage-first heap");
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3545
  st->print(" total " SIZE_FORMAT "K, used " SIZE_FORMAT "K",
3263
23d2d46c6d08 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 3262
diff changeset
  3546
            capacity()/K, used_unlocked()/K);
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3547
  st->print(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", " INTPTR_FORMAT ")",
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3548
            _g1_storage.low_boundary(),
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3549
            _g1_storage.high(),
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3550
            _g1_storage.high_boundary());
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3551
  st->cr();
10677
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
  3552
  st->print("  region size " SIZE_FORMAT "K, ", HeapRegion::GrainBytes / K);
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3553
  uint young_regions = _young_list->length();
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3554
  st->print("%u young (" SIZE_FORMAT "K), ", young_regions,
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3555
            (size_t) young_regions * HeapRegion::GrainBytes / K);
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3556
  uint survivor_regions = g1_policy()->recorded_survivor_regions();
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3557
  st->print("%u survivors (" SIZE_FORMAT "K)", survivor_regions,
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3558
            (size_t) survivor_regions * HeapRegion::GrainBytes / K);
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3559
  st->cr();
14074
8cafb11da0cd 8000358: G1: metaspace information not printed in PrintHeapAtGC output nor in hs_err file
johnc
parents: 13926
diff changeset
  3560
  MetaspaceAux::print_on(st);
10997
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3561
}
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3562
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3563
void G1CollectedHeap::print_extended_on(outputStream* st) const {
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3564
  print_on(st);
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3565
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3566
  // Print the per-region information.
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3567
  st->cr();
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3568
  st->print_cr("Heap Regions: (Y=young(eden), SU=young(survivor), "
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3569
               "HS=humongous(starts), HC=humongous(continues), "
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3570
               "CS=collection set, F=free, TS=gc time stamp, "
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3571
               "PTAMS=previous top-at-mark-start, "
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3572
               "NTAMS=next top-at-mark-start)");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3573
  PrintRegionClosure blk(st);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  3574
  heap_region_iterate(&blk);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3575
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3576
16685
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16606
diff changeset
  3577
void G1CollectedHeap::print_on_error(outputStream* st) const {
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16606
diff changeset
  3578
  this->CollectedHeap::print_on_error(st);
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16606
diff changeset
  3579
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16606
diff changeset
  3580
  if (_cm != NULL) {
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16606
diff changeset
  3581
    st->cr();
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16606
diff changeset
  3582
    _cm->print_on_error(st);
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16606
diff changeset
  3583
  }
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16606
diff changeset
  3584
}
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16606
diff changeset
  3585
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3586
void G1CollectedHeap::print_gc_threads_on(outputStream* st) const {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  3587
  if (G1CollectedHeap::use_parallel_gc_threads()) {
4022
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3588
    workers()->print_worker_threads_on(st);
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3589
  }
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3590
  _cmThread->print_on(st);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3591
  st->cr();
4022
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3592
  _cm->print_worker_threads_on(st);
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3593
  _cg1r->print_worker_threads_on(st);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3594
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3595
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3596
void G1CollectedHeap::gc_threads_do(ThreadClosure* tc) const {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  3597
  if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3598
    workers()->threads_do(tc);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3599
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3600
  tc->do_thread(_cmThread);
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  3601
  _cg1r->threads_do(tc);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3602
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3603
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3604
void G1CollectedHeap::print_tracing_info() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3605
  // We'll overload this to mean "trace GC pause statistics."
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3606
  if (TraceGen0Time || TraceGen1Time) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3607
    // The "G1CollectorPolicy" is keeping track of these stats, so delegate
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3608
    // to that.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3609
    g1_policy()->print_tracing_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3610
  }
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2345
diff changeset
  3611
  if (G1SummarizeRSetStats) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3612
    g1_rem_set()->print_summary_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3613
  }
5033
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
  3614
  if (G1SummarizeConcMark) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3615
    concurrent_mark()->print_summary_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3616
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3617
  g1_policy()->print_yg_surv_rate_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3618
  SpecializationStats::print();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3619
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3620
10000
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3621
#ifndef PRODUCT
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3622
// Helpful for debugging RSet issues.
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3623
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3624
class PrintRSetsClosure : public HeapRegionClosure {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3625
private:
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3626
  const char* _msg;
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3627
  size_t _occupied_sum;
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3628
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3629
public:
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3630
  bool doHeapRegion(HeapRegion* r) {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3631
    HeapRegionRemSet* hrrs = r->rem_set();
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3632
    size_t occupied = hrrs->occupied();
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3633
    _occupied_sum += occupied;
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3634
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3635
    gclog_or_tty->print_cr("Printing RSet for region "HR_FORMAT,
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3636
                           HR_FORMAT_PARAMS(r));
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3637
    if (occupied == 0) {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3638
      gclog_or_tty->print_cr("  RSet is empty");
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3639
    } else {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3640
      hrrs->print();
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3641
    }
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3642
    gclog_or_tty->print_cr("----------");
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3643
    return false;
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3644
  }
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3645
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3646
  PrintRSetsClosure(const char* msg) : _msg(msg), _occupied_sum(0) {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3647
    gclog_or_tty->cr();
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3648
    gclog_or_tty->print_cr("========================================");
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3649
    gclog_or_tty->print_cr(msg);
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3650
    gclog_or_tty->cr();
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3651
  }
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3652
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3653
  ~PrintRSetsClosure() {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3654
    gclog_or_tty->print_cr("Occupied Sum: "SIZE_FORMAT, _occupied_sum);
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3655
    gclog_or_tty->print_cr("========================================");
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3656
    gclog_or_tty->cr();
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3657
  }
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3658
};
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3659
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3660
void G1CollectedHeap::print_cset_rsets() {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3661
  PrintRSetsClosure cl("Printing CSet RSets");
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3662
  collection_set_iterate(&cl);
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3663
}
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3664
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3665
void G1CollectedHeap::print_all_rsets() {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3666
  PrintRSetsClosure cl("Printing All RSets");;
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3667
  heap_region_iterate(&cl);
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3668
}
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3669
#endif // PRODUCT
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3670
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3671
G1CollectedHeap* G1CollectedHeap::heap() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3672
  assert(_sh->kind() == CollectedHeap::G1CollectedHeap,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3673
         "not a garbage-first heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3674
  return _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3675
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3676
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3677
void G1CollectedHeap::gc_prologue(bool full /* Ignored */) {
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4637
diff changeset
  3678
  // always_do_update_barrier = false;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3679
  assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3680
  // Fill TLAB's and such
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3681
  ensure_parsability(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3682
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3683
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3684
void G1CollectedHeap::gc_epilogue(bool full /* Ignored */) {
17854
d65bc1546091 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 17625
diff changeset
  3685
d65bc1546091 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 17625
diff changeset
  3686
  if (G1SummarizeRSetStats &&
d65bc1546091 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 17625
diff changeset
  3687
      (G1SummarizeRSetStatsPeriod > 0) &&
d65bc1546091 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 17625
diff changeset
  3688
      // we are at the end of the GC. Total collections has already been increased.
d65bc1546091 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 17625
diff changeset
  3689
      ((total_collections() - 1) % G1SummarizeRSetStatsPeriod == 0)) {
d65bc1546091 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 17625
diff changeset
  3690
    g1_rem_set()->print_periodic_summary_info();
d65bc1546091 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 17625
diff changeset
  3691
  }
d65bc1546091 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 17625
diff changeset
  3692
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3693
  // FIXME: what is this about?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3694
  // I'm ignoring the "fill_newgen()" call if "alloc_event_enabled"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3695
  // is set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3696
  COMPILER2_PRESENT(assert(DerivedPointerTable::is_empty(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3697
                        "derived pointer present"));
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4637
diff changeset
  3698
  // always_do_update_barrier = true;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3699
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3700
  // We have just completed a GC. Update the soft reference
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3701
  // policy with the new heap occupancy
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3702
  Universe::update_heap_info_at_gc();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3703
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3704
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3705
HeapWord* G1CollectedHeap::do_collection_pause(size_t word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3706
                                               unsigned int gc_count_before,
19549
60e5c7cafdca 8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents: 19341
diff changeset
  3707
                                               bool* succeeded,
60e5c7cafdca 8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents: 19341
diff changeset
  3708
                                               GCCause::Cause gc_cause) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3709
  assert_heap_not_locked_and_not_at_safepoint();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3710
  g1_policy()->record_stop_world_start();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3711
  VM_G1IncCollectionPause op(gc_count_before,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3712
                             word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3713
                             false, /* should_initiate_conc_mark */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3714
                             g1_policy()->max_pause_time_ms(),
19549
60e5c7cafdca 8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents: 19341
diff changeset
  3715
                             gc_cause);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3716
  VMThread::execute(&op);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3717
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3718
  HeapWord* result = op.result();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3719
  bool ret_succeeded = op.prologue_succeeded() && op.pause_succeeded();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3720
  assert(result == NULL || ret_succeeded,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3721
         "the result should be NULL if the VM did not succeed");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3722
  *succeeded = ret_succeeded;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3723
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3724
  assert_heap_not_locked();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3725
  return result;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3726
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3727
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3728
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3729
G1CollectedHeap::doConcurrentMark() {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3730
  MutexLockerEx x(CGC_lock, Mutex::_no_safepoint_check_flag);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3731
  if (!_cmThread->in_progress()) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3732
    _cmThread->set_started();
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3733
    CGC_lock->notify();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3734
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3735
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3736
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3737
size_t G1CollectedHeap::pending_card_num() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3738
  size_t extra_cards = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3739
  JavaThread *curr = Threads::first();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3740
  while (curr != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3741
    DirtyCardQueue& dcq = curr->dirty_card_queue();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3742
    extra_cards += dcq.size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3743
    curr = curr->next();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3744
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3745
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3746
  size_t buffer_size = dcqs.buffer_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3747
  size_t buffer_num = dcqs.completed_buffers_num();
13482
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13481
diff changeset
  3748
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13481
diff changeset
  3749
  // PtrQueueSet::buffer_size() and PtrQueue:size() return sizes
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13481
diff changeset
  3750
  // in bytes - not the number of 'entries'. We need to convert
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13481
diff changeset
  3751
  // into a number of cards.
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13481
diff changeset
  3752
  return (buffer_size * buffer_num + extra_cards) / oopSize;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3753
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3754
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3755
size_t G1CollectedHeap::cards_scanned() {
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  3756
  return g1_rem_set()->cardsScanned();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3757
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3758
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3759
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3760
G1CollectedHeap::setup_surviving_young_words() {
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3761
  assert(_surviving_young_words == NULL, "pre-condition");
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3762
  uint array_length = g1_policy()->young_cset_region_length();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12935
diff changeset
  3763
  _surviving_young_words = NEW_C_HEAP_ARRAY(size_t, (size_t) array_length, mtGC);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3764
  if (_surviving_young_words == NULL) {
17087
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16994
diff changeset
  3765
    vm_exit_out_of_memory(sizeof(size_t) * array_length, OOM_MALLOC_ERROR,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3766
                          "Not enough space for young surv words summary.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3767
  }
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3768
  memset(_surviving_young_words, 0, (size_t) array_length * sizeof(size_t));
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3769
#ifdef ASSERT
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3770
  for (uint i = 0;  i < array_length; ++i) {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3771
    assert( _surviving_young_words[i] == 0, "memset above" );
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3772
  }
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3773
#endif // !ASSERT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3774
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3775
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3776
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3777
G1CollectedHeap::update_surviving_young_words(size_t* surv_young_words) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3778
  MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag);
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3779
  uint array_length = g1_policy()->young_cset_region_length();
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3780
  for (uint i = 0; i < array_length; ++i) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3781
    _surviving_young_words[i] += surv_young_words[i];
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3782
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3783
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3784
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3785
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3786
G1CollectedHeap::cleanup_surviving_young_words() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3787
  guarantee( _surviving_young_words != NULL, "pre-condition" );
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12935
diff changeset
  3788
  FREE_C_HEAP_ARRAY(size_t, _surviving_young_words, mtGC);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3789
  _surviving_young_words = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3790
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3791
10000
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3792
#ifdef ASSERT
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3793
class VerifyCSetClosure: public HeapRegionClosure {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3794
public:
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3795
  bool doHeapRegion(HeapRegion* hr) {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3796
    // Here we check that the CSet region's RSet is ready for parallel
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3797
    // iteration. The fields that we'll verify are only manipulated
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3798
    // when the region is part of a CSet and is collected. Afterwards,
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3799
    // we reset these fields when we clear the region's RSet (when the
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3800
    // region is freed) so they are ready when the region is
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3801
    // re-allocated. The only exception to this is if there's an
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3802
    // evacuation failure and instead of freeing the region we leave
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3803
    // it in the heap. In that case, we reset these fields during
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3804
    // evacuation failure handling.
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3805
    guarantee(hr->rem_set()->verify_ready_for_par_iteration(), "verification");
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3806
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3807
    // Here's a good place to add any other checks we'd like to
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3808
    // perform on CSet regions.
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3809
    return false;
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3810
  }
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3811
};
10000
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3812
#endif // ASSERT
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3813
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3814
#if TASKQUEUE_STATS
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3815
void G1CollectedHeap::print_taskqueue_stats_hdr(outputStream* const st) {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3816
  st->print_raw_cr("GC Task Stats");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3817
  st->print_raw("thr "); TaskQueueStats::print_header(1, st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3818
  st->print_raw("--- "); TaskQueueStats::print_header(2, st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3819
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3820
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3821
void G1CollectedHeap::print_taskqueue_stats(outputStream* const st) const {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3822
  print_taskqueue_stats_hdr(st);
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3823
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3824
  TaskQueueStats totals;
6425
206fd9fee2cf 6978300: G1: debug builds crash if ParallelGCThreads==0
jcoomes
parents: 6261
diff changeset
  3825
  const int n = workers() != NULL ? workers()->total_workers() : 1;
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3826
  for (int i = 0; i < n; ++i) {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3827
    st->print("%3d ", i); task_queue(i)->stats.print(st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3828
    totals += task_queue(i)->stats;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3829
  }
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3830
  st->print_raw("tot "); totals.print(st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3831
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3832
  DEBUG_ONLY(totals.verify());
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3833
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3834
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3835
void G1CollectedHeap::reset_taskqueue_stats() {
6425
206fd9fee2cf 6978300: G1: debug builds crash if ParallelGCThreads==0
jcoomes
parents: 6261
diff changeset
  3836
  const int n = workers() != NULL ? workers()->total_workers() : 1;
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3837
  for (int i = 0; i < n; ++i) {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3838
    task_queue(i)->stats.reset();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3839
  }
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3840
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3841
#endif // TASKQUEUE_STATS
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3842
13754
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3843
void G1CollectedHeap::log_gc_header() {
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3844
  if (!G1Log::fine()) {
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3845
    return;
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3846
  }
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3847
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3848
  gclog_or_tty->date_stamp(PrintGCDateStamps);
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3849
  gclog_or_tty->stamp(PrintGCTimeStamps);
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3850
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3851
  GCCauseString gc_cause_str = GCCauseString("GC pause", gc_cause())
15095
8ce5dcdbeb26 8005672: Clean up some changes to GC logging with GCCause's
jmasa
parents: 14740
diff changeset
  3852
    .append(g1_policy()->gcs_are_young() ? "(young)" : "(mixed)")
13754
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3853
    .append(g1_policy()->during_initial_mark_pause() ? " (initial-mark)" : "");
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3854
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3855
  gclog_or_tty->print("[%s", (const char*)gc_cause_str);
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3856
}
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3857
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3858
void G1CollectedHeap::log_gc_footer(double pause_time_sec) {
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3859
  if (!G1Log::fine()) {
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3860
    return;
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3861
  }
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3862
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3863
  if (G1Log::finer()) {
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3864
    if (evacuation_failed()) {
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3865
      gclog_or_tty->print(" (to-space exhausted)");
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3866
    }
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3867
    gclog_or_tty->print_cr(", %3.7f secs]", pause_time_sec);
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3868
    g1_policy()->phase_times()->note_gc_end();
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3869
    g1_policy()->phase_times()->print(pause_time_sec);
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3870
    g1_policy()->print_detailed_heap_transition();
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3871
  } else {
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3872
    if (evacuation_failed()) {
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3873
      gclog_or_tty->print("--");
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3874
    }
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3875
    g1_policy()->print_heap_transition();
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3876
    gclog_or_tty->print_cr(", %3.7f secs]", pause_time_sec);
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3877
  }
14634
fdd9909928ae 8004170: G1: Verbose GC output is not getting flushed to log file using JDK 8
johnc
parents: 14074
diff changeset
  3878
  gclog_or_tty->flush();
13754
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3879
}
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3880
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3881
bool
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3882
G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3883
  assert_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3884
  guarantee(!is_gc_active(), "collection is not reentrant");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3885
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3886
  if (GC_locker::check_active_before_gc()) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3887
    return false;
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3888
  }
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3889
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  3890
  _gc_timer_stw->register_gc_start(os::elapsed_counter());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  3891
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  3892
  _gc_tracer_stw->report_gc_start(gc_cause(), _gc_timer_stw->gc_start());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  3893
7896
08aadd7aa3ee 6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents: 7659
diff changeset
  3894
  SvcGCMarker sgcm(SvcGCMarker::MINOR);
7659
1d92613a1e8a 6896624: G1: hotspot:::gc and hotspot:::mem-pool-gc probes are not fired
tonyp
parents: 7658
diff changeset
  3895
  ResourceMark rm;
1d92613a1e8a 6896624: G1: hotspot:::gc and hotspot:::mem-pool-gc probes are not fired
tonyp
parents: 7658
diff changeset
  3896
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11455
diff changeset
  3897
  print_heap_before_gc();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  3898
  trace_heap_before_gc(_gc_tracer_stw);
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3899
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  3900
  HRSPhaseSetter x(HRSPhaseEvacuation);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3901
  verify_region_sets_optional();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3902
  verify_dirty_young_regions();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3903
11578
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3904
  // This call will decide whether this pause is an initial-mark
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3905
  // pause. If it is, during_initial_mark_pause() will return true
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3906
  // for the duration of this pause.
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3907
  g1_policy()->decide_on_conc_mark_initiation();
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3908
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3909
  // We do not allow initial-mark to be piggy-backed on a mixed GC.
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3910
  assert(!g1_policy()->during_initial_mark_pause() ||
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3911
          g1_policy()->gcs_are_young(), "sanity");
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3912
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3913
  // We also do not allow mixed GCs during marking.
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3914
  assert(!mark_in_progress() || g1_policy()->gcs_are_young(), "sanity");
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3915
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3916
  // Record whether this pause is an initial mark. When the current
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3917
  // thread has completed its logging output and it's safe to signal
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3918
  // the CM thread, the flag's value in the policy has been reset.
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3919
  bool should_start_conc_mark = g1_policy()->during_initial_mark_pause();
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3920
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3921
  // Inner scope for scope based logging, timers, and stats collection
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3922
  {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  3923
    EvacuationInfo evacuation_info;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  3924
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3925
    if (g1_policy()->during_initial_mark_pause()) {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3926
      // We are about to start a marking cycle, so we increment the
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3927
      // full collection counter.
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  3928
      increment_old_marking_cycles_started();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  3929
      register_concurrent_cycle_start(_gc_timer_stw->gc_start());
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3930
    }
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  3931
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  3932
    _gc_tracer_stw->report_yc_type(yc_type());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  3933
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12271
diff changeset
  3934
    TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty);
12511
24c75d495b2f 7163848: G1: Log GC Cause for a GC
brutisso
parents: 12508
diff changeset
  3935
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  3936
    int active_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  3937
                                workers()->active_workers() : 1);
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  3938
    double pause_start_sec = os::elapsedTime();
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  3939
    g1_policy()->phase_times()->note_gc_start(active_workers);
13754
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3940
    log_gc_header();
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3941
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  3942
    TraceCollectorStats tcs(g1mm()->incremental_collection_counters());
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents: 9424
diff changeset
  3943
    TraceMemoryManagerStats tms(false /* fullGC */, gc_cause());
4459
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  3944
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3945
    // If the secondary_free_list is not empty, append it to the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3946
    // free_list. No need to wait for the cleanup operation to finish;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3947
    // the region allocation code will check the secondary_free_list
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3948
    // and wait if necessary. If the G1StressConcRegionFreeing flag is
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3949
    // set, skip this step so that the region allocation code has to
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3950
    // get entries from the secondary_free_list.
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3951
    if (!G1StressConcRegionFreeing) {
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3952
      append_secondary_free_list_if_not_empty_with_lock();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3953
    }
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3954
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3955
    assert(check_young_list_well_formed(), "young list should be well formed");
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3956
    assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  3957
           "sanity check");
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3958
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3959
    // Don't dynamically change the number of GC threads this early.  A value of
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3960
    // 0 is used to indicate serial work.  When parallel work is done,
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3961
    // it will be set.
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3962
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3963
    { // Call to jvmpi::post_class_unload_events must occur outside of active GC
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3964
      IsGCActiveMark x;
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3965
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3966
      gc_prologue(false);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3967
      increment_total_collections(false /* full gc */);
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3968
      increment_gc_time_stamp();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3969
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  3970
      verify_before_gc();
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3971
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3972
      COMPILER2_PRESENT(DerivedPointerTable::clear());
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3973
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3974
      // Please see comment in g1CollectedHeap.hpp and
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3975
      // G1CollectedHeap::ref_processing_init() to see how
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3976
      // reference processing currently works in G1.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3977
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3978
      // Enable discovery in the STW reference processor
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3979
      ref_processor_stw()->enable_discovery(true /*verify_disabled*/,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3980
                                            true /*verify_no_refs*/);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3981
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3982
      {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3983
        // We want to temporarily turn off discovery by the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3984
        // CM ref processor, if necessary, and turn it back on
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3985
        // on again later if we do. Using a scoped
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3986
        // NoRefDiscovery object will do this.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3987
        NoRefDiscovery no_cm_discovery(ref_processor_cm());
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3988
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3989
        // Forget the current alloc region (we might even choose it to be part
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3990
        // of the collection set!).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3991
        release_mutator_alloc_region();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3992
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3993
        // We should call this after we retire the mutator alloc
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3994
        // region(s) so that all the ALLOC / RETIRE events are generated
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3995
        // before the start GC event.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3996
        _hr_printer.start_gc(false /* full */, (size_t) total_collections());
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3997
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  3998
        // This timing is only used by the ergonomics to handle our pause target.
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  3999
        // It is unclear why this should not include the full pause. We will
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4000
        // investigate this in CR 7178365.
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4001
        //
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4002
        // Preserving the old comment here if that helps the investigation:
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4003
        //
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4004
        // The elapsed time induced by the start time below deliberately elides
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4005
        // the possible verification above.
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4006
        double sample_start_time_sec = os::elapsedTime();
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  4007
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4008
#if YOUNG_LIST_VERBOSE
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4009
        gclog_or_tty->print_cr("\nBefore recording pause start.\nYoung_list:");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4010
        _young_list->print();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4011
        g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4012
#endif // YOUNG_LIST_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4013
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  4014
        g1_policy()->record_collection_pause_start(sample_start_time_sec);
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  4015
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  4016
        double scan_wait_start = os::elapsedTime();
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  4017
        // We have to wait until the CM threads finish scanning the
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  4018
        // root regions as it's the only way to ensure that all the
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  4019
        // objects on them have been correctly scanned before we start
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  4020
        // moving them during the GC.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  4021
        bool waited = _cm->root_regions()->wait_until_scan_finished();
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4022
        double wait_time_ms = 0.0;
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  4023
        if (waited) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  4024
          double scan_wait_end = os::elapsedTime();
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4025
          wait_time_ms = (scan_wait_end - scan_wait_start) * 1000.0;
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  4026
        }
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4027
        g1_policy()->phase_times()->record_root_region_scan_wait_time(wait_time_ms);
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  4028
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4029
#if YOUNG_LIST_VERBOSE
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4030
        gclog_or_tty->print_cr("\nAfter recording pause start.\nYoung_list:");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4031
        _young_list->print();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4032
#endif // YOUNG_LIST_VERBOSE
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4033
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4034
        if (g1_policy()->during_initial_mark_pause()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4035
          concurrent_mark()->checkpointRootsInitialPre();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4036
        }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4037
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4038
#if YOUNG_LIST_VERBOSE
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4039
        gclog_or_tty->print_cr("\nBefore choosing collection set.\nYoung_list:");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4040
        _young_list->print();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4041
        g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4042
#endif // YOUNG_LIST_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4043
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4044
        g1_policy()->finalize_cset(target_pause_time_ms, evacuation_info);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4045
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4046
        _cm->note_start_of_gc();
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4047
        // We should not verify the per-thread SATB buffers given that
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4048
        // we have not filtered them yet (we'll do so during the
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11754
diff changeset
  4049
        // GC). We also call this after finalize_cset() to
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4050
        // ensure that the CSet has been finalized.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4051
        _cm->verify_no_cset_oops(true  /* verify_stacks */,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4052
                                 true  /* verify_enqueued_buffers */,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4053
                                 false /* verify_thread_buffers */,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4054
                                 true  /* verify_fingers */);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4055
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4056
        if (_hr_printer.is_active()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4057
          HeapRegion* hr = g1_policy()->collection_set();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4058
          while (hr != NULL) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4059
            G1HRPrinter::RegionType type;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4060
            if (!hr->is_young()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4061
              type = G1HRPrinter::Old;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4062
            } else if (hr->is_survivor()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4063
              type = G1HRPrinter::Survivor;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4064
            } else {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4065
              type = G1HRPrinter::Eden;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4066
            }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4067
            _hr_printer.cset(hr);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4068
            hr = hr->next_in_collection_set();
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  4069
          }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  4070
        }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4071
10000
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  4072
#ifdef ASSERT
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4073
        VerifyCSetClosure cl;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4074
        collection_set_iterate(&cl);
10000
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  4075
#endif // ASSERT
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  4076
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4077
        setup_surviving_young_words();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4078
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4079
        // Initialize the GC alloc regions.
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4080
        init_gc_alloc_regions(evacuation_info);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4081
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4082
        // Actually do the work...
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4083
        evacuate_collection_set(evacuation_info);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4084
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4085
        // We do this to mainly verify the per-thread SATB buffers
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4086
        // (which have been filtered by now) since we didn't verify
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4087
        // them earlier. No point in re-checking the stacks / enqueued
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4088
        // buffers given that the CSet has not changed since last time
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4089
        // we checked.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4090
        _cm->verify_no_cset_oops(false /* verify_stacks */,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4091
                                 false /* verify_enqueued_buffers */,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4092
                                 true  /* verify_thread_buffers */,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4093
                                 true  /* verify_fingers */);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4094
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4095
        free_collection_set(g1_policy()->collection_set(), evacuation_info);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4096
        g1_policy()->clear_collection_set();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4097
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4098
        cleanup_surviving_young_words();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4099
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4100
        // Start a new incremental collection set for the next pause.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4101
        g1_policy()->start_incremental_cset_building();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4102
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4103
        // Clear the _cset_fast_test bitmap in anticipation of adding
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4104
        // regions to the incremental collection set for the next
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4105
        // evacuation pause.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4106
        clear_cset_fast_test();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4107
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4108
        _young_list->reset_sampled_info();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4109
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4110
        // Don't check the whole heap at this point as the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4111
        // GC alloc regions from this pause have been tagged
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4112
        // as survivors and moved on to the survivor list.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4113
        // Survivor regions will fail the !is_young() check.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4114
        assert(check_young_list_empty(false /* check_heap */),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4115
          "young list should be empty");
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4116
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4117
#if YOUNG_LIST_VERBOSE
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4118
        gclog_or_tty->print_cr("Before recording survivors.\nYoung List:");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4119
        _young_list->print();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4120
#endif // YOUNG_LIST_VERBOSE
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4121
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4122
        g1_policy()->record_survivor_regions(_young_list->survivor_length(),
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4123
                                             _young_list->first_survivor_region(),
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4124
                                             _young_list->last_survivor_region());
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4125
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4126
        _young_list->reset_auxilary_lists();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4127
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4128
        if (evacuation_failed()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4129
          _summary_bytes_used = recalculate_used();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4130
          uint n_queues = MAX2((int)ParallelGCThreads, 1);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4131
          for (uint i = 0; i < n_queues; i++) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4132
            if (_evacuation_failed_info_array[i].has_failed()) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4133
              _gc_tracer_stw->report_evacuation_failed(_evacuation_failed_info_array[i]);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4134
            }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4135
          }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4136
        } else {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4137
          // The "used" of the the collection set have already been subtracted
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4138
          // when they were freed.  Add in the bytes evacuated.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4139
          _summary_bytes_used += g1_policy()->bytes_copied_during_gc();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4140
        }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4141
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4142
        if (g1_policy()->during_initial_mark_pause()) {
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  4143
          // We have to do this before we notify the CM threads that
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  4144
          // they can start working to make sure that all the
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  4145
          // appropriate initialization is done on the CM object.
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4146
          concurrent_mark()->checkpointRootsInitialPost();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4147
          set_marking_started();
11578
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4148
          // Note that we don't actually trigger the CM thread at
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4149
          // this point. We do that later when we're sure that
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4150
          // the current thread has completed its logging output.
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4151
        }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4152
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4153
        allocate_dummy_regions();
9334
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  4154
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4155
#if YOUNG_LIST_VERBOSE
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4156
        gclog_or_tty->print_cr("\nEnd of the pause.\nYoung_list:");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4157
        _young_list->print();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4158
        g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4159
#endif // YOUNG_LIST_VERBOSE
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4160
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4161
        init_mutator_alloc_region();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4162
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4163
        {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4164
          size_t expand_bytes = g1_policy()->expansion_amount();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4165
          if (expand_bytes > 0) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4166
            size_t bytes_before = capacity();
11453
c23a9a0665ce 7125281: G1: heap expansion code is replicated
tonyp
parents: 11452
diff changeset
  4167
            // No need for an ergo verbose message here,
c23a9a0665ce 7125281: G1: heap expansion code is replicated
tonyp
parents: 11452
diff changeset
  4168
            // expansion_amount() does this when it returns a value > 0.
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4169
            if (!expand(expand_bytes)) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4170
              // We failed to expand the heap so let's verify that
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4171
              // committed/uncommitted amount match the backing store
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4172
              assert(capacity() == _g1_storage.committed_size(), "committed size mismatch");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4173
              assert(max_capacity() == _g1_storage.reserved_size(), "reserved size mismatch");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4174
            }
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  4175
          }
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  4176
        }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4177
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4178
        // We redo the verification but now wrt to the new CSet which
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4179
        // has just got initialized after the previous CSet was freed.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4180
        _cm->verify_no_cset_oops(true  /* verify_stacks */,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4181
                                 true  /* verify_enqueued_buffers */,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4182
                                 true  /* verify_thread_buffers */,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4183
                                 true  /* verify_fingers */);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4184
        _cm->note_end_of_gc();
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4185
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4186
        // This timing is only used by the ergonomics to handle our pause target.
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4187
        // It is unclear why this should not include the full pause. We will
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4188
        // investigate this in CR 7178365.
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4189
        double sample_end_time_sec = os::elapsedTime();
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4190
        double pause_time_ms = (sample_end_time_sec - sample_start_time_sec) * MILLIUNITS;
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4191
        g1_policy()->record_collection_pause_end(pause_time_ms, evacuation_info);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4192
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4193
        MemoryService::track_memory_usage();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4194
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4195
        // In prepare_for_verify() below we'll need to scan the deferred
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4196
        // update buffers to bring the RSets up-to-date if
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4197
        // G1HRRSFlushLogBuffersOnVerify has been set. While scanning
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4198
        // the update buffers we'll probably need to scan cards on the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4199
        // regions we just allocated to (i.e., the GC alloc
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4200
        // regions). However, during the last GC we called
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4201
        // set_saved_mark() on all the GC alloc regions, so card
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4202
        // scanning might skip the [saved_mark_word()...top()] area of
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4203
        // those regions (i.e., the area we allocated objects into
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4204
        // during the last GC). But it shouldn't. Given that
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4205
        // saved_mark_word() is conditional on whether the GC time stamp
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4206
        // on the region is current or not, by incrementing the GC time
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4207
        // stamp here we invalidate all the GC time stamps on all the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4208
        // regions and saved_mark_word() will simply return top() for
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4209
        // all the regions. This is a nicer way of ensuring this rather
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4210
        // than iterating over the regions and fixing them. In fact, the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4211
        // GC time stamp increment here also ensures that
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4212
        // saved_mark_word() will return top() between pauses, i.e.,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4213
        // during concurrent refinement. So we don't need the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4214
        // is_gc_active() check to decided which top to use when
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4215
        // scanning cards (see CR 7039627).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4216
        increment_gc_time_stamp();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4217
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  4218
        verify_after_gc();
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4219
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4220
        assert(!ref_processor_stw()->discovery_enabled(), "Postcondition");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4221
        ref_processor_stw()->verify_no_references_recorded();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4222
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4223
        // CM reference discovery will be re-enabled if necessary.
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  4224
      }
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  4225
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  4226
      // We should do this after we potentially expand the heap so
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  4227
      // that all the COMMIT events are generated before the end GC
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  4228
      // event, and after we retire the GC alloc regions so that all
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  4229
      // RETIRE events are generated before the end GC event.
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  4230
      _hr_printer.end_gc(false /* full */, (size_t) total_collections());
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  4231
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  4232
      if (mark_in_progress()) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  4233
        concurrent_mark()->update_g1_committed();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  4234
      }
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  4235
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  4236
#ifdef TRACESPINNING
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  4237
      ParallelTaskTerminator::print_termination_counts();
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  4238
#endif
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4239
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  4240
      gc_epilogue(false);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  4241
    }
12935
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4242
14634
fdd9909928ae 8004170: G1: Verbose GC output is not getting flushed to log file using JDK 8
johnc
parents: 14074
diff changeset
  4243
    // Print the remainder of the GC log output.
fdd9909928ae 8004170: G1: Verbose GC output is not getting flushed to log file using JDK 8
johnc
parents: 14074
diff changeset
  4244
    log_gc_footer(os::elapsedTime() - pause_start_sec);
fdd9909928ae 8004170: G1: Verbose GC output is not getting flushed to log file using JDK 8
johnc
parents: 14074
diff changeset
  4245
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4246
    // It is not yet to safe to tell the concurrent mark to
12935
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4247
    // start as we have some optional output below. We don't want the
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4248
    // output from the concurrent mark thread interfering with this
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4249
    // logging output either.
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4250
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4251
    _hrs.verify_optional();
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4252
    verify_region_sets_optional();
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4253
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4254
    TASKQUEUE_STATS_ONLY(if (ParallelGCVerbose) print_taskqueue_stats());
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4255
    TASKQUEUE_STATS_ONLY(reset_taskqueue_stats());
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4256
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4257
    print_heap_after_gc();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4258
    trace_heap_after_gc(_gc_tracer_stw);
12935
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4259
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4260
    // We must call G1MonitoringSupport::update_sizes() in the same scoping level
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4261
    // as an active TraceMemoryManagerStats object (i.e. before the destructor for the
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4262
    // TraceMemoryManagerStats is called) so that the G1 memory pools are updated
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4263
    // before any GC notifications are raised.
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4264
    g1mm()->update_sizes();
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4265
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4266
    _gc_tracer_stw->report_evacuation_info(&evacuation_info);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4267
    _gc_tracer_stw->report_tenuring_threshold(_g1_policy->tenuring_threshold());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4268
    _gc_timer_stw->register_gc_end(os::elapsed_counter());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4269
    _gc_tracer_stw->report_gc_end(_gc_timer_stw->gc_end(), _gc_timer_stw->time_partitions());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4270
  }
11578
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4271
  // It should now be safe to tell the concurrent mark thread to start
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4272
  // without its logging output interfering with the logging output
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4273
  // that came from the pause.
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4274
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4275
  if (should_start_conc_mark) {
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4276
    // CAUTION: after the doConcurrentMark() call below,
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4277
    // the concurrent marking thread(s) could be running
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4278
    // concurrently with us. Make sure that anything after
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4279
    // this point does not assume that we are the only GC thread
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4280
    // running. Note: of course, the actual marking work will
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4281
    // not start until the safepoint itself is released in
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4282
    // ConcurrentGCThread::safepoint_desynchronize().
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4283
    doConcurrentMark();
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4284
  }
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4285
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  4286
  return true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4287
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4288
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4289
size_t G1CollectedHeap::desired_plab_sz(GCAllocPurpose purpose)
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4290
{
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4291
  size_t gclab_word_size;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4292
  switch (purpose) {
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4293
    case GCAllocForSurvived:
13466
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4294
      gclab_word_size = _survivor_plab_stats.desired_plab_sz();
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4295
      break;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4296
    case GCAllocForTenured:
13466
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4297
      gclab_word_size = _old_plab_stats.desired_plab_sz();
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4298
      break;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4299
    default:
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4300
      assert(false, "unknown GCAllocPurpose");
13466
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4301
      gclab_word_size = _old_plab_stats.desired_plab_sz();
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4302
      break;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4303
  }
13466
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4304
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4305
  // Prevent humongous PLAB sizes for two reasons:
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4306
  // * PLABs are allocated using a similar paths as oops, but should
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4307
  //   never be in a humongous region
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4308
  // * Allowing humongous PLABs needlessly churns the region free lists
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4309
  return MIN2(_humongous_object_threshold_in_words, gclab_word_size);
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4310
}
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4311
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  4312
void G1CollectedHeap::init_mutator_alloc_region() {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  4313
  assert(_mutator_alloc_region.get() == NULL, "pre-condition");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  4314
  _mutator_alloc_region.init();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  4315
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  4316
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  4317
void G1CollectedHeap::release_mutator_alloc_region() {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  4318
  _mutator_alloc_region.release();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  4319
  assert(_mutator_alloc_region.get() == NULL, "post-condition");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  4320
}
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4321
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4322
void G1CollectedHeap::init_gc_alloc_regions(EvacuationInfo& evacuation_info) {
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4323
  assert_at_safepoint(true /* should_be_vm_thread */);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4324
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4325
  _survivor_gc_alloc_region.init();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4326
  _old_gc_alloc_region.init();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4327
  HeapRegion* retained_region = _retained_old_gc_alloc_region;
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4328
  _retained_old_gc_alloc_region = NULL;
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4329
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4330
  // We will discard the current GC alloc region if:
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4331
  // a) it's in the collection set (it can happen!),
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4332
  // b) it's already full (no point in using it),
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4333
  // c) it's empty (this means that it was emptied during
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4334
  // a cleanup and it should be on the free list now), or
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4335
  // d) it's humongous (this means that it was emptied
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4336
  // during a cleanup and was added to the free list, but
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4337
  // has been subsequently used to allocate a humongous
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4338
  // object that may be less than the region size).
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4339
  if (retained_region != NULL &&
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4340
      !retained_region->in_collection_set() &&
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4341
      !(retained_region->top() == retained_region->end()) &&
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4342
      !retained_region->is_empty() &&
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4343
      !retained_region->isHumongous()) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4344
    retained_region->set_saved_mark();
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  4345
    // The retained region was added to the old region set when it was
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  4346
    // retired. We have to remove it now, since we don't allow regions
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  4347
    // we allocate to in the region sets. We'll re-add it later, when
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  4348
    // it's retired again.
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  4349
    _old_set.remove(retained_region);
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4350
    bool during_im = g1_policy()->during_initial_mark_pause();
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4351
    retained_region->note_start_of_copying(during_im);
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4352
    _old_gc_alloc_region.set(retained_region);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4353
    _hr_printer.reuse(retained_region);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4354
    evacuation_info.set_alloc_regions_used_before(retained_region->used());
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4355
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4356
}
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4357
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4358
void G1CollectedHeap::release_gc_alloc_regions(uint no_of_gc_workers, EvacuationInfo& evacuation_info) {
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4359
  evacuation_info.set_allocation_regions(_survivor_gc_alloc_region.count() +
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4360
                                         _old_gc_alloc_region.count());
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4361
  _survivor_gc_alloc_region.release();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4362
  // If we have an old GC alloc region to release, we'll save it in
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4363
  // _retained_old_gc_alloc_region. If we don't
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4364
  // _retained_old_gc_alloc_region will become NULL. This is what we
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4365
  // want either way so no reason to check explicitly for either
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4366
  // condition.
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4367
  _retained_old_gc_alloc_region = _old_gc_alloc_region.release();
13466
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4368
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4369
  if (ResizePLAB) {
13926
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  4370
    _survivor_plab_stats.adjust_desired_plab_sz(no_of_gc_workers);
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  4371
    _old_plab_stats.adjust_desired_plab_sz(no_of_gc_workers);
13466
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4372
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4373
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4374
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4375
void G1CollectedHeap::abandon_gc_alloc_regions() {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4376
  assert(_survivor_gc_alloc_region.get() == NULL, "pre-condition");
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4377
  assert(_old_gc_alloc_region.get() == NULL, "pre-condition");
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4378
  _retained_old_gc_alloc_region = NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4379
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4380
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4381
void G1CollectedHeap::init_for_evac_failure(OopsInHeapRegionClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4382
  _drain_in_progress = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4383
  set_evac_failure_closure(cl);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12935
diff changeset
  4384
  _evac_failure_scan_stack = new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(40, true);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4385
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4386
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4387
void G1CollectedHeap::finalize_for_evac_failure() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4388
  assert(_evac_failure_scan_stack != NULL &&
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4389
         _evac_failure_scan_stack->length() == 0,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4390
         "Postcondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4391
  assert(!_drain_in_progress, "Postcondition");
4100
4f43ba12619a 6870843: G1: G1 GC memory leak
apetrusenko
parents: 4099
diff changeset
  4392
  delete _evac_failure_scan_stack;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4393
  _evac_failure_scan_stack = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4394
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4395
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4396
void G1CollectedHeap::remove_self_forwarding_pointers() {
11451
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4397
  assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity");
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4398
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4399
  G1ParRemoveSelfForwardPtrsTask rsfp_task(this);
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4400
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4401
  if (G1CollectedHeap::use_parallel_gc_threads()) {
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4402
    set_par_threads();
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4403
    workers()->run_task(&rsfp_task);
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4404
    set_par_threads(0);
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4405
  } else {
11451
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4406
    rsfp_task.work(0);
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4407
  }
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4408
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4409
  assert(check_cset_heap_region_claim_values(HeapRegion::ParEvacFailureClaimValue), "sanity");
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4410
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4411
  // Reset the claim values in the regions in the collection set.
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4412
  reset_cset_heap_region_claim_values();
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4413
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4414
  assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4415
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4416
  // Now restore saved marks, if any.
15608
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4417
  assert(_objs_with_preserved_marks.size() ==
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4418
            _preserved_marks_of_objs.size(), "Both or none.");
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4419
  while (!_objs_with_preserved_marks.is_empty()) {
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4420
    oop obj = _objs_with_preserved_marks.pop();
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4421
    markOop m = _preserved_marks_of_objs.pop();
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4422
    obj->set_mark(m);
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4423
  }
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4424
  _objs_with_preserved_marks.clear(true);
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4425
  _preserved_marks_of_objs.clear(true);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4426
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4427
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4428
void G1CollectedHeap::push_on_evac_failure_scan_stack(oop obj) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4429
  _evac_failure_scan_stack->push(obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4430
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4431
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4432
void G1CollectedHeap::drain_evac_failure_scan_stack() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4433
  assert(_evac_failure_scan_stack != NULL, "precondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4434
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4435
  while (_evac_failure_scan_stack->length() > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4436
     oop obj = _evac_failure_scan_stack->pop();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4437
     _evac_failure_closure->set_region(heap_region_containing(obj));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4438
     obj->oop_iterate_backwards(_evac_failure_closure);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4439
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4440
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4441
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4442
oop
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4443
G1CollectedHeap::handle_evacuation_failure_par(G1ParScanThreadState* _par_scan_state,
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4444
                                               oop old) {
9424
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4445
  assert(obj_in_cs(old),
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4446
         err_msg("obj: "PTR_FORMAT" should still be in the CSet",
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4447
                 (HeapWord*) old));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4448
  markOop m = old->mark();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4449
  oop forward_ptr = old->forward_to_atomic(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4450
  if (forward_ptr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4451
    // Forward-to-self succeeded.
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4452
    assert(_par_scan_state != NULL, "par scan state");
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4453
    OopsInHeapRegionClosure* cl = _par_scan_state->evac_failure_closure();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4454
    uint queue_num = _par_scan_state->queue_num();
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4455
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4456
    _evacuation_failed = true;
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4457
    _evacuation_failed_info_array[queue_num].register_copy_failure(old->size());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4458
    if (_evac_failure_closure != cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4459
      MutexLockerEx x(EvacFailureStack_lock, Mutex::_no_safepoint_check_flag);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4460
      assert(!_drain_in_progress,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4461
             "Should only be true while someone holds the lock.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4462
      // Set the global evac-failure closure to the current thread's.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4463
      assert(_evac_failure_closure == NULL, "Or locking has failed.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4464
      set_evac_failure_closure(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4465
      // Now do the common part.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4466
      handle_evacuation_failure_common(old, m);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4467
      // Reset to NULL.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4468
      set_evac_failure_closure(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4469
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4470
      // The lock is already held, and this is recursive.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4471
      assert(_drain_in_progress, "This should only be the recursive case.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4472
      handle_evacuation_failure_common(old, m);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4473
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4474
    return old;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4475
  } else {
9424
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4476
    // Forward-to-self failed. Either someone else managed to allocate
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4477
    // space for this object (old != forward_ptr) or they beat us in
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4478
    // self-forwarding it (old == forward_ptr).
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4479
    assert(old == forward_ptr || !obj_in_cs(forward_ptr),
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4480
           err_msg("obj: "PTR_FORMAT" forwarded to: "PTR_FORMAT" "
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4481
                   "should not be in the CSet",
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4482
                   (HeapWord*) old, (HeapWord*) forward_ptr));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4483
    return forward_ptr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4484
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4485
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4486
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4487
void G1CollectedHeap::handle_evacuation_failure_common(oop old, markOop m) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4488
  preserve_mark_if_necessary(old, m);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4489
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4490
  HeapRegion* r = heap_region_containing(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4491
  if (!r->evacuation_failed()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4492
    r->set_evacuation_failed(true);
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  4493
    _hr_printer.evac_failure(r);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4494
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4495
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4496
  push_on_evac_failure_scan_stack(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4497
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4498
  if (!_drain_in_progress) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4499
    // prevent recursion in copy_to_survivor_space()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4500
    _drain_in_progress = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4501
    drain_evac_failure_scan_stack();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4502
    _drain_in_progress = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4503
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4504
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4505
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4506
void G1CollectedHeap::preserve_mark_if_necessary(oop obj, markOop m) {
7658
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7657
diff changeset
  4507
  assert(evacuation_failed(), "Oversaving!");
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7657
diff changeset
  4508
  // We want to call the "for_promotion_failure" version only in the
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7657
diff changeset
  4509
  // case of a promotion failure.
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7657
diff changeset
  4510
  if (m->must_be_preserved_for_promotion_failure(obj)) {
15608
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4511
    _objs_with_preserved_marks.push(obj);
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4512
    _preserved_marks_of_objs.push(m);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4513
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4514
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4515
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4516
HeapWord* G1CollectedHeap::par_allocate_during_gc(GCAllocPurpose purpose,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4517
                                                  size_t word_size) {
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4518
  if (purpose == GCAllocForSurvived) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4519
    HeapWord* result = survivor_attempt_allocation(word_size);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4520
    if (result != NULL) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4521
      return result;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4522
    } else {
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4523
      // Let's try to allocate in the old gen in case we can fit the
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4524
      // object there.
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4525
      return old_attempt_allocation(word_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4526
    }
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4527
  } else {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4528
    assert(purpose ==  GCAllocForTenured, "sanity");
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4529
    HeapWord* result = old_attempt_allocation(word_size);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4530
    if (result != NULL) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4531
      return result;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4532
    } else {
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4533
      // Let's try to allocate in the survivors in case we can fit the
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4534
      // object there.
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4535
      return survivor_attempt_allocation(word_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4536
    }
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4537
  }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4538
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4539
  ShouldNotReachHere();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4540
  // Trying to keep some compilers happy.
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4541
  return NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4542
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4543
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4544
G1ParGCAllocBuffer::G1ParGCAllocBuffer(size_t gclab_word_size) :
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4545
  ParGCAllocBuffer(gclab_word_size), _retired(false) { }
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4546
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11581
diff changeset
  4547
G1ParScanThreadState::G1ParScanThreadState(G1CollectedHeap* g1h, uint queue_num)
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4548
  : _g1h(g1h),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4549
    _refs(g1h->task_queue(queue_num)),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4550
    _dcq(&g1h->dirty_card_queue_set()),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4551
    _ct_bs((CardTableModRefBS*)_g1h->barrier_set()),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4552
    _g1_rem(g1h->g1_rem_set()),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4553
    _hash_seed(17), _queue_num(queue_num),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4554
    _term_attempts(0),
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4555
    _surviving_alloc_buffer(g1h->desired_plab_sz(GCAllocForSurvived)),
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4556
    _tenured_alloc_buffer(g1h->desired_plab_sz(GCAllocForTenured)),
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4557
    _age_table(false),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4558
    _strong_roots_time(0), _term_time(0),
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4559
    _alloc_buffer_waste(0), _undo_waste(0) {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4560
  // we allocate G1YoungSurvRateNumRegions plus one entries, since
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4561
  // we "sacrifice" entry 0 to keep track of surviving bytes for
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4562
  // non-young regions (where the age is -1)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4563
  // We also add a few elements at the beginning and at the end in
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4564
  // an attempt to eliminate cache contention
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  4565
  uint real_length = 1 + _g1h->g1_policy()->young_cset_region_length();
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  4566
  uint array_length = PADDING_ELEM_NUM +
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  4567
                      real_length +
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  4568
                      PADDING_ELEM_NUM;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12935
diff changeset
  4569
  _surviving_young_words_base = NEW_C_HEAP_ARRAY(size_t, array_length, mtGC);
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4570
  if (_surviving_young_words_base == NULL)
17087
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16994
diff changeset
  4571
    vm_exit_out_of_memory(array_length * sizeof(size_t), OOM_MALLOC_ERROR,
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4572
                          "Not enough space for young surv histo.");
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4573
  _surviving_young_words = _surviving_young_words_base + PADDING_ELEM_NUM;
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  4574
  memset(_surviving_young_words, 0, (size_t) real_length * sizeof(size_t));
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4575
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4576
  _alloc_buffers[GCAllocForSurvived] = &_surviving_alloc_buffer;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4577
  _alloc_buffers[GCAllocForTenured]  = &_tenured_alloc_buffer;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4578
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4579
  _start = os::elapsedTime();
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4580
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4581
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4582
void
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4583
G1ParScanThreadState::print_termination_stats_hdr(outputStream* const st)
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4584
{
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4585
  st->print_raw_cr("GC Termination Stats");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4586
  st->print_raw_cr("     elapsed  --strong roots-- -------termination-------"
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4587
                   " ------waste (KiB)------");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4588
  st->print_raw_cr("thr     ms        ms      %        ms      %    attempts"
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4589
                   "  total   alloc    undo");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4590
  st->print_raw_cr("--- --------- --------- ------ --------- ------ --------"
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4591
                   " ------- ------- -------");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4592
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4593
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4594
void
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4595
G1ParScanThreadState::print_termination_stats(int i,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4596
                                              outputStream* const st) const
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4597
{
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4598
  const double elapsed_ms = elapsed_time() * 1000.0;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4599
  const double s_roots_ms = strong_roots_time() * 1000.0;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4600
  const double term_ms    = term_time() * 1000.0;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4601
  st->print_cr("%3d %9.2f %9.2f %6.2f "
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4602
               "%9.2f %6.2f " SIZE_FORMAT_W(8) " "
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4603
               SIZE_FORMAT_W(7) " " SIZE_FORMAT_W(7) " " SIZE_FORMAT_W(7),
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4604
               i, elapsed_ms, s_roots_ms, s_roots_ms * 100 / elapsed_ms,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4605
               term_ms, term_ms * 100 / elapsed_ms, term_attempts(),
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4606
               (alloc_buffer_waste() + undo_waste()) * HeapWordSize / K,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4607
               alloc_buffer_waste() * HeapWordSize / K,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4608
               undo_waste() * HeapWordSize / K);
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4609
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4610
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4611
#ifdef ASSERT
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4612
bool G1ParScanThreadState::verify_ref(narrowOop* ref) const {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4613
  assert(ref != NULL, "invariant");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4614
  assert(UseCompressedOops, "sanity");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4615
  assert(!has_partial_array_mask(ref), err_msg("ref=" PTR_FORMAT, ref));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4616
  oop p = oopDesc::load_decode_heap_oop(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4617
  assert(_g1h->is_in_g1_reserved(p),
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4618
         err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4619
  return true;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4620
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4621
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4622
bool G1ParScanThreadState::verify_ref(oop* ref) const {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4623
  assert(ref != NULL, "invariant");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4624
  if (has_partial_array_mask(ref)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4625
    // Must be in the collection set--it's already been copied.
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4626
    oop p = clear_partial_array_mask(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4627
    assert(_g1h->obj_in_cs(p),
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4628
           err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4629
  } else {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4630
    oop p = oopDesc::load_decode_heap_oop(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4631
    assert(_g1h->is_in_g1_reserved(p),
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4632
           err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4633
  }
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4634
  return true;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4635
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4636
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4637
bool G1ParScanThreadState::verify_task(StarTask ref) const {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4638
  if (ref.is_narrow()) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4639
    return verify_ref((narrowOop*) ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4640
  } else {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4641
    return verify_ref((oop*) ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4642
  }
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4643
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4644
#endif // ASSERT
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4645
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4646
void G1ParScanThreadState::trim_queue() {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4647
  assert(_evac_cl != NULL, "not set");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4648
  assert(_evac_failure_cl != NULL, "not set");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4649
  assert(_partial_scan_cl != NULL, "not set");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4650
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4651
  StarTask ref;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4652
  do {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4653
    // Drain the overflow stack first, so other threads can steal.
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4654
    while (refs()->pop_overflow(ref)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4655
      deal_with_reference(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4656
    }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4657
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4658
    while (refs()->pop_local(ref)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4659
      deal_with_reference(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4660
    }
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4661
  } while (!refs()->is_empty());
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4662
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4663
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4664
G1ParClosureSuper::G1ParClosureSuper(G1CollectedHeap* g1,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4665
                                     G1ParScanThreadState* par_scan_state) :
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4666
  _g1(g1), _g1_rem(_g1->g1_rem_set()), _cm(_g1->concurrent_mark()),
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4667
  _par_scan_state(par_scan_state),
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11581
diff changeset
  4668
  _worker_id(par_scan_state->queue_num()),
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4669
  _during_initial_mark(_g1->g1_policy()->during_initial_mark_pause()),
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4670
  _mark_in_progress(_g1->mark_in_progress()) { }
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4671
12271
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4672
template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4673
void G1ParCopyClosure<do_gen_barrier, barrier, do_mark_object>::mark_object(oop obj) {
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4674
#ifdef ASSERT
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4675
  HeapRegion* hr = _g1->heap_region_containing(obj);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4676
  assert(hr != NULL, "sanity");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4677
  assert(!hr->in_collection_set(), "should not mark objects in the CSet");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4678
#endif // ASSERT
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4679
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4680
  // We know that the object is not moving so it's safe to read its size.
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11581
diff changeset
  4681
  _cm->grayRoot(obj, (size_t) obj->size(), _worker_id);
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4682
}
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4683
12271
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4684
template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4685
void G1ParCopyClosure<do_gen_barrier, barrier, do_mark_object>
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4686
  ::mark_forwarded_object(oop from_obj, oop to_obj) {
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4687
#ifdef ASSERT
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4688
  assert(from_obj->is_forwarded(), "from obj should be forwarded");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4689
  assert(from_obj->forwardee() == to_obj, "to obj should be the forwardee");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4690
  assert(from_obj != to_obj, "should not be self-forwarded");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4691
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4692
  HeapRegion* from_hr = _g1->heap_region_containing(from_obj);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4693
  assert(from_hr != NULL, "sanity");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4694
  assert(from_hr->in_collection_set(), "from obj should be in the CSet");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4695
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4696
  HeapRegion* to_hr = _g1->heap_region_containing(to_obj);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4697
  assert(to_hr != NULL, "sanity");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4698
  assert(!to_hr->in_collection_set(), "should not mark objects in the CSet");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4699
#endif // ASSERT
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4700
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4701
  // The object might be in the process of being copied by another
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4702
  // worker so we cannot trust that its to-space image is
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4703
  // well-formed. So we have to read its size from its from-space
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4704
  // image which we know should not be changing.
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11581
diff changeset
  4705
  _cm->grayRoot(to_obj, (size_t) from_obj->size(), _worker_id);
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4706
}
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4707
12271
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4708
template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4709
oop G1ParCopyClosure<do_gen_barrier, barrier, do_mark_object>
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4710
  ::copy_to_survivor_space(oop old) {
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  4711
  size_t word_sz = old->size();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4712
  HeapRegion* from_region = _g1->heap_region_containing_raw(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4713
  // +1 to make the -1 indexes valid...
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4714
  int       young_index = from_region->young_index_in_cset()+1;
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4715
  assert( (from_region->is_young() && young_index >  0) ||
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4716
         (!from_region->is_young() && young_index == 0), "invariant" );
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4717
  G1CollectorPolicy* g1p = _g1->g1_policy();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4718
  markOop m = old->mark();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4719
  int age = m->has_displaced_mark_helper() ? m->displaced_mark_helper()->age()
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4720
                                           : m->age();
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4721
  GCAllocPurpose alloc_purpose = g1p->evacuation_destination(from_region, age,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4722
                                                             word_sz);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4723
  HeapWord* obj_ptr = _par_scan_state->allocate(alloc_purpose, word_sz);
13517
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4724
#ifndef PRODUCT
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4725
  // Should this evacuation fail?
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4726
  if (_g1->evacuation_should_fail()) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4727
    if (obj_ptr != NULL) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4728
      _par_scan_state->undo_allocation(alloc_purpose, obj_ptr, word_sz);
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4729
      obj_ptr = NULL;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4730
    }
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4731
  }
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4732
#endif // !PRODUCT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4733
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4734
  if (obj_ptr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4735
    // This will either forward-to-self, or detect that someone else has
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4736
    // installed a forwarding pointer.
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  4737
    return _g1->handle_evacuation_failure_par(_par_scan_state, old);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4738
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4739
13517
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4740
  oop obj = oop(obj_ptr);
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4741
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4742
  // We're going to allocate linearly, so might as well prefetch ahead.
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4743
  Prefetch::write(obj_ptr, PrefetchCopyIntervalInBytes);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4744
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4745
  oop forward_ptr = old->forward_to_atomic(obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4746
  if (forward_ptr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4747
    Copy::aligned_disjoint_words((HeapWord*) old, obj_ptr, word_sz);
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4748
    if (g1p->track_object_age(alloc_purpose)) {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4749
      // We could simply do obj->incr_age(). However, this causes a
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4750
      // performance issue. obj->incr_age() will first check whether
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4751
      // the object has a displaced mark by checking its mark word;
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4752
      // getting the mark word from the new location of the object
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4753
      // stalls. So, given that we already have the mark word and we
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4754
      // are about to install it anyway, it's better to increase the
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4755
      // age on the mark word, when the object does not have a
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4756
      // displaced mark word. We're not expecting many objects to have
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4757
      // a displaced marked word, so that case is not optimized
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4758
      // further (it could be...) and we simply call obj->incr_age().
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4759
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4760
      if (m->has_displaced_mark_helper()) {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4761
        // in this case, we have to install the mark word first,
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4762
        // otherwise obj looks to be forwarded (the old mark word,
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4763
        // which contains the forward pointer, was copied)
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4764
        obj->set_mark(m);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4765
        obj->incr_age();
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4766
      } else {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4767
        m = m->incr_age();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4768
        obj->set_mark(m);
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4769
      }
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4770
      _par_scan_state->age_table()->add(obj, word_sz);
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4771
    } else {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4772
      obj->set_mark(m);
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4773
    }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4774
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4775
    size_t* surv_young_words = _par_scan_state->surviving_young_words();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4776
    surv_young_words[young_index] += word_sz;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4777
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4778
    if (obj->is_objArray() && arrayOop(obj)->length() >= ParGCArrayScanChunk) {
11452
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4779
      // We keep track of the next start index in the length field of
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4780
      // the to-space object. The actual length can be found in the
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4781
      // length field of the from-space object.
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4782
      arrayOop(obj)->set_length(0);
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4783
      oop* old_p = set_partial_array_mask(old);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4784
      _par_scan_state->push_on_queue(old_p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4785
    } else {
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4786
      // No point in using the slower heap_region_containing() method,
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4787
      // given that we know obj is in the heap.
12271
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4788
      _scanner.set_region(_g1->heap_region_containing_raw(obj));
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4789
      obj->oop_iterate_backwards(&_scanner);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4790
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4791
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4792
    _par_scan_state->undo_allocation(alloc_purpose, obj_ptr, word_sz);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4793
    obj = forward_ptr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4794
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4795
  return obj;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4796
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4797
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4798
template <class T>
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4799
void G1ParCopyHelper::do_klass_barrier(T* p, oop new_obj) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4800
  if (_g1->heap_region_containing_raw(new_obj)->is_young()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4801
    _scanned_klass->record_modified_oops();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4802
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4803
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4804
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4805
template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4806
template <class T>
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4807
void G1ParCopyClosure<do_gen_barrier, barrier, do_mark_object>
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4808
::do_oop_work(T* p) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4809
  oop obj = oopDesc::load_decode_heap_oop(p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4810
  assert(barrier != G1BarrierRS || obj != NULL,
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4811
         "Precondition: G1BarrierRS implies obj is non-NULL");
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4812
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11581
diff changeset
  4813
  assert(_worker_id == _par_scan_state->queue_num(), "sanity");
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11581
diff changeset
  4814
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4815
  // here the null check is implicit in the cset_fast_test() test
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4816
  if (_g1->in_cset_fast_test(obj)) {
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4817
    oop forwardee;
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4818
    if (obj->is_forwarded()) {
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4819
      forwardee = obj->forwardee();
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4820
    } else {
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4821
      forwardee = copy_to_survivor_space(obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4822
    }
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4823
    assert(forwardee != NULL, "forwardee should not be NULL");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4824
    oopDesc::encode_store_heap_oop(p, forwardee);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4825
    if (do_mark_object && forwardee != obj) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4826
      // If the object is self-forwarded we don't need to explicitly
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4827
      // mark it, the evacuation failure protocol will do so.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4828
      mark_forwarded_object(obj, forwardee);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4829
    }
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4830
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4831
    // When scanning the RS, we only care about objs in CS.
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4832
    if (barrier == G1BarrierRS) {
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11581
diff changeset
  4833
      _par_scan_state->update_rs(_from, p, _worker_id);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4834
    } else if (barrier == G1BarrierKlass) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4835
      do_klass_barrier(p, forwardee);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4836
    }
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4837
  } else {
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4838
    // The object is not in collection set. If we're a root scanning
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4839
    // closure during an initial mark pause (i.e. do_mark_object will
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4840
    // be true) then attempt to mark the object.
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4841
    if (do_mark_object && _g1->is_in_g1_reserved(obj)) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4842
      mark_object(obj);
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4843
    }
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4844
  }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4845
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4846
  if (barrier == G1BarrierEvac && obj != NULL) {
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11581
diff changeset
  4847
    _par_scan_state->update_rs(_from, p, _worker_id);
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4848
  }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4849
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4850
  if (do_gen_barrier && obj != NULL) {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4851
    par_do_barrier(p);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4852
  }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4853
}
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4854
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4855
template void G1ParCopyClosure<false, G1BarrierEvac, false>::do_oop_work(oop* p);
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4856
template void G1ParCopyClosure<false, G1BarrierEvac, false>::do_oop_work(narrowOop* p);
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4857
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4858
template <class T> void G1ParScanPartialArrayClosure::do_oop_nv(T* p) {
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4859
  assert(has_partial_array_mask(p), "invariant");
11452
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4860
  oop from_obj = clear_partial_array_mask(p);
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4861
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4862
  assert(Universe::heap()->is_in_reserved(from_obj), "must be in heap.");
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4863
  assert(from_obj->is_objArray(), "must be obj array");
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4864
  objArrayOop from_obj_array = objArrayOop(from_obj);
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4865
  // The from-space object contains the real length.
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4866
  int length                 = from_obj_array->length();
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4867
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4868
  assert(from_obj->is_forwarded(), "must be forwarded");
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4869
  oop to_obj                 = from_obj->forwardee();
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4870
  assert(from_obj != to_obj, "should not be chunking self-forwarded objects");
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4871
  objArrayOop to_obj_array   = objArrayOop(to_obj);
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4872
  // We keep track of the next start index in the length field of the
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4873
  // to-space object.
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4874
  int next_index             = to_obj_array->length();
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4875
  assert(0 <= next_index && next_index < length,
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4876
         err_msg("invariant, next index: %d, length: %d", next_index, length));
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4877
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4878
  int start                  = next_index;
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4879
  int end                    = length;
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4880
  int remainder              = end - start;
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4881
  // We'll try not to push a range that's smaller than ParGCArrayScanChunk.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4882
  if (remainder > 2 * ParGCArrayScanChunk) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4883
    end = start + ParGCArrayScanChunk;
11452
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4884
    to_obj_array->set_length(end);
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4885
    // Push the remainder before we process the range in case another
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4886
    // worker has run out of things to do and can steal it.
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4887
    oop* from_obj_p = set_partial_array_mask(from_obj);
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4888
    _par_scan_state->push_on_queue(from_obj_p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4889
  } else {
11452
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4890
    assert(length == end, "sanity");
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4891
    // We'll process the final range for this object. Restore the length
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4892
    // so that the heap remains parsable in case of evacuation failure.
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4893
    to_obj_array->set_length(end);
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4894
  }
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4895
  _scanner.set_region(_g1->heap_region_containing_raw(to_obj));
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4896
  // Process indexes [start,end). It will also process the header
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4897
  // along with the first chunk (i.e., the chunk with start == 0).
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4898
  // Note that at this point the length field of to_obj_array is not
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4899
  // correct given that we are using it to keep track of the next
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4900
  // start index. oop_iterate_range() (thankfully!) ignores the length
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4901
  // field and only relies on the start / end parameters.  It does
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4902
  // however return the size of the object which will be incorrect. So
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4903
  // we have to ignore it even if we wanted to use it.
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4904
  to_obj_array->oop_iterate_range(&_scanner, start, end);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4905
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4906
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4907
class G1ParEvacuateFollowersClosure : public VoidClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4908
protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4909
  G1CollectedHeap*              _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4910
  G1ParScanThreadState*         _par_scan_state;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4911
  RefToScanQueueSet*            _queues;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4912
  ParallelTaskTerminator*       _terminator;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4913
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4914
  G1ParScanThreadState*   par_scan_state() { return _par_scan_state; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4915
  RefToScanQueueSet*      queues()         { return _queues; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4916
  ParallelTaskTerminator* terminator()     { return _terminator; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4917
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4918
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4919
  G1ParEvacuateFollowersClosure(G1CollectedHeap* g1h,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4920
                                G1ParScanThreadState* par_scan_state,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4921
                                RefToScanQueueSet* queues,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4922
                                ParallelTaskTerminator* terminator)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4923
    : _g1h(g1h), _par_scan_state(par_scan_state),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4924
      _queues(queues), _terminator(terminator) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4925
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4926
  void do_void();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4927
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4928
private:
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4929
  inline bool offer_termination();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4930
};
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4931
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4932
bool G1ParEvacuateFollowersClosure::offer_termination() {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4933
  G1ParScanThreadState* const pss = par_scan_state();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4934
  pss->start_term_time();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4935
  const bool res = terminator()->offer_termination();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4936
  pss->end_term_time();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4937
  return res;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4938
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4939
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4940
void G1ParEvacuateFollowersClosure::do_void() {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4941
  StarTask stolen_task;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4942
  G1ParScanThreadState* const pss = par_scan_state();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4943
  pss->trim_queue();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4944
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4945
  do {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4946
    while (queues()->steal(pss->queue_num(), pss->hash_seed(), stolen_task)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4947
      assert(pss->verify_task(stolen_task), "sanity");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4948
      if (stolen_task.is_narrow()) {
6980
d19831e79825 6990359: G1: don't push a stolen entry on the taskqueue, deal with it directly
tonyp
parents: 6959
diff changeset
  4949
        pss->deal_with_reference((narrowOop*) stolen_task);
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4950
      } else {
6980
d19831e79825 6990359: G1: don't push a stolen entry on the taskqueue, deal with it directly
tonyp
parents: 6959
diff changeset
  4951
        pss->deal_with_reference((oop*) stolen_task);
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4952
      }
6980
d19831e79825 6990359: G1: don't push a stolen entry on the taskqueue, deal with it directly
tonyp
parents: 6959
diff changeset
  4953
d19831e79825 6990359: G1: don't push a stolen entry on the taskqueue, deal with it directly
tonyp
parents: 6959
diff changeset
  4954
      // We've just processed a reference and we might have made
d19831e79825 6990359: G1: don't push a stolen entry on the taskqueue, deal with it directly
tonyp
parents: 6959
diff changeset
  4955
      // available new entries on the queues. So we have to make sure
d19831e79825 6990359: G1: don't push a stolen entry on the taskqueue, deal with it directly
tonyp
parents: 6959
diff changeset
  4956
      // we drain the queues as necessary.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4957
      pss->trim_queue();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4958
    }
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4959
  } while (!offer_termination());
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4960
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4961
  pss->retire_alloc_buffers();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4962
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4963
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4964
class G1KlassScanClosure : public KlassClosure {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4965
 G1ParCopyHelper* _closure;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4966
 bool             _process_only_dirty;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4967
 int              _count;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4968
 public:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4969
  G1KlassScanClosure(G1ParCopyHelper* closure, bool process_only_dirty)
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4970
      : _process_only_dirty(process_only_dirty), _closure(closure), _count(0) {}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4971
  void do_klass(Klass* klass) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4972
    // If the klass has not been dirtied we know that there's
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4973
    // no references into  the young gen and we can skip it.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4974
   if (!_process_only_dirty || klass->has_modified_oops()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4975
      // Clean the klass since we're going to scavenge all the metadata.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4976
      klass->clear_modified_oops();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4977
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4978
      // Tell the closure that this klass is the Klass to scavenge
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4979
      // and is the one to dirty if oops are left pointing into the young gen.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4980
      _closure->set_scanned_klass(klass);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4981
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4982
      klass->oops_do(_closure);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4983
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4984
      _closure->set_scanned_klass(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4985
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4986
    _count++;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4987
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4988
};
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4989
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4990
class G1ParTask : public AbstractGangTask {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4991
protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4992
  G1CollectedHeap*       _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4993
  RefToScanQueueSet      *_queues;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4994
  ParallelTaskTerminator _terminator;
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  4995
  uint _n_workers;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4996
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4997
  Mutex _stats_lock;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4998
  Mutex* stats_lock() { return &_stats_lock; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4999
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5000
  size_t getNCards() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5001
    return (_g1h->capacity() + G1BlockOffsetSharedArray::N_bytes - 1)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5002
      / G1BlockOffsetSharedArray::N_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5003
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5004
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5005
public:
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5006
  G1ParTask(G1CollectedHeap* g1h,
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5007
            RefToScanQueueSet *task_queues)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5008
    : AbstractGangTask("G1 collection"),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5009
      _g1h(g1h),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5010
      _queues(task_queues),
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5011
      _terminator(0, _queues),
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5012
      _stats_lock(Mutex::leaf, "parallel G1 stats lock", true)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5013
  {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5014
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5015
  RefToScanQueueSet* queues() { return _queues; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5016
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5017
  RefToScanQueue *work_queue(int i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5018
    return queues()->queue(i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5019
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5020
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5021
  ParallelTaskTerminator* terminator() { return &_terminator; }
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5022
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5023
  virtual void set_for_termination(int active_workers) {
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5024
    // This task calls set_n_termination() in par_non_clean_card_iterate_work()
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5025
    // in the young space (_par_seq_tasks) in the G1 heap
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5026
    // for SequentialSubTasksDone.
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5027
    // This task also uses SubTasksDone in SharedHeap and G1CollectedHeap
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5028
    // both of which need setting by set_n_termination().
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5029
    _g1h->SharedHeap::set_n_termination(active_workers);
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5030
    _g1h->set_n_termination(active_workers);
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5031
    terminator()->reset_for_reuse(active_workers);
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5032
    _n_workers = active_workers;
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5033
  }
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5034
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5035
  void work(uint worker_id) {
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5036
    if (worker_id >= _n_workers) return;  // no work needed this round
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  5037
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  5038
    double start_time_ms = os::elapsedTime() * 1000.0;
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  5039
    _g1h->g1_policy()->phase_times()->record_gc_worker_start_time(worker_id, start_time_ms);
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  5040
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5041
    {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5042
      ResourceMark rm;
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5043
      HandleMark   hm;
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5044
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5045
      ReferenceProcessor*             rp = _g1h->ref_processor_stw();
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5046
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5047
      G1ParScanThreadState            pss(_g1h, worker_id);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5048
      G1ParScanHeapEvacClosure        scan_evac_cl(_g1h, &pss, rp);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5049
      G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, rp);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5050
      G1ParScanPartialArrayClosure    partial_scan_cl(_g1h, &pss, rp);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5051
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5052
      pss.set_evac_closure(&scan_evac_cl);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5053
      pss.set_evac_failure_closure(&evac_failure_cl);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5054
      pss.set_partial_scan_closure(&partial_scan_cl);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5055
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5056
      G1ParScanExtRootClosure        only_scan_root_cl(_g1h, &pss, rp);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5057
      G1ParScanMetadataClosure       only_scan_metadata_cl(_g1h, &pss, rp);
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5058
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5059
      G1ParScanAndMarkExtRootClosure scan_mark_root_cl(_g1h, &pss, rp);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5060
      G1ParScanAndMarkMetadataClosure scan_mark_metadata_cl(_g1h, &pss, rp);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5061
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5062
      bool only_young                 = _g1h->g1_policy()->gcs_are_young();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5063
      G1KlassScanClosure              scan_mark_klasses_cl_s(&scan_mark_metadata_cl, false);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5064
      G1KlassScanClosure              only_scan_klasses_cl_s(&only_scan_metadata_cl, only_young);
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5065
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5066
      OopClosure*                    scan_root_cl = &only_scan_root_cl;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5067
      G1KlassScanClosure*            scan_klasses_cl = &only_scan_klasses_cl_s;
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5068
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5069
      if (_g1h->g1_policy()->during_initial_mark_pause()) {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5070
        // We also need to mark copied objects.
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5071
        scan_root_cl = &scan_mark_root_cl;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5072
        scan_klasses_cl = &scan_mark_klasses_cl_s;
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5073
      }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5074
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5075
      G1ParPushHeapRSClosure          push_heap_rs_cl(_g1h, &pss);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5076
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5077
      // Don't scan the scavengable methods in the code cache as part
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5078
      // of strong root scanning. The code roots that point into a
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5079
      // region in the collection set are scanned when we scan the
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5080
      // region's RSet.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5081
      int so = SharedHeap::SO_AllClasses | SharedHeap::SO_Strings;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5082
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5083
      pss.start_strong_roots();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5084
      _g1h->g1_process_strong_roots(/* is scavenging */ true,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5085
                                    SharedHeap::ScanningOption(so),
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5086
                                    scan_root_cl,
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5087
                                    &push_heap_rs_cl,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5088
                                    scan_klasses_cl,
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5089
                                    worker_id);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5090
      pss.end_strong_roots();
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5091
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5092
      {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5093
        double start = os::elapsedTime();
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5094
        G1ParEvacuateFollowersClosure evac(_g1h, &pss, _queues, &_terminator);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5095
        evac.do_void();
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5096
        double elapsed_ms = (os::elapsedTime()-start)*1000.0;
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5097
        double term_ms = pss.term_time()*1000.0;
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  5098
        _g1h->g1_policy()->phase_times()->add_obj_copy_time(worker_id, elapsed_ms-term_ms);
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  5099
        _g1h->g1_policy()->phase_times()->record_termination(worker_id, term_ms, pss.term_attempts());
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5100
      }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5101
      _g1h->g1_policy()->record_thread_age_table(pss.age_table());
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5102
      _g1h->update_surviving_young_words(pss.surviving_young_words()+1);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5103
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5104
      if (ParallelGCVerbose) {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5105
        MutexLocker x(stats_lock());
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5106
        pss.print_termination_stats(worker_id);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5107
      }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5108
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5109
      assert(pss.refs()->is_empty(), "should be empty");
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5110
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5111
      // Close the inner scope so that the ResourceMark and HandleMark
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5112
      // destructors are executed here and are included as part of the
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5113
      // "GC Worker Time".
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5114
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5115
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  5116
    double end_time_ms = os::elapsedTime() * 1000.0;
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  5117
    _g1h->g1_policy()->phase_times()->record_gc_worker_end_time(worker_id, end_time_ms);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5118
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5119
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5120
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5121
// *** Common G1 Evacuation Stuff
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5122
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  5123
// This method is run in a GC worker.
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  5124
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5125
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5126
G1CollectedHeap::
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5127
g1_process_strong_roots(bool is_scavenging,
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  5128
                        ScanningOption so,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5129
                        OopClosure* scan_non_heap_roots,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5130
                        OopsInHeapRegionClosure* scan_rs,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5131
                        G1KlassScanClosure* scan_klasses,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5132
                        int worker_i) {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5133
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5134
  // First scan the strong roots
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5135
  double ext_roots_start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5136
  double closure_app_time_sec = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5137
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5138
  BufferingOopClosure buf_scan_non_heap_roots(scan_non_heap_roots);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5139
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5140
  assert(so & SO_CodeCache || scan_rs != NULL, "must scan code roots somehow");
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5141
  // Walk the code cache/strong code roots w/o buffering, because StarTask
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5142
  // cannot handle unaligned oop locations.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5143
  CodeBlobToOopClosure eager_scan_code_roots(scan_non_heap_roots, true /* do_marking */);
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  5144
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  5145
  process_strong_roots(false, // no scoping; this is parallel code
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5146
                       is_scavenging, so,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5147
                       &buf_scan_non_heap_roots,
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  5148
                       &eager_scan_code_roots,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5149
                       scan_klasses
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5150
                       );
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5151
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5152
  // Now the CM ref_processor roots.
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  5153
  if (!_process_strong_tasks->is_task_claimed(G1H_PS_refProcessor_oops_do)) {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5154
    // We need to treat the discovered reference lists of the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5155
    // concurrent mark ref processor as roots and keep entries
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5156
    // (which are added by the marking threads) on them live
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5157
    // until they can be processed at the end of marking.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5158
    ref_processor_cm()->weak_oops_do(&buf_scan_non_heap_roots);
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  5159
  }
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  5160
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  5161
  // Finish up any enqueued closure apps (attributed as object copy time).
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5162
  buf_scan_non_heap_roots.done();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5163
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5164
  double obj_copy_time_sec = buf_scan_non_heap_roots.closure_app_seconds();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5165
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  5166
  g1_policy()->phase_times()->record_obj_copy_time(worker_i, obj_copy_time_sec * 1000.0);
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  5167
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5168
  double ext_root_time_ms =
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  5169
    ((os::elapsedTime() - ext_roots_start) - obj_copy_time_sec) * 1000.0;
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  5170
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  5171
  g1_policy()->phase_times()->record_ext_root_scan_time(worker_i, ext_root_time_ms);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5172
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  5173
  // During conc marking we have to filter the per-thread SATB buffers
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  5174
  // to make sure we remove any oops into the CSet (which will show up
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  5175
  // as implicitly live).
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  5176
  double satb_filtering_ms = 0.0;
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  5177
  if (!_process_strong_tasks->is_task_claimed(G1H_PS_filter_satb_buffers)) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  5178
    if (mark_in_progress()) {
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  5179
      double satb_filter_start = os::elapsedTime();
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  5180
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  5181
      JavaThread::satb_mark_queue_set().filter_thread_buffers();
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  5182
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  5183
      satb_filtering_ms = (os::elapsedTime() - satb_filter_start) * 1000.0;
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  5184
    }
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  5185
  }
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  5186
  g1_policy()->phase_times()->record_satb_filtering_time(worker_i, satb_filtering_ms);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5187
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5188
  // If this is an initial mark pause, and we're not scanning
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5189
  // the entire code cache, we need to mark the oops in the
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5190
  // strong code root lists for the regions that are not in
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5191
  // the collection set.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5192
  // Note all threads participate in this set of root tasks.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5193
  double mark_strong_code_roots_ms = 0.0;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5194
  if (g1_policy()->during_initial_mark_pause() && !(so & SO_CodeCache)) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5195
    double mark_strong_roots_start = os::elapsedTime();
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5196
    mark_strong_code_roots(worker_i);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5197
    mark_strong_code_roots_ms = (os::elapsedTime() - mark_strong_roots_start) * 1000.0;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5198
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5199
  g1_policy()->phase_times()->record_strong_code_root_mark_time(worker_i, mark_strong_code_roots_ms);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5200
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5201
  // Now scan the complement of the collection set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5202
  if (scan_rs != NULL) {
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5203
    g1_rem_set()->oops_into_collection_set_do(scan_rs, &eager_scan_code_roots, worker_i);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5204
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5205
  _process_strong_tasks->all_tasks_completed();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5206
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5207
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5208
void
17105
25b392a7740d 8012687: Remove unused is_root checks and closures
stefank
parents: 16994
diff changeset
  5209
G1CollectedHeap::g1_process_weak_roots(OopClosure* root_closure) {
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  5210
  CodeBlobToOopClosure roots_in_blobs(root_closure, /*do_marking=*/ false);
17105
25b392a7740d 8012687: Remove unused is_root checks and closures
stefank
parents: 16994
diff changeset
  5211
  SharedHeap::process_weak_roots(root_closure, &roots_in_blobs);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5212
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5213
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5214
// Weak Reference Processing support
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5215
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5216
// An always "is_alive" closure that is used to preserve referents.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5217
// If the object is non-null then it's alive.  Used in the preservation
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5218
// of referent objects that are pointed to by reference objects
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5219
// discovered by the CM ref processor.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5220
class G1AlwaysAliveClosure: public BoolObjectClosure {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5221
  G1CollectedHeap* _g1;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5222
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5223
  G1AlwaysAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5224
  bool do_object_b(oop p) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5225
    if (p != NULL) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5226
      return true;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5227
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5228
    return false;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5229
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5230
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5231
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5232
bool G1STWIsAliveClosure::do_object_b(oop p) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5233
  // An object is reachable if it is outside the collection set,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5234
  // or is inside and copied.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5235
  return !_g1->obj_in_cs(p) || p->is_forwarded();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5236
}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5237
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5238
// Non Copying Keep Alive closure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5239
class G1KeepAliveClosure: public OopClosure {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5240
  G1CollectedHeap* _g1;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5241
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5242
  G1KeepAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5243
  void do_oop(narrowOop* p) { guarantee(false, "Not needed"); }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5244
  void do_oop(      oop* p) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5245
    oop obj = *p;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5246
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5247
    if (_g1->obj_in_cs(obj)) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5248
      assert( obj->is_forwarded(), "invariant" );
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5249
      *p = obj->forwardee();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5250
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5251
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5252
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5253
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5254
// Copying Keep Alive closure - can be called from both
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5255
// serial and parallel code as long as different worker
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5256
// threads utilize different G1ParScanThreadState instances
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5257
// and different queues.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5258
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5259
class G1CopyingKeepAliveClosure: public OopClosure {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5260
  G1CollectedHeap*         _g1h;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5261
  OopClosure*              _copy_non_heap_obj_cl;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5262
  OopsInHeapRegionClosure* _copy_metadata_obj_cl;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5263
  G1ParScanThreadState*    _par_scan_state;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5264
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5265
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5266
  G1CopyingKeepAliveClosure(G1CollectedHeap* g1h,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5267
                            OopClosure* non_heap_obj_cl,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5268
                            OopsInHeapRegionClosure* metadata_obj_cl,
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5269
                            G1ParScanThreadState* pss):
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5270
    _g1h(g1h),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5271
    _copy_non_heap_obj_cl(non_heap_obj_cl),
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5272
    _copy_metadata_obj_cl(metadata_obj_cl),
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5273
    _par_scan_state(pss)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5274
  {}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5275
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5276
  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5277
  virtual void do_oop(      oop* p) { do_oop_work(p); }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5278
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5279
  template <class T> void do_oop_work(T* p) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5280
    oop obj = oopDesc::load_decode_heap_oop(p);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5281
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5282
    if (_g1h->obj_in_cs(obj)) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5283
      // If the referent object has been forwarded (either copied
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5284
      // to a new location or to itself in the event of an
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5285
      // evacuation failure) then we need to update the reference
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5286
      // field and, if both reference and referent are in the G1
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5287
      // heap, update the RSet for the referent.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5288
      //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5289
      // If the referent has not been forwarded then we have to keep
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5290
      // it alive by policy. Therefore we have copy the referent.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5291
      //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5292
      // If the reference field is in the G1 heap then we can push
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5293
      // on the PSS queue. When the queue is drained (after each
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5294
      // phase of reference processing) the object and it's followers
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5295
      // will be copied, the reference field set to point to the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5296
      // new location, and the RSet updated. Otherwise we need to
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5297
      // use the the non-heap or metadata closures directly to copy
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5298
      // the referent object and update the pointer, while avoiding
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5299
      // updating the RSet.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5300
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5301
      if (_g1h->is_in_g1_reserved(p)) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5302
        _par_scan_state->push_on_queue(p);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5303
      } else {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5304
        assert(!ClassLoaderDataGraph::contains((address)p),
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5305
               err_msg("Otherwise need to call _copy_metadata_obj_cl->do_oop(p) "
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5306
                              PTR_FORMAT, p));
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5307
          _copy_non_heap_obj_cl->do_oop(p);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5308
        }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5309
      }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5310
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5311
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5312
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5313
// Serial drain queue closure. Called as the 'complete_gc'
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5314
// closure for each discovered list in some of the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5315
// reference processing phases.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5316
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5317
class G1STWDrainQueueClosure: public VoidClosure {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5318
protected:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5319
  G1CollectedHeap* _g1h;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5320
  G1ParScanThreadState* _par_scan_state;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5321
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5322
  G1ParScanThreadState*   par_scan_state() { return _par_scan_state; }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5323
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5324
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5325
  G1STWDrainQueueClosure(G1CollectedHeap* g1h, G1ParScanThreadState* pss) :
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5326
    _g1h(g1h),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5327
    _par_scan_state(pss)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5328
  { }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5329
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5330
  void do_void() {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5331
    G1ParScanThreadState* const pss = par_scan_state();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5332
    pss->trim_queue();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5333
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5334
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5335
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5336
// Parallel Reference Processing closures
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5337
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5338
// Implementation of AbstractRefProcTaskExecutor for parallel reference
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5339
// processing during G1 evacuation pauses.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5340
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5341
class G1STWRefProcTaskExecutor: public AbstractRefProcTaskExecutor {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5342
private:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5343
  G1CollectedHeap*   _g1h;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5344
  RefToScanQueueSet* _queues;
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5345
  FlexibleWorkGang*  _workers;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5346
  int                _active_workers;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5347
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5348
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5349
  G1STWRefProcTaskExecutor(G1CollectedHeap* g1h,
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5350
                        FlexibleWorkGang* workers,
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5351
                        RefToScanQueueSet *task_queues,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5352
                        int n_workers) :
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5353
    _g1h(g1h),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5354
    _queues(task_queues),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5355
    _workers(workers),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5356
    _active_workers(n_workers)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5357
  {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5358
    assert(n_workers > 0, "shouldn't call this otherwise");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5359
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5360
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5361
  // Executes the given task using concurrent marking worker threads.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5362
  virtual void execute(ProcessTask& task);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5363
  virtual void execute(EnqueueTask& task);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5364
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5365
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5366
// Gang task for possibly parallel reference processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5367
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5368
class G1STWRefProcTaskProxy: public AbstractGangTask {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5369
  typedef AbstractRefProcTaskExecutor::ProcessTask ProcessTask;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5370
  ProcessTask&     _proc_task;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5371
  G1CollectedHeap* _g1h;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5372
  RefToScanQueueSet *_task_queues;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5373
  ParallelTaskTerminator* _terminator;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5374
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5375
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5376
  G1STWRefProcTaskProxy(ProcessTask& proc_task,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5377
                     G1CollectedHeap* g1h,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5378
                     RefToScanQueueSet *task_queues,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5379
                     ParallelTaskTerminator* terminator) :
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5380
    AbstractGangTask("Process reference objects in parallel"),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5381
    _proc_task(proc_task),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5382
    _g1h(g1h),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5383
    _task_queues(task_queues),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5384
    _terminator(terminator)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5385
  {}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5386
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5387
  virtual void work(uint worker_id) {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5388
    // The reference processing task executed by a single worker.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5389
    ResourceMark rm;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5390
    HandleMark   hm;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5391
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5392
    G1STWIsAliveClosure is_alive(_g1h);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5393
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5394
    G1ParScanThreadState pss(_g1h, worker_id);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5395
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5396
    G1ParScanHeapEvacClosure        scan_evac_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5397
    G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5398
    G1ParScanPartialArrayClosure    partial_scan_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5399
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5400
    pss.set_evac_closure(&scan_evac_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5401
    pss.set_evac_failure_closure(&evac_failure_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5402
    pss.set_partial_scan_closure(&partial_scan_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5403
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5404
    G1ParScanExtRootClosure        only_copy_non_heap_cl(_g1h, &pss, NULL);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5405
    G1ParScanMetadataClosure       only_copy_metadata_cl(_g1h, &pss, NULL);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5406
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5407
    G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(_g1h, &pss, NULL);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5408
    G1ParScanAndMarkMetadataClosure copy_mark_metadata_cl(_g1h, &pss, NULL);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5409
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5410
    OopClosure*                    copy_non_heap_cl = &only_copy_non_heap_cl;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5411
    OopsInHeapRegionClosure*       copy_metadata_cl = &only_copy_metadata_cl;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5412
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5413
    if (_g1h->g1_policy()->during_initial_mark_pause()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5414
      // We also need to mark copied objects.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5415
      copy_non_heap_cl = &copy_mark_non_heap_cl;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5416
      copy_metadata_cl = &copy_mark_metadata_cl;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5417
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5418
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5419
    // Keep alive closure.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5420
    G1CopyingKeepAliveClosure keep_alive(_g1h, copy_non_heap_cl, copy_metadata_cl, &pss);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5421
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5422
    // Complete GC closure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5423
    G1ParEvacuateFollowersClosure drain_queue(_g1h, &pss, _task_queues, _terminator);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5424
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5425
    // Call the reference processing task's work routine.
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5426
    _proc_task.work(worker_id, is_alive, keep_alive, drain_queue);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5427
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5428
    // Note we cannot assert that the refs array is empty here as not all
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5429
    // of the processing tasks (specifically phase2 - pp2_work) execute
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5430
    // the complete_gc closure (which ordinarily would drain the queue) so
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5431
    // the queue may not be empty.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5432
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5433
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5434
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5435
// Driver routine for parallel reference processing.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5436
// Creates an instance of the ref processing gang
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5437
// task and has the worker threads execute it.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5438
void G1STWRefProcTaskExecutor::execute(ProcessTask& proc_task) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5439
  assert(_workers != NULL, "Need parallel worker threads.");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5440
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5441
  ParallelTaskTerminator terminator(_active_workers, _queues);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5442
  G1STWRefProcTaskProxy proc_task_proxy(proc_task, _g1h, _queues, &terminator);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5443
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5444
  _g1h->set_par_threads(_active_workers);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5445
  _workers->run_task(&proc_task_proxy);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5446
  _g1h->set_par_threads(0);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5447
}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5448
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5449
// Gang task for parallel reference enqueueing.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5450
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5451
class G1STWRefEnqueueTaskProxy: public AbstractGangTask {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5452
  typedef AbstractRefProcTaskExecutor::EnqueueTask EnqueueTask;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5453
  EnqueueTask& _enq_task;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5454
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5455
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5456
  G1STWRefEnqueueTaskProxy(EnqueueTask& enq_task) :
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5457
    AbstractGangTask("Enqueue reference objects in parallel"),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5458
    _enq_task(enq_task)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5459
  { }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5460
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5461
  virtual void work(uint worker_id) {
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5462
    _enq_task.work(worker_id);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5463
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5464
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5465
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5466
// Driver routine for parallel reference enqueueing.
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5467
// Creates an instance of the ref enqueueing gang
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5468
// task and has the worker threads execute it.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5469
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5470
void G1STWRefProcTaskExecutor::execute(EnqueueTask& enq_task) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5471
  assert(_workers != NULL, "Need parallel worker threads.");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5472
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5473
  G1STWRefEnqueueTaskProxy enq_task_proxy(enq_task);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5474
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5475
  _g1h->set_par_threads(_active_workers);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5476
  _workers->run_task(&enq_task_proxy);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5477
  _g1h->set_par_threads(0);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5478
}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5479
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5480
// End of weak reference support closures
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5481
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5482
// Abstract task used to preserve (i.e. copy) any referent objects
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5483
// that are in the collection set and are pointed to by reference
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5484
// objects discovered by the CM ref processor.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5485
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5486
class G1ParPreserveCMReferentsTask: public AbstractGangTask {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5487
protected:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5488
  G1CollectedHeap* _g1h;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5489
  RefToScanQueueSet      *_queues;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5490
  ParallelTaskTerminator _terminator;
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5491
  uint _n_workers;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5492
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5493
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5494
  G1ParPreserveCMReferentsTask(G1CollectedHeap* g1h,int workers, RefToScanQueueSet *task_queues) :
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5495
    AbstractGangTask("ParPreserveCMReferents"),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5496
    _g1h(g1h),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5497
    _queues(task_queues),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5498
    _terminator(workers, _queues),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5499
    _n_workers(workers)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5500
  { }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5501
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5502
  void work(uint worker_id) {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5503
    ResourceMark rm;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5504
    HandleMark   hm;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5505
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5506
    G1ParScanThreadState            pss(_g1h, worker_id);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5507
    G1ParScanHeapEvacClosure        scan_evac_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5508
    G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5509
    G1ParScanPartialArrayClosure    partial_scan_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5510
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5511
    pss.set_evac_closure(&scan_evac_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5512
    pss.set_evac_failure_closure(&evac_failure_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5513
    pss.set_partial_scan_closure(&partial_scan_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5514
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5515
    assert(pss.refs()->is_empty(), "both queue and overflow should be empty");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5516
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5517
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5518
    G1ParScanExtRootClosure        only_copy_non_heap_cl(_g1h, &pss, NULL);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5519
    G1ParScanMetadataClosure       only_copy_metadata_cl(_g1h, &pss, NULL);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5520
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5521
    G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(_g1h, &pss, NULL);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5522
    G1ParScanAndMarkMetadataClosure copy_mark_metadata_cl(_g1h, &pss, NULL);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5523
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5524
    OopClosure*                    copy_non_heap_cl = &only_copy_non_heap_cl;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5525
    OopsInHeapRegionClosure*       copy_metadata_cl = &only_copy_metadata_cl;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5526
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5527
    if (_g1h->g1_policy()->during_initial_mark_pause()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5528
      // We also need to mark copied objects.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5529
      copy_non_heap_cl = &copy_mark_non_heap_cl;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5530
      copy_metadata_cl = &copy_mark_metadata_cl;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5531
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5532
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5533
    // Is alive closure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5534
    G1AlwaysAliveClosure always_alive(_g1h);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5535
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5536
    // Copying keep alive closure. Applied to referent objects that need
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5537
    // to be copied.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5538
    G1CopyingKeepAliveClosure keep_alive(_g1h, copy_non_heap_cl, copy_metadata_cl, &pss);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5539
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5540
    ReferenceProcessor* rp = _g1h->ref_processor_cm();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5541
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5542
    uint limit = ReferenceProcessor::number_of_subclasses_of_ref() * rp->max_num_q();
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5543
    uint stride = MIN2(MAX2(_n_workers, 1U), limit);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5544
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5545
    // limit is set using max_num_q() - which was set using ParallelGCThreads.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5546
    // So this must be true - but assert just in case someone decides to
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5547
    // change the worker ids.
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5548
    assert(0 <= worker_id && worker_id < limit, "sanity");
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5549
    assert(!rp->discovery_is_atomic(), "check this code");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5550
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5551
    // Select discovered lists [i, i+stride, i+2*stride,...,limit)
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5552
    for (uint idx = worker_id; idx < limit; idx += stride) {
10747
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10746
diff changeset
  5553
      DiscoveredList& ref_list = rp->discovered_refs()[idx];
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5554
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5555
      DiscoveredListIterator iter(ref_list, &keep_alive, &always_alive);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5556
      while (iter.has_next()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5557
        // Since discovery is not atomic for the CM ref processor, we
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5558
        // can see some null referent objects.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5559
        iter.load_ptrs(DEBUG_ONLY(true));
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5560
        oop ref = iter.obj();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5561
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5562
        // This will filter nulls.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5563
        if (iter.is_referent_alive()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5564
          iter.make_referent_alive();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5565
        }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5566
        iter.move_to_next();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5567
      }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5568
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5569
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5570
    // Drain the queue - which may cause stealing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5571
    G1ParEvacuateFollowersClosure drain_queue(_g1h, &pss, _queues, &_terminator);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5572
    drain_queue.do_void();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5573
    // Allocation buffers were retired at the end of G1ParEvacuateFollowersClosure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5574
    assert(pss.refs()->is_empty(), "should be");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5575
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5576
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5577
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5578
// Weak Reference processing during an evacuation pause (part 1).
13926
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5579
void G1CollectedHeap::process_discovered_references(uint no_of_gc_workers) {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5580
  double ref_proc_start = os::elapsedTime();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5581
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5582
  ReferenceProcessor* rp = _ref_processor_stw;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5583
  assert(rp->discovery_enabled(), "should have been enabled");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5584
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5585
  // Any reference objects, in the collection set, that were 'discovered'
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5586
  // by the CM ref processor should have already been copied (either by
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5587
  // applying the external root copy closure to the discovered lists, or
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5588
  // by following an RSet entry).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5589
  //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5590
  // But some of the referents, that are in the collection set, that these
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5591
  // reference objects point to may not have been copied: the STW ref
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5592
  // processor would have seen that the reference object had already
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5593
  // been 'discovered' and would have skipped discovering the reference,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5594
  // but would not have treated the reference object as a regular oop.
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5595
  // As a result the copy closure would not have been applied to the
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5596
  // referent object.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5597
  //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5598
  // We need to explicitly copy these referent objects - the references
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5599
  // will be processed at the end of remarking.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5600
  //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5601
  // We also need to do this copying before we process the reference
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5602
  // objects discovered by the STW ref processor in case one of these
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5603
  // referents points to another object which is also referenced by an
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5604
  // object discovered by the STW ref processor.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5605
11250
ef1ab0772513 7120038: G1: ParallelGCThreads==0 is broken
johnc
parents: 11249
diff changeset
  5606
  assert(!G1CollectedHeap::use_parallel_gc_threads() ||
13926
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5607
           no_of_gc_workers == workers()->active_workers(),
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5608
           "Need to reset active GC workers");
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5609
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5610
  set_par_threads(no_of_gc_workers);
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5611
  G1ParPreserveCMReferentsTask keep_cm_referents(this,
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5612
                                                 no_of_gc_workers,
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5613
                                                 _task_queues);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5614
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5615
  if (G1CollectedHeap::use_parallel_gc_threads()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5616
    workers()->run_task(&keep_cm_referents);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5617
  } else {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5618
    keep_cm_referents.work(0);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5619
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5620
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5621
  set_par_threads(0);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5622
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5623
  // Closure to test whether a referent is alive.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5624
  G1STWIsAliveClosure is_alive(this);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5625
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5626
  // Even when parallel reference processing is enabled, the processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5627
  // of JNI refs is serial and performed serially by the current thread
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5628
  // rather than by a worker. The following PSS will be used for processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5629
  // JNI refs.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5630
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5631
  // Use only a single queue for this PSS.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5632
  G1ParScanThreadState pss(this, 0);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5633
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5634
  // We do not embed a reference processor in the copying/scanning
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5635
  // closures while we're actually processing the discovered
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5636
  // reference objects.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5637
  G1ParScanHeapEvacClosure        scan_evac_cl(this, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5638
  G1ParScanHeapEvacFailureClosure evac_failure_cl(this, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5639
  G1ParScanPartialArrayClosure    partial_scan_cl(this, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5640
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5641
  pss.set_evac_closure(&scan_evac_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5642
  pss.set_evac_failure_closure(&evac_failure_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5643
  pss.set_partial_scan_closure(&partial_scan_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5644
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5645
  assert(pss.refs()->is_empty(), "pre-condition");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5646
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5647
  G1ParScanExtRootClosure        only_copy_non_heap_cl(this, &pss, NULL);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5648
  G1ParScanMetadataClosure       only_copy_metadata_cl(this, &pss, NULL);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5649
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5650
  G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(this, &pss, NULL);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5651
  G1ParScanAndMarkMetadataClosure copy_mark_metadata_cl(this, &pss, NULL);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5652
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5653
  OopClosure*                    copy_non_heap_cl = &only_copy_non_heap_cl;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5654
  OopsInHeapRegionClosure*       copy_metadata_cl = &only_copy_metadata_cl;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5655
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5656
  if (_g1h->g1_policy()->during_initial_mark_pause()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5657
    // We also need to mark copied objects.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5658
    copy_non_heap_cl = &copy_mark_non_heap_cl;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5659
    copy_metadata_cl = &copy_mark_metadata_cl;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5660
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5661
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5662
  // Keep alive closure.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5663
  G1CopyingKeepAliveClosure keep_alive(this, copy_non_heap_cl, copy_metadata_cl, &pss);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5664
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5665
  // Serial Complete GC closure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5666
  G1STWDrainQueueClosure drain_queue(this, &pss);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5667
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5668
  // Setup the soft refs policy...
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5669
  rp->setup_policy(false);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5670
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5671
  ReferenceProcessorStats stats;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5672
  if (!rp->processing_is_mt()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5673
    // Serial reference processing...
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5674
    stats = rp->process_discovered_references(&is_alive,
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5675
                                              &keep_alive,
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5676
                                              &drain_queue,
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5677
                                              NULL,
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5678
                                              _gc_timer_stw);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5679
  } else {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5680
    // Parallel reference processing
13926
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5681
    assert(rp->num_q() == no_of_gc_workers, "sanity");
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5682
    assert(no_of_gc_workers <= rp->max_num_q(), "sanity");
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5683
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5684
    G1STWRefProcTaskExecutor par_task_executor(this, workers(), _task_queues, no_of_gc_workers);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5685
    stats = rp->process_discovered_references(&is_alive,
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5686
                                              &keep_alive,
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5687
                                              &drain_queue,
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5688
                                              &par_task_executor,
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5689
                                              _gc_timer_stw);
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5690
  }
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5691
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5692
  _gc_tracer_stw->report_gc_reference_stats(stats);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5693
  // We have completed copying any necessary live referent objects
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5694
  // (that were not copied during the actual pause) so we can
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5695
  // retire any active alloc buffers
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5696
  pss.retire_alloc_buffers();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5697
  assert(pss.refs()->is_empty(), "both queue and overflow should be empty");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5698
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5699
  double ref_proc_time = os::elapsedTime() - ref_proc_start;
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  5700
  g1_policy()->phase_times()->record_ref_proc_time(ref_proc_time * 1000.0);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5701
}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5702
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5703
// Weak Reference processing during an evacuation pause (part 2).
13926
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5704
void G1CollectedHeap::enqueue_discovered_references(uint no_of_gc_workers) {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5705
  double ref_enq_start = os::elapsedTime();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5706
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5707
  ReferenceProcessor* rp = _ref_processor_stw;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5708
  assert(!rp->discovery_enabled(), "should have been disabled as part of processing");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5709
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5710
  // Now enqueue any remaining on the discovered lists on to
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5711
  // the pending list.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5712
  if (!rp->processing_is_mt()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5713
    // Serial reference processing...
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5714
    rp->enqueue_discovered_references();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5715
  } else {
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5716
    // Parallel reference enqueueing
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5717
13926
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5718
    assert(no_of_gc_workers == workers()->active_workers(),
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5719
           "Need to reset active workers");
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5720
    assert(rp->num_q() == no_of_gc_workers, "sanity");
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5721
    assert(no_of_gc_workers <= rp->max_num_q(), "sanity");
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5722
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5723
    G1STWRefProcTaskExecutor par_task_executor(this, workers(), _task_queues, no_of_gc_workers);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5724
    rp->enqueue_discovered_references(&par_task_executor);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5725
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5726
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5727
  rp->verify_no_references_recorded();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5728
  assert(!rp->discovery_enabled(), "should have been disabled");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5729
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5730
  // FIXME
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5731
  // CM's reference processing also cleans up the string and symbol tables.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5732
  // Should we do that here also? We could, but it is a serial operation
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5733
  // and could significantly increase the pause time.
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5734
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5735
  double ref_enq_time = os::elapsedTime() - ref_enq_start;
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  5736
  g1_policy()->phase_times()->record_ref_enq_time(ref_enq_time * 1000.0);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5737
}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5738
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5739
void G1CollectedHeap::evacuate_collection_set(EvacuationInfo& evacuation_info) {
11449
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
  5740
  _expand_heap_after_alloc_failure = true;
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5741
  _evacuation_failed = false;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5742
13517
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  5743
  // Should G1EvacuationFailureALot be in effect for this GC?
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  5744
  NOT_PRODUCT(set_evacuation_failure_alot_for_current_gc();)
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  5745
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5746
  g1_rem_set()->prepare_for_oops_into_collection_set_do();
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5747
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5748
  // Disable the hot card cache.
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5749
  G1HotCardCache* hot_card_cache = _cg1r->hot_card_cache();
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5750
  hot_card_cache->reset_hot_cache_claimed_index();
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5751
  hot_card_cache->set_use_cache(false);
3589
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  5752
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5753
  uint n_workers;
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5754
  if (G1CollectedHeap::use_parallel_gc_threads()) {
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5755
    n_workers =
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5756
      AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(),
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5757
                                     workers()->active_workers(),
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5758
                                     Threads::number_of_non_daemon_threads());
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5759
    assert(UseDynamicNumberOfGCThreads ||
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5760
           n_workers == workers()->total_workers(),
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5761
           "If not dynamic should be using all the  workers");
11250
ef1ab0772513 7120038: G1: ParallelGCThreads==0 is broken
johnc
parents: 11249
diff changeset
  5762
    workers()->set_active_workers(n_workers);
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5763
    set_par_threads(n_workers);
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5764
  } else {
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5765
    assert(n_par_threads() == 0,
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5766
           "Should be the original non-parallel value");
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5767
    n_workers = 1;
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5768
  }
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5769
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5770
  G1ParTask g1_par_task(this, _task_queues);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5771
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5772
  init_for_evac_failure(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5773
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5774
  rem_set()->prepare_for_younger_refs_iterate(true);
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5775
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5776
  assert(dirty_card_queue_set().completed_buffers_num() == 0, "Should be empty");
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5777
  double start_par_time_sec = os::elapsedTime();
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5778
  double end_par_time_sec;
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5779
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5780
  {
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  5781
    StrongRootsScope srs(this);
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5782
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5783
    if (G1CollectedHeap::use_parallel_gc_threads()) {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5784
      // The individual threads will set their evac-failure closures.
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5785
      if (ParallelGCVerbose) G1ParScanThreadState::print_termination_stats_hdr();
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5786
      // These tasks use ShareHeap::_process_strong_tasks
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5787
      assert(UseDynamicNumberOfGCThreads ||
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5788
             workers()->active_workers() == workers()->total_workers(),
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5789
             "If not dynamic should be using all the  workers");
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5790
      workers()->run_task(&g1_par_task);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5791
    } else {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5792
      g1_par_task.set_for_termination(n_workers);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5793
      g1_par_task.work(0);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5794
    }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5795
    end_par_time_sec = os::elapsedTime();
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5796
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5797
    // Closing the inner scope will execute the destructor
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5798
    // for the StrongRootsScope object. We record the current
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5799
    // elapsed time before closing the scope so that time
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5800
    // taken for the SRS destructor is NOT included in the
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5801
    // reported parallel time.
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5802
  }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5803
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5804
  double par_time_ms = (end_par_time_sec - start_par_time_sec) * 1000.0;
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  5805
  g1_policy()->phase_times()->record_par_time(par_time_ms);
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5806
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5807
  double code_root_fixup_time_ms =
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5808
        (os::elapsedTime() - end_par_time_sec) * 1000.0;
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  5809
  g1_policy()->phase_times()->record_code_root_fixup_time(code_root_fixup_time_ms);
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5810
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5811
  set_par_threads(0);
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  5812
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5813
  // Process any discovered reference objects - we have
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5814
  // to do this _before_ we retire the GC alloc regions
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5815
  // as we may have to copy some 'reachable' referent
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5816
  // objects (and their reachable sub-graphs) that were
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5817
  // not copied during the pause.
13926
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5818
  process_discovered_references(n_workers);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5819
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  5820
  // Weak root processing.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5821
  {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5822
    G1STWIsAliveClosure is_alive(this);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5823
    G1KeepAliveClosure keep_alive(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5824
    JNIHandles::weak_oops_do(&is_alive, &keep_alive);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5825
  }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5826
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5827
  release_gc_alloc_regions(n_workers, evacuation_info);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5828
  g1_rem_set()->cleanup_after_oops_into_collection_set_do();
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5829
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5830
  // Reset and re-enable the hot card cache.
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5831
  // Note the counts for the cards in the regions in the
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5832
  // collection set are reset when the collection set is freed.
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5833
  hot_card_cache->reset_hot_cache();
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5834
  hot_card_cache->set_use_cache(true);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5835
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5836
  // Migrate the strong code roots attached to each region in
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5837
  // the collection set. Ideally we would like to do this
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5838
  // after we have finished the scanning/evacuation of the
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5839
  // strong code roots for a particular heap region.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5840
  migrate_strong_code_roots();
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5841
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5842
  if (g1_policy()->during_initial_mark_pause()) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5843
    // Reset the claim values set during marking the strong code roots
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5844
    reset_heap_region_claim_values();
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5845
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  5846
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5847
  finalize_for_evac_failure();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5848
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5849
  if (evacuation_failed()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5850
    remove_self_forwarding_pointers();
13517
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  5851
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  5852
    // Reset the G1EvacuationFailureALot counters and flags
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  5853
    // Note: the values are reset only when an actual
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  5854
    // evacuation failure occurs.
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  5855
    NOT_PRODUCT(reset_evacuation_should_fail();)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5856
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5857
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5858
  // Enqueue any remaining references remaining on the STW
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5859
  // reference processor's discovered lists. We need to do
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5860
  // this after the card table is cleaned (and verified) as
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  5861
  // the act of enqueueing entries on to the pending list
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5862
  // will log these updates (and dirty their associated
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5863
  // cards). We need these updates logged to update any
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5864
  // RSets.
13926
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5865
  enqueue_discovered_references(n_workers);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5866
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5867
  if (G1DeferredRSUpdate) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5868
    RedirtyLoggedCardTableEntryFastClosure redirty;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5869
    dirty_card_queue_set().set_closure(&redirty);
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5870
    dirty_card_queue_set().apply_closure_to_all_completed_buffers();
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  5871
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  5872
    DirtyCardQueueSet& dcq = JavaThread::dirty_card_queue_set();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  5873
    dcq.merge_bufferlists(&dirty_card_queue_set());
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5874
    assert(dirty_card_queue_set().completed_buffers_num() == 0, "All should be consumed");
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5875
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5876
  COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5877
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5878
8072
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7923
diff changeset
  5879
void G1CollectedHeap::free_region_if_empty(HeapRegion* hr,
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5880
                                     size_t* pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5881
                                     FreeRegionList* free_list,
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  5882
                                     OldRegionSet* old_proxy_set,
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5883
                                     HumongousRegionSet* humongous_proxy_set,
8072
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7923
diff changeset
  5884
                                     HRRSCleanupTask* hrrs_cleanup_task,
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5885
                                     bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5886
  if (hr->used() > 0 && hr->max_live_bytes() == 0 && !hr->is_young()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5887
    if (hr->isHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5888
      assert(hr->startsHumongous(), "we should only see starts humongous");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5889
      free_humongous_region(hr, pre_used, free_list, humongous_proxy_set, par);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5890
    } else {
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  5891
      _old_set.remove_with_proxy(hr, old_proxy_set);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5892
      free_region(hr, pre_used, free_list, par);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5893
    }
8072
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7923
diff changeset
  5894
  } else {
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7923
diff changeset
  5895
    hr->rem_set()->do_cleanup_work(hrrs_cleanup_task);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5896
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5897
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5898
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5899
void G1CollectedHeap::free_region(HeapRegion* hr,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5900
                                  size_t* pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5901
                                  FreeRegionList* free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5902
                                  bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5903
  assert(!hr->isHumongous(), "this is only for non-humongous regions");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5904
  assert(!hr->is_empty(), "the region should not be empty");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5905
  assert(free_list != NULL, "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5906
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5907
  // Clear the card counts for this region.
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5908
  // Note: we only need to do this if the region is not young
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5909
  // (since we don't refine cards in young regions).
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5910
  if (!hr->is_young()) {
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5911
    _cg1r->hot_card_cache()->reset_card_counts(hr);
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5912
  }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5913
  *pre_used += hr->used();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5914
  hr->hr_clear(par, true /* clear_space */);
8927
461fa7ee5254 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 8688
diff changeset
  5915
  free_list->add_as_head(hr);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5916
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5917
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5918
void G1CollectedHeap::free_humongous_region(HeapRegion* hr,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5919
                                     size_t* pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5920
                                     FreeRegionList* free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5921
                                     HumongousRegionSet* humongous_proxy_set,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5922
                                     bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5923
  assert(hr->startsHumongous(), "this is only for starts humongous regions");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5924
  assert(free_list != NULL, "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5925
  assert(humongous_proxy_set != NULL, "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5926
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5927
  size_t hr_used = hr->used();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5928
  size_t hr_capacity = hr->capacity();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5929
  size_t hr_pre_used = 0;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5930
  _humongous_set.remove_with_proxy(hr, humongous_proxy_set);
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  5931
  // We need to read this before we make the region non-humongous,
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  5932
  // otherwise the information will be gone.
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  5933
  uint last_index = hr->last_hc_index();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5934
  hr->set_notHumongous();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5935
  free_region(hr, &hr_pre_used, free_list, par);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5936
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  5937
  uint i = hr->hrs_index() + 1;
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  5938
  while (i < last_index) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  5939
    HeapRegion* curr_hr = region_at(i);
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  5940
    assert(curr_hr->continuesHumongous(), "invariant");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5941
    curr_hr->set_notHumongous();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5942
    free_region(curr_hr, &hr_pre_used, free_list, par);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5943
    i += 1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5944
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5945
  assert(hr_pre_used == hr_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5946
         err_msg("hr_pre_used: "SIZE_FORMAT" and hr_used: "SIZE_FORMAT" "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5947
                 "should be the same", hr_pre_used, hr_used));
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5948
  *pre_used += hr_pre_used;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5949
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5950
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5951
void G1CollectedHeap::update_sets_after_freeing_regions(size_t pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5952
                                       FreeRegionList* free_list,
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  5953
                                       OldRegionSet* old_proxy_set,
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5954
                                       HumongousRegionSet* humongous_proxy_set,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5955
                                       bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5956
  if (pre_used > 0) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5957
    Mutex* lock = (par) ? ParGCRareEvent_lock : NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5958
    MutexLockerEx x(lock, Mutex::_no_safepoint_check_flag);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5959
    assert(_summary_bytes_used >= pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5960
           err_msg("invariant: _summary_bytes_used: "SIZE_FORMAT" "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5961
                   "should be >= pre_used: "SIZE_FORMAT,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5962
                   _summary_bytes_used, pre_used));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5963
    _summary_bytes_used -= pre_used;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5964
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5965
  if (free_list != NULL && !free_list->is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5966
    MutexLockerEx x(FreeList_lock, Mutex::_no_safepoint_check_flag);
8927
461fa7ee5254 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 8688
diff changeset
  5967
    _free_list.add_as_head(free_list);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5968
  }
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  5969
  if (old_proxy_set != NULL && !old_proxy_set->is_empty()) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  5970
    MutexLockerEx x(OldSets_lock, Mutex::_no_safepoint_check_flag);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  5971
    _old_set.update_from_proxy(old_proxy_set);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  5972
  }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5973
  if (humongous_proxy_set != NULL && !humongous_proxy_set->is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5974
    MutexLockerEx x(OldSets_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5975
    _humongous_set.update_from_proxy(humongous_proxy_set);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5976
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5977
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5978
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5979
class G1ParCleanupCTTask : public AbstractGangTask {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5980
  CardTableModRefBS* _ct_bs;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5981
  G1CollectedHeap* _g1h;
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5982
  HeapRegion* volatile _su_head;
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5983
public:
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5984
  G1ParCleanupCTTask(CardTableModRefBS* ct_bs,
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5985
                     G1CollectedHeap* g1h) :
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5986
    AbstractGangTask("G1 Par Cleanup CT Task"),
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5987
    _ct_bs(ct_bs), _g1h(g1h) { }
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5988
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5989
  void work(uint worker_id) {
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5990
    HeapRegion* r;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5991
    while (r = _g1h->pop_dirty_cards_region()) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5992
      clear_cards(r);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5993
    }
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5994
  }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5995
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5996
  void clear_cards(HeapRegion* r) {
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5997
    // Cards of the survivors should have already been dirtied.
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5998
    if (!r->is_survivor()) {
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5999
      _ct_bs->clear(MemRegion(r->bottom(), r->end()));
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  6000
    }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  6001
  }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  6002
};
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  6003
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  6004
#ifndef PRODUCT
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  6005
class G1VerifyCardTableCleanup: public HeapRegionClosure {
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6006
  G1CollectedHeap* _g1h;
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  6007
  CardTableModRefBS* _ct_bs;
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  6008
public:
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6009
  G1VerifyCardTableCleanup(G1CollectedHeap* g1h, CardTableModRefBS* ct_bs)
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6010
    : _g1h(g1h), _ct_bs(ct_bs) { }
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6011
  virtual bool doHeapRegion(HeapRegion* r) {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6012
    if (r->is_survivor()) {
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6013
      _g1h->verify_dirty_region(r);
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  6014
    } else {
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6015
      _g1h->verify_not_dirty_region(r);
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  6016
    }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  6017
    return false;
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  6018
  }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  6019
};
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6020
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6021
void G1CollectedHeap::verify_not_dirty_region(HeapRegion* hr) {
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6022
  // All of the region should be clean.
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6023
  CardTableModRefBS* ct_bs = (CardTableModRefBS*)barrier_set();
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6024
  MemRegion mr(hr->bottom(), hr->end());
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6025
  ct_bs->verify_not_dirty_region(mr);
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6026
}
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6027
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6028
void G1CollectedHeap::verify_dirty_region(HeapRegion* hr) {
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6029
  // We cannot guarantee that [bottom(),end()] is dirty.  Threads
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6030
  // dirty allocated blocks as they allocate them. The thread that
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6031
  // retires each region and replaces it with a new one will do a
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6032
  // maximal allocation to fill in [pre_dummy_top(),end()] but will
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6033
  // not dirty that area (one less thing to have to do while holding
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6034
  // a lock). So we can only verify that [bottom(),pre_dummy_top()]
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6035
  // is dirty.
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6036
  CardTableModRefBS* ct_bs = (CardTableModRefBS*) barrier_set();
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6037
  MemRegion mr(hr->bottom(), hr->pre_dummy_top());
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6038
  ct_bs->verify_dirty_region(mr);
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6039
}
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6040
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6041
void G1CollectedHeap::verify_dirty_young_list(HeapRegion* head) {
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6042
  CardTableModRefBS* ct_bs = (CardTableModRefBS*) barrier_set();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6043
  for (HeapRegion* hr = head; hr != NULL; hr = hr->get_next_young_region()) {
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  6044
    verify_dirty_region(hr);
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6045
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6046
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6047
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6048
void G1CollectedHeap::verify_dirty_young_regions() {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6049
  verify_dirty_young_list(_young_list->first_region());
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6050
}
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  6051
#endif
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  6052
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6053
void G1CollectedHeap::cleanUpCardTable() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6054
  CardTableModRefBS* ct_bs = (CardTableModRefBS*) (barrier_set());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6055
  double start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6056
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6057
  {
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6058
    // Iterate over the dirty cards region list.
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6059
    G1ParCleanupCTTask cleanup_task(ct_bs, this);
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6060
11250
ef1ab0772513 7120038: G1: ParallelGCThreads==0 is broken
johnc
parents: 11249
diff changeset
  6061
    if (G1CollectedHeap::use_parallel_gc_threads()) {
ef1ab0772513 7120038: G1: ParallelGCThreads==0 is broken
johnc
parents: 11249
diff changeset
  6062
      set_par_threads();
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6063
      workers()->run_task(&cleanup_task);
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6064
      set_par_threads(0);
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6065
    } else {
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6066
      while (_dirty_cards_region_list) {
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6067
        HeapRegion* r = _dirty_cards_region_list;
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6068
        cleanup_task.clear_cards(r);
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6069
        _dirty_cards_region_list = r->get_next_dirty_cards_region();
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6070
        if (_dirty_cards_region_list == r) {
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6071
          // The last region.
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6072
          _dirty_cards_region_list = NULL;
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6073
        }
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6074
        r->set_next_dirty_cards_region(NULL);
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  6075
      }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  6076
    }
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6077
#ifndef PRODUCT
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6078
    if (G1VerifyCTCleanup || VerifyAfterGC) {
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6079
      G1VerifyCardTableCleanup cleanup_verifier(this, ct_bs);
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6080
      heap_region_iterate(&cleanup_verifier);
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6081
    }
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  6082
#endif
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  6083
  }
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6084
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6085
  double elapsed = os::elapsedTime() - start;
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  6086
  g1_policy()->phase_times()->record_clear_ct_time(elapsed * 1000.0);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6087
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6088
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  6089
void G1CollectedHeap::free_collection_set(HeapRegion* cs_head, EvacuationInfo& evacuation_info) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6090
  size_t pre_used = 0;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6091
  FreeRegionList local_free_list("Local List for CSet Freeing");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6092
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6093
  double young_time_ms     = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6094
  double non_young_time_ms = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6095
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6096
  // Since the collection set is a superset of the the young list,
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6097
  // all we need to do to clear the young list is clear its
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6098
  // head and length, and unlink any young regions in the code below
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6099
  _young_list->clear();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6100
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6101
  G1CollectorPolicy* policy = g1_policy();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6102
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6103
  double start_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6104
  bool non_young = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6105
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6106
  HeapRegion* cur = cs_head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6107
  int age_bound = -1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6108
  size_t rs_lengths = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6109
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6110
  while (cur != NULL) {
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  6111
    assert(!is_on_master_free_list(cur), "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6112
    if (non_young) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6113
      if (cur->is_young()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6114
        double end_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6115
        double elapsed_ms = (end_sec - start_sec) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6116
        non_young_time_ms += elapsed_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6117
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6118
        start_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6119
        non_young = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6120
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6121
    } else {
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6122
      if (!cur->is_young()) {
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6123
        double end_sec = os::elapsedTime();
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6124
        double elapsed_ms = (end_sec - start_sec) * 1000.0;
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6125
        young_time_ms += elapsed_ms;
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6126
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6127
        start_sec = os::elapsedTime();
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6128
        non_young = true;
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6129
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6130
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6131
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6132
    rs_lengths += cur->rem_set()->occupied();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6133
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6134
    HeapRegion* next = cur->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6135
    assert(cur->in_collection_set(), "bad CS");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6136
    cur->set_next_in_collection_set(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6137
    cur->set_in_collection_set(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6138
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6139
    if (cur->is_young()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6140
      int index = cur->young_index_in_cset();
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10997
diff changeset
  6141
      assert(index != -1, "invariant");
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  6142
      assert((uint) index < policy->young_cset_region_length(), "invariant");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6143
      size_t words_survived = _surviving_young_words[index];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6144
      cur->record_surv_words_in_group(words_survived);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6145
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6146
      // At this point the we have 'popped' cur from the collection set
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6147
      // (linked via next_in_collection_set()) but it is still in the
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6148
      // young list (linked via next_young_region()). Clear the
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6149
      // _next_young_region field.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6150
      cur->set_next_young_region(NULL);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6151
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6152
      int index = cur->young_index_in_cset();
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10997
diff changeset
  6153
      assert(index == -1, "invariant");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6154
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6155
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6156
    assert( (cur->is_young() && cur->young_index_in_cset() > -1) ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6157
            (!cur->is_young() && cur->young_index_in_cset() == -1),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6158
            "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6159
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6160
    if (!cur->evacuation_failed()) {
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6161
      MemRegion used_mr = cur->used_region();
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6162
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6163
      // And the region is empty.
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6164
      assert(!used_mr.is_empty(), "Should not have empty regions in a CS.");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6165
      free_region(cur, &pre_used, &local_free_list, false /* par */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6166
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6167
      cur->uninstall_surv_rate_group();
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10997
diff changeset
  6168
      if (cur->is_young()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6169
        cur->set_young_index_in_cset(-1);
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10997
diff changeset
  6170
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6171
      cur->set_not_young();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6172
      cur->set_evacuation_failed(false);
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6173
      // The region is now considered to be old.
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6174
      _old_set.add(cur);
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  6175
      evacuation_info.increment_collectionset_used_after(cur->used());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6176
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6177
    cur = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6178
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6179
18025
b7bcf7497f93 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 17855
diff changeset
  6180
  evacuation_info.set_regions_freed(local_free_list.length());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6181
  policy->record_max_rs_lengths(rs_lengths);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6182
  policy->cset_regions_freed();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6183
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6184
  double end_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6185
  double elapsed_ms = (end_sec - start_sec) * 1000.0;
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6186
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6187
  if (non_young) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6188
    non_young_time_ms += elapsed_ms;
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6189
  } else {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6190
    young_time_ms += elapsed_ms;
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6191
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6192
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6193
  update_sets_after_freeing_regions(pre_used, &local_free_list,
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6194
                                    NULL /* old_proxy_set */,
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6195
                                    NULL /* humongous_proxy_set */,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6196
                                    false /* par */);
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  6197
  policy->phase_times()->record_young_free_cset_time_ms(young_time_ms);
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  6198
  policy->phase_times()->record_non_young_free_cset_time_ms(non_young_time_ms);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6199
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6200
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6201
// This routine is similar to the above but does not record
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6202
// any policy statistics or update free lists; we are abandoning
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6203
// the current incremental collection set in preparation of a
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6204
// full collection. After the full GC we will start to build up
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6205
// the incremental collection set again.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6206
// This is only called when we're doing a full collection
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6207
// and is immediately followed by the tearing down of the young list.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6208
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6209
void G1CollectedHeap::abandon_collection_set(HeapRegion* cs_head) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6210
  HeapRegion* cur = cs_head;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6211
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6212
  while (cur != NULL) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6213
    HeapRegion* next = cur->next_in_collection_set();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6214
    assert(cur->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
  6215
    cur->set_next_in_collection_set(NULL);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6216
    cur->set_in_collection_set(false);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6217
    cur->set_young_index_in_cset(-1);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6218
    cur = next;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6219
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6220
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6221
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6222
void G1CollectedHeap::set_free_regions_coming() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6223
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6224
    gclog_or_tty->print_cr("G1ConcRegionFreeing [cm thread] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6225
                           "setting free regions coming");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6226
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6227
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6228
  assert(!free_regions_coming(), "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6229
  _free_regions_coming = true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6230
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6231
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6232
void G1CollectedHeap::reset_free_regions_coming() {
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  6233
  assert(free_regions_coming(), "pre-condition");
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  6234
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6235
  {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6236
    MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6237
    _free_regions_coming = false;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6238
    SecondaryFreeList_lock->notify_all();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6239
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6240
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6241
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6242
    gclog_or_tty->print_cr("G1ConcRegionFreeing [cm thread] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6243
                           "reset free regions coming");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6244
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6245
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6246
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6247
void G1CollectedHeap::wait_while_free_regions_coming() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6248
  // Most of the time we won't have to wait, so let's do a quick test
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6249
  // first before we take the lock.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6250
  if (!free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6251
    return;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6252
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6253
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6254
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6255
    gclog_or_tty->print_cr("G1ConcRegionFreeing [other] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6256
                           "waiting for free regions");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6257
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6258
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6259
  {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6260
    MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6261
    while (free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6262
      SecondaryFreeList_lock->wait(Mutex::_no_safepoint_check_flag);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6263
    }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6264
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6265
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6266
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6267
    gclog_or_tty->print_cr("G1ConcRegionFreeing [other] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6268
                           "done waiting for free regions");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6269
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6270
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6271
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6272
void G1CollectedHeap::set_region_short_lived_locked(HeapRegion* hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6273
  assert(heap_lock_held_for_gc(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6274
              "the heap lock should already be held by or for this thread");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6275
  _young_list->push_region(hr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6276
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6277
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6278
class NoYoungRegionsClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6279
private:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6280
  bool _success;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6281
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6282
  NoYoungRegionsClosure() : _success(true) { }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6283
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6284
    if (r->is_young()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6285
      gclog_or_tty->print_cr("Region ["PTR_FORMAT", "PTR_FORMAT") tagged as young",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6286
                             r->bottom(), r->end());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6287
      _success = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6288
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6289
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6290
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6291
  bool success() { return _success; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6292
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6293
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6294
bool G1CollectedHeap::check_young_list_empty(bool check_heap, bool check_sample) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6295
  bool ret = _young_list->check_list_empty(check_sample);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6296
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6297
  if (check_heap) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6298
    NoYoungRegionsClosure closure;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6299
    heap_region_iterate(&closure);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6300
    ret = ret && closure.success();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6301
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6302
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6303
  return ret;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6304
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6305
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6306
class TearDownRegionSetsClosure : public HeapRegionClosure {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6307
private:
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6308
  OldRegionSet *_old_set;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6309
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6310
public:
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6311
  TearDownRegionSetsClosure(OldRegionSet* old_set) : _old_set(old_set) { }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6312
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6313
  bool doHeapRegion(HeapRegion* r) {
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6314
    if (r->is_empty()) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6315
      // We ignore empty regions, we'll empty the free list afterwards
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6316
    } else if (r->is_young()) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6317
      // We ignore young regions, we'll empty the young list afterwards
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6318
    } else if (r->isHumongous()) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6319
      // We ignore humongous regions, we're not tearing down the
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6320
      // humongous region set
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6321
    } else {
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6322
      // The rest should be old
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6323
      _old_set->remove(r);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6324
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6325
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6326
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6327
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6328
  ~TearDownRegionSetsClosure() {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6329
    assert(_old_set->is_empty(), "post-condition");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6330
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6331
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6332
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6333
void G1CollectedHeap::tear_down_region_sets(bool free_list_only) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6334
  assert_at_safepoint(true /* should_be_vm_thread */);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6335
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6336
  if (!free_list_only) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6337
    TearDownRegionSetsClosure cl(&_old_set);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6338
    heap_region_iterate(&cl);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6339
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6340
    // Need to do this after the heap iteration to be able to
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6341
    // recognize the young regions and ignore them during the iteration.
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6342
    _young_list->empty_list();
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6343
  }
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6344
  _free_list.remove_all();
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6345
}
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6346
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6347
class RebuildRegionSetsClosure : public HeapRegionClosure {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6348
private:
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6349
  bool            _free_list_only;
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6350
  OldRegionSet*   _old_set;
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6351
  FreeRegionList* _free_list;
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6352
  size_t          _total_used;
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6353
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6354
public:
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6355
  RebuildRegionSetsClosure(bool free_list_only,
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6356
                           OldRegionSet* old_set, FreeRegionList* free_list) :
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6357
    _free_list_only(free_list_only),
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6358
    _old_set(old_set), _free_list(free_list), _total_used(0) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6359
    assert(_free_list->is_empty(), "pre-condition");
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6360
    if (!free_list_only) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6361
      assert(_old_set->is_empty(), "pre-condition");
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6362
    }
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6363
  }
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6364
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6365
  bool doHeapRegion(HeapRegion* r) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6366
    if (r->continuesHumongous()) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6367
      return false;
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6368
    }
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6369
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6370
    if (r->is_empty()) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6371
      // Add free regions to the free list
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6372
      _free_list->add_as_tail(r);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6373
    } else if (!_free_list_only) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6374
      assert(!r->is_young(), "we should not come across young regions");
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6375
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6376
      if (r->isHumongous()) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6377
        // We ignore humongous regions, we left the humongous set unchanged
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6378
      } else {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6379
        // The rest should be old, add them to the old set
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6380
        _old_set->add(r);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6381
      }
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6382
      _total_used += r->used();
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6383
    }
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6384
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6385
    return false;
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6386
  }
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6387
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6388
  size_t total_used() {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6389
    return _total_used;
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6390
  }
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6391
};
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6392
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6393
void G1CollectedHeap::rebuild_region_sets(bool free_list_only) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6394
  assert_at_safepoint(true /* should_be_vm_thread */);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6395
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6396
  RebuildRegionSetsClosure cl(free_list_only, &_old_set, &_free_list);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6397
  heap_region_iterate(&cl);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6398
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6399
  if (!free_list_only) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6400
    _summary_bytes_used = cl.total_used();
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6401
  }
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6402
  assert(_summary_bytes_used == recalculate_used(),
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6403
         err_msg("inconsistent _summary_bytes_used, "
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6404
                 "value: "SIZE_FORMAT" recalculated: "SIZE_FORMAT,
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6405
                 _summary_bytes_used, recalculate_used()));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6406
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6407
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6408
void G1CollectedHeap::set_refine_cte_cl_concurrency(bool concurrent) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6409
  _refine_cte_cl->set_concurrent(concurrent);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6410
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6411
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6412
bool G1CollectedHeap::is_in_closed_subset(const void* p) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6413
  HeapRegion* hr = heap_region_containing(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6414
  if (hr == NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  6415
    return false;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6416
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6417
    return hr->is_in(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6418
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6419
}
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6420
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6421
// Methods for the mutator alloc region
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6422
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6423
HeapRegion* G1CollectedHeap::new_mutator_alloc_region(size_t word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6424
                                                      bool force) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6425
  assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6426
  assert(!force || g1_policy()->can_expand_young_list(),
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6427
         "if force is true we should be able to expand the young list");
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  6428
  bool young_list_full = g1_policy()->is_young_list_full();
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  6429
  if (force || !young_list_full) {
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6430
    HeapRegion* new_alloc_region = new_region(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6431
                                              false /* do_expand */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6432
    if (new_alloc_region != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6433
      set_region_short_lived_locked(new_alloc_region);
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  6434
      _hr_printer.alloc(new_alloc_region, G1HRPrinter::Eden, young_list_full);
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6435
      return new_alloc_region;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6436
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6437
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6438
  return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6439
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6440
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6441
void G1CollectedHeap::retire_mutator_alloc_region(HeapRegion* alloc_region,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6442
                                                  size_t allocated_bytes) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6443
  assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6444
  assert(alloc_region->is_young(), "all mutator alloc regions should be young");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6445
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6446
  g1_policy()->add_region_to_incremental_cset_lhs(alloc_region);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6447
  _summary_bytes_used += allocated_bytes;
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  6448
  _hr_printer.retire(alloc_region);
10671
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
  6449
  // We update the eden sizes here, when the region is retired,
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
  6450
  // instead of when it's allocated, since this is the point that its
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
  6451
  // used space has been recored in _summary_bytes_used.
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
  6452
  g1mm()->update_eden_size();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6453
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6454
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6455
HeapRegion* MutatorAllocRegion::allocate_new_region(size_t word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6456
                                                    bool force) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6457
  return _g1h->new_mutator_alloc_region(word_size, force);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6458
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6459
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6460
void G1CollectedHeap::set_par_threads() {
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6461
  // Don't change the number of workers.  Use the value previously set
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6462
  // in the workgroup.
11250
ef1ab0772513 7120038: G1: ParallelGCThreads==0 is broken
johnc
parents: 11249
diff changeset
  6463
  assert(G1CollectedHeap::use_parallel_gc_threads(), "shouldn't be here otherwise");
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  6464
  uint n_workers = workers()->active_workers();
11250
ef1ab0772513 7120038: G1: ParallelGCThreads==0 is broken
johnc
parents: 11249
diff changeset
  6465
  assert(UseDynamicNumberOfGCThreads ||
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6466
           n_workers == workers()->total_workers(),
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6467
      "Otherwise should be using the total number of workers");
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6468
  if (n_workers == 0) {
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6469
    assert(false, "Should have been set in prior evacuation pause.");
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6470
    n_workers = ParallelGCThreads;
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6471
    workers()->set_active_workers(n_workers);
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6472
  }
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6473
  set_par_threads(n_workers);
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6474
}
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6475
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6476
void MutatorAllocRegion::retire_region(HeapRegion* alloc_region,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6477
                                       size_t allocated_bytes) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6478
  _g1h->retire_mutator_alloc_region(alloc_region, allocated_bytes);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6479
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6480
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6481
// Methods for the GC alloc regions
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6482
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6483
HeapRegion* G1CollectedHeap::new_gc_alloc_region(size_t word_size,
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  6484
                                                 uint count,
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6485
                                                 GCAllocPurpose ap) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6486
  assert(FreeList_lock->owned_by_self(), "pre-condition");
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6487
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6488
  if (count < g1_policy()->max_regions(ap)) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6489
    HeapRegion* new_alloc_region = new_region(word_size,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6490
                                              true /* do_expand */);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6491
    if (new_alloc_region != NULL) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6492
      // We really only need to do this for old regions given that we
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6493
      // should never scan survivors. But it doesn't hurt to do it
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6494
      // for survivors too.
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6495
      new_alloc_region->set_saved_mark();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6496
      if (ap == GCAllocForSurvived) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6497
        new_alloc_region->set_survivor();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6498
        _hr_printer.alloc(new_alloc_region, G1HRPrinter::Survivor);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6499
      } else {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6500
        _hr_printer.alloc(new_alloc_region, G1HRPrinter::Old);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6501
      }
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  6502
      bool during_im = g1_policy()->during_initial_mark_pause();
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  6503
      new_alloc_region->note_start_of_copying(during_im);
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6504
      return new_alloc_region;
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6505
    } else {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6506
      g1_policy()->note_alloc_region_limit_reached(ap);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6507
    }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6508
  }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6509
  return NULL;
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6510
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6511
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6512
void G1CollectedHeap::retire_gc_alloc_region(HeapRegion* alloc_region,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6513
                                             size_t allocated_bytes,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6514
                                             GCAllocPurpose ap) {
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  6515
  bool during_im = g1_policy()->during_initial_mark_pause();
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  6516
  alloc_region->note_end_of_copying(during_im);
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6517
  g1_policy()->record_bytes_copied_during_gc(allocated_bytes);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6518
  if (ap == GCAllocForSurvived) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6519
    young_list()->add_survivor_region(alloc_region);
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6520
  } else {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6521
    _old_set.add(alloc_region);
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6522
  }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6523
  _hr_printer.retire(alloc_region);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6524
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6525
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6526
HeapRegion* SurvivorGCAllocRegion::allocate_new_region(size_t word_size,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6527
                                                       bool force) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6528
  assert(!force, "not supported for GC alloc regions");
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6529
  return _g1h->new_gc_alloc_region(word_size, count(), GCAllocForSurvived);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6530
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6531
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6532
void SurvivorGCAllocRegion::retire_region(HeapRegion* alloc_region,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6533
                                          size_t allocated_bytes) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6534
  _g1h->retire_gc_alloc_region(alloc_region, allocated_bytes,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6535
                               GCAllocForSurvived);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6536
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6537
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6538
HeapRegion* OldGCAllocRegion::allocate_new_region(size_t word_size,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6539
                                                  bool force) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6540
  assert(!force, "not supported for GC alloc regions");
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6541
  return _g1h->new_gc_alloc_region(word_size, count(), GCAllocForTenured);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6542
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6543
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6544
void OldGCAllocRegion::retire_region(HeapRegion* alloc_region,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6545
                                     size_t allocated_bytes) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6546
  _g1h->retire_gc_alloc_region(alloc_region, allocated_bytes,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6547
                               GCAllocForTenured);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6548
}
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6549
// Heap region set verification
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6550
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6551
class VerifyRegionListsClosure : public HeapRegionClosure {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6552
private:
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6553
  FreeRegionList*     _free_list;
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6554
  OldRegionSet*       _old_set;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6555
  HumongousRegionSet* _humongous_set;
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  6556
  uint                _region_count;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6557
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6558
public:
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6559
  VerifyRegionListsClosure(OldRegionSet* old_set,
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6560
                           HumongousRegionSet* humongous_set,
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6561
                           FreeRegionList* free_list) :
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6562
    _old_set(old_set), _humongous_set(humongous_set),
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6563
    _free_list(free_list), _region_count(0) { }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6564
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  6565
  uint region_count() { return _region_count; }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6566
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6567
  bool doHeapRegion(HeapRegion* hr) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6568
    _region_count += 1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6569
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6570
    if (hr->continuesHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6571
      return false;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6572
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6573
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6574
    if (hr->is_young()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6575
      // TODO
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6576
    } else if (hr->startsHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6577
      _humongous_set->verify_next_region(hr);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6578
    } else if (hr->is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6579
      _free_list->verify_next_region(hr);
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6580
    } else {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6581
      _old_set->verify_next_region(hr);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6582
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6583
    return false;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6584
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6585
};
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6586
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  6587
HeapRegion* G1CollectedHeap::new_heap_region(uint hrs_index,
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  6588
                                             HeapWord* bottom) {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  6589
  HeapWord* end = bottom + HeapRegion::GrainWords;
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  6590
  MemRegion mr(bottom, end);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  6591
  assert(_g1_reserved.contains(mr), "invariant");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  6592
  // This might return NULL if the allocation fails
13756
3b72f3da8cd4 7016955: G1: remove the is_zeroed parameter from the HeapRegion constructor
johnc
parents: 13754
diff changeset
  6593
  return new HeapRegion(hrs_index, _bot_shared, mr);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  6594
}
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  6595
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6596
void G1CollectedHeap::verify_region_sets() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6597
  assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6598
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6599
  // First, check the explicit lists.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6600
  _free_list.verify();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6601
  {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6602
    // Given that a concurrent operation might be adding regions to
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6603
    // the secondary free list we have to take the lock before
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6604
    // verifying it.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6605
    MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6606
    _secondary_free_list.verify();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6607
  }
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6608
  _old_set.verify();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6609
  _humongous_set.verify();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6610
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6611
  // If a concurrent region freeing operation is in progress it will
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6612
  // be difficult to correctly attributed any free regions we come
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6613
  // across to the correct free list given that they might belong to
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6614
  // one of several (free_list, secondary_free_list, any local lists,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6615
  // etc.). So, if that's the case we will skip the rest of the
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6616
  // verification operation. Alternatively, waiting for the concurrent
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6617
  // operation to complete will have a non-trivial effect on the GC's
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6618
  // operation (no concurrent operation will last longer than the
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6619
  // interval between two calls to verification) and it might hide
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6620
  // any issues that we would like to catch during testing.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6621
  if (free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6622
    return;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6623
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6624
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  6625
  // Make sure we append the secondary_free_list on the free_list so
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  6626
  // that all free regions we will come across can be safely
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  6627
  // attributed to the free_list.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  6628
  append_secondary_free_list_if_not_empty_with_lock();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6629
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6630
  // Finally, make sure that the region accounting in the lists is
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6631
  // consistent with what we see in the heap.
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6632
  _old_set.verify_start();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6633
  _humongous_set.verify_start();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6634
  _free_list.verify_start();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6635
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6636
  VerifyRegionListsClosure cl(&_old_set, &_humongous_set, &_free_list);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6637
  heap_region_iterate(&cl);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6638
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6639
  _old_set.verify_end();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6640
  _humongous_set.verify_end();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6641
  _free_list.verify_end();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6642
}
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6643
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6644
// Optimized nmethod scanning
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6645
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6646
class RegisterNMethodOopClosure: public OopClosure {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6647
  G1CollectedHeap* _g1h;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6648
  nmethod* _nm;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6649
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6650
  template <class T> void do_oop_work(T* p) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6651
    T heap_oop = oopDesc::load_heap_oop(p);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6652
    if (!oopDesc::is_null(heap_oop)) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6653
      oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6654
      HeapRegion* hr = _g1h->heap_region_containing(obj);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6655
      assert(!hr->isHumongous(), "code root in humongous region?");
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6656
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6657
      // HeapRegion::add_strong_code_root() avoids adding duplicate
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6658
      // entries but having duplicates is  OK since we "mark" nmethods
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6659
      // as visited when we scan the strong code root lists during the GC.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6660
      hr->add_strong_code_root(_nm);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6661
      assert(hr->rem_set()->strong_code_roots_list_contains(_nm), "add failed?");
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6662
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6663
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6664
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6665
public:
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6666
  RegisterNMethodOopClosure(G1CollectedHeap* g1h, nmethod* nm) :
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6667
    _g1h(g1h), _nm(nm) {}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6668
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6669
  void do_oop(oop* p)       { do_oop_work(p); }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6670
  void do_oop(narrowOop* p) { do_oop_work(p); }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6671
};
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6672
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6673
class UnregisterNMethodOopClosure: public OopClosure {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6674
  G1CollectedHeap* _g1h;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6675
  nmethod* _nm;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6676
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6677
  template <class T> void do_oop_work(T* p) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6678
    T heap_oop = oopDesc::load_heap_oop(p);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6679
    if (!oopDesc::is_null(heap_oop)) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6680
      oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6681
      HeapRegion* hr = _g1h->heap_region_containing(obj);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6682
      assert(!hr->isHumongous(), "code root in humongous region?");
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6683
      hr->remove_strong_code_root(_nm);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6684
      assert(!hr->rem_set()->strong_code_roots_list_contains(_nm), "remove failed?");
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6685
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6686
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6687
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6688
public:
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6689
  UnregisterNMethodOopClosure(G1CollectedHeap* g1h, nmethod* nm) :
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6690
    _g1h(g1h), _nm(nm) {}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6691
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6692
  void do_oop(oop* p)       { do_oop_work(p); }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6693
  void do_oop(narrowOop* p) { do_oop_work(p); }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6694
};
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6695
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6696
void G1CollectedHeap::register_nmethod(nmethod* nm) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6697
  CollectedHeap::register_nmethod(nm);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6698
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6699
  guarantee(nm != NULL, "sanity");
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6700
  RegisterNMethodOopClosure reg_cl(this, nm);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6701
  nm->oops_do(&reg_cl);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6702
}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6703
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6704
void G1CollectedHeap::unregister_nmethod(nmethod* nm) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6705
  CollectedHeap::unregister_nmethod(nm);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6706
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6707
  guarantee(nm != NULL, "sanity");
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6708
  UnregisterNMethodOopClosure reg_cl(this, nm);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6709
  nm->oops_do(&reg_cl, true);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6710
}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6711
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6712
class MigrateCodeRootsHeapRegionClosure: public HeapRegionClosure {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6713
public:
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6714
  bool doHeapRegion(HeapRegion *hr) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6715
    assert(!hr->isHumongous(), "humongous region in collection set?");
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6716
    hr->migrate_strong_code_roots();
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6717
    return false;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6718
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6719
};
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6720
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6721
void G1CollectedHeap::migrate_strong_code_roots() {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6722
  MigrateCodeRootsHeapRegionClosure cl;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6723
  double migrate_start = os::elapsedTime();
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6724
  collection_set_iterate(&cl);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6725
  double migration_time_ms = (os::elapsedTime() - migrate_start) * 1000.0;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6726
  g1_policy()->phase_times()->record_strong_code_root_migration_time(migration_time_ms);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6727
}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6728
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6729
// Mark all the code roots that point into regions *not* in the
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6730
// collection set.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6731
//
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6732
// Note we do not want to use a "marking" CodeBlobToOopClosure while
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6733
// walking the the code roots lists of regions not in the collection
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6734
// set. Suppose we have an nmethod (M) that points to objects in two
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6735
// separate regions - one in the collection set (R1) and one not (R2).
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6736
// Using a "marking" CodeBlobToOopClosure here would result in "marking"
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6737
// nmethod M when walking the code roots for R1. When we come to scan
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6738
// the code roots for R2, we would see that M is already marked and it
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6739
// would be skipped and the objects in R2 that are referenced from M
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6740
// would not be evacuated.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6741
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6742
class MarkStrongCodeRootCodeBlobClosure: public CodeBlobClosure {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6743
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6744
  class MarkStrongCodeRootOopClosure: public OopClosure {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6745
    ConcurrentMark* _cm;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6746
    HeapRegion* _hr;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6747
    uint _worker_id;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6748
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6749
    template <class T> void do_oop_work(T* p) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6750
      T heap_oop = oopDesc::load_heap_oop(p);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6751
      if (!oopDesc::is_null(heap_oop)) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6752
        oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6753
        // Only mark objects in the region (which is assumed
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6754
        // to be not in the collection set).
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6755
        if (_hr->is_in(obj)) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6756
          _cm->grayRoot(obj, (size_t) obj->size(), _worker_id);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6757
        }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6758
      }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6759
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6760
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6761
  public:
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6762
    MarkStrongCodeRootOopClosure(ConcurrentMark* cm, HeapRegion* hr, uint worker_id) :
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6763
      _cm(cm), _hr(hr), _worker_id(worker_id) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6764
      assert(!_hr->in_collection_set(), "sanity");
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6765
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6766
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6767
    void do_oop(narrowOop* p) { do_oop_work(p); }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6768
    void do_oop(oop* p)       { do_oop_work(p); }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6769
  };
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6770
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6771
  MarkStrongCodeRootOopClosure _oop_cl;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6772
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6773
public:
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6774
  MarkStrongCodeRootCodeBlobClosure(ConcurrentMark* cm, HeapRegion* hr, uint worker_id):
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6775
    _oop_cl(cm, hr, worker_id) {}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6776
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6777
  void do_code_blob(CodeBlob* cb) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6778
    nmethod* nm = (cb == NULL) ? NULL : cb->as_nmethod_or_null();
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6779
    if (nm != NULL) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6780
      nm->oops_do(&_oop_cl);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6781
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6782
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6783
};
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6784
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6785
class MarkStrongCodeRootsHRClosure: public HeapRegionClosure {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6786
  G1CollectedHeap* _g1h;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6787
  uint _worker_id;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6788
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6789
public:
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6790
  MarkStrongCodeRootsHRClosure(G1CollectedHeap* g1h, uint worker_id) :
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6791
    _g1h(g1h), _worker_id(worker_id) {}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6792
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6793
  bool doHeapRegion(HeapRegion *hr) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6794
    HeapRegionRemSet* hrrs = hr->rem_set();
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6795
    if (hr->isHumongous()) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6796
      // Code roots should never be attached to a humongous region
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6797
      assert(hrrs->strong_code_roots_list_length() == 0, "sanity");
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6798
      return false;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6799
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6800
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6801
    if (hr->in_collection_set()) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6802
      // Don't mark code roots into regions in the collection set here.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6803
      // They will be marked when we scan them.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6804
      return false;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6805
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6806
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6807
    MarkStrongCodeRootCodeBlobClosure cb_cl(_g1h->concurrent_mark(), hr, _worker_id);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6808
    hr->strong_code_roots_do(&cb_cl);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6809
    return false;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6810
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6811
};
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6812
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6813
void G1CollectedHeap::mark_strong_code_roots(uint worker_id) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6814
  MarkStrongCodeRootsHRClosure cl(this, worker_id);
19341
17284e84baba 8023145: G1: G1CollectedHeap::mark_strong_code_roots() needs to handle ParallelGCThreads=0
brutisso
parents: 19339
diff changeset
  6815
  if (G1CollectedHeap::use_parallel_gc_threads()) {
17284e84baba 8023145: G1: G1CollectedHeap::mark_strong_code_roots() needs to handle ParallelGCThreads=0
brutisso
parents: 19339
diff changeset
  6816
    heap_region_par_iterate_chunked(&cl,
17284e84baba 8023145: G1: G1CollectedHeap::mark_strong_code_roots() needs to handle ParallelGCThreads=0
brutisso
parents: 19339
diff changeset
  6817
                                    worker_id,
17284e84baba 8023145: G1: G1CollectedHeap::mark_strong_code_roots() needs to handle ParallelGCThreads=0
brutisso
parents: 19339
diff changeset
  6818
                                    workers()->active_workers(),
17284e84baba 8023145: G1: G1CollectedHeap::mark_strong_code_roots() needs to handle ParallelGCThreads=0
brutisso
parents: 19339
diff changeset
  6819
                                    HeapRegion::ParMarkRootClaimValue);
17284e84baba 8023145: G1: G1CollectedHeap::mark_strong_code_roots() needs to handle ParallelGCThreads=0
brutisso
parents: 19339
diff changeset
  6820
  } else {
17284e84baba 8023145: G1: G1CollectedHeap::mark_strong_code_roots() needs to handle ParallelGCThreads=0
brutisso
parents: 19339
diff changeset
  6821
    heap_region_iterate(&cl);
17284e84baba 8023145: G1: G1CollectedHeap::mark_strong_code_roots() needs to handle ParallelGCThreads=0
brutisso
parents: 19339
diff changeset
  6822
  }
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6823
}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6824
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6825
class RebuildStrongCodeRootClosure: public CodeBlobClosure {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6826
  G1CollectedHeap* _g1h;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6827
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6828
public:
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6829
  RebuildStrongCodeRootClosure(G1CollectedHeap* g1h) :
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6830
    _g1h(g1h) {}
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6831
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6832
  void do_code_blob(CodeBlob* cb) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6833
    nmethod* nm = (cb != NULL) ? cb->as_nmethod_or_null() : NULL;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6834
    if (nm == NULL) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6835
      return;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6836
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6837
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6838
    if (ScavengeRootsInCode && nm->detect_scavenge_root_oops()) {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6839
      _g1h->register_nmethod(nm);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6840
    }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6841
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6842
};
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6843
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6844
void G1CollectedHeap::rebuild_strong_code_roots() {
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6845
  RebuildStrongCodeRootClosure blob_cl(this);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6846
  CodeCache::blobs_do(&blob_cl);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 18687
diff changeset
  6847
}