hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
author johnc
Thu, 22 Sep 2011 10:57:37 -0700
changeset 10670 4ea0e7d2ffbc
parent 10664 702062c83bd7
child 10671 431ff8629f97
permissions -rw-r--r--
6484982: G1: process references during evacuation pauses Summary: G1 now uses two reference processors - one is used by concurrent marking and the other is used by STW GCs (both full and incremental evacuation pauses). In an evacuation pause, the reference processor is embedded into the closures used to scan objects. Doing so causes causes reference objects to be 'discovered' by the reference processor. At the end of the evacuation pause, these discovered reference objects are processed - preserving (and copying) referent objects (and their reachable graphs) as appropriate. Reviewed-by: ysr, jwilhelm, brutisso, stefank, tonyp
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
/*
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
     2
 * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     4
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     7
 * published by the Free Software Foundation.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     8
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    13
 * accompanied this code).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    14
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 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"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    26
#include "code/icBuffer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    27
#include "gc_implementation/g1/bufferingOopClosure.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    28
#include "gc_implementation/g1/concurrentG1Refine.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    29
#include "gc_implementation/g1/concurrentG1RefineThread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    30
#include "gc_implementation/g1/concurrentMarkThread.inline.hpp"
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
    31
#include "gc_implementation/g1/g1AllocRegion.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    32
#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    33
#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
    34
#include "gc_implementation/g1/g1ErgoVerbose.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    35
#include "gc_implementation/g1/g1MarkSweep.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    36
#include "gc_implementation/g1/g1OopClosures.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    37
#include "gc_implementation/g1/g1RemSet.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    38
#include "gc_implementation/g1/heapRegionRemSet.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    39
#include "gc_implementation/g1/heapRegionSeq.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    40
#include "gc_implementation/g1/vm_operations_g1.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    41
#include "gc_implementation/shared/isGCActiveMark.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    42
#include "memory/gcLocker.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    43
#include "memory/genOopClosures.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    44
#include "memory/generationSpec.hpp"
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
    45
#include "memory/referenceProcessor.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    46
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    47
#include "oops/oop.pcgc.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    48
#include "runtime/aprofiler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    49
#include "runtime/vmThread.hpp"
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    50
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
    51
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
    52
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    53
// 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
    54
// to-be-collected) are printed at "strategic" points before / during
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    55
// / 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
    56
#define YOUNG_LIST_VERBOSE 0
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    57
// CURRENT STATUS
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    58
// This file is under construction.  Search for "FIXME".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    59
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    60
// INVARIANTS/NOTES
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    61
//
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    62
// All allocation activity covered by the G1CollectedHeap interface is
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    63
// serialized by acquiring the HeapLock.  This happens in mem_allocate
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    64
// and allocate_new_tlab, which are the "entry" points to the
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    65
// 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
    66
// 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
    67
// is done by clients of this interface.)
1374
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
// Local to this file.
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
class RefineCardTableEntryClosure: public CardTableEntryClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    72
  SuspendibleThreadSet* _sts;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    73
  G1RemSet* _g1rs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    74
  ConcurrentG1Refine* _cg1r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    75
  bool _concurrent;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    76
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    77
  RefineCardTableEntryClosure(SuspendibleThreadSet* sts,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    78
                              G1RemSet* g1rs,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    79
                              ConcurrentG1Refine* cg1r) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    80
    _sts(sts), _g1rs(g1rs), _cg1r(cg1r), _concurrent(true)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    81
  {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    82
  bool do_card_ptr(jbyte* card_ptr, int worker_i) {
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
    83
    bool oops_into_cset = _g1rs->concurrentRefineOneCard(card_ptr, worker_i, false);
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
    84
    // This path is executed by the concurrent refine or mutator threads,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
    85
    // 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
    86
    // that point into the collection set.
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
    87
    assert(!oops_into_cset, "should be");
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
    88
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    89
    if (_concurrent && _sts->should_yield()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    90
      // Caller will actually yield.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    91
      return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    92
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    93
    // Otherwise, we finished successfully; return true.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    94
    return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    95
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    96
  void set_concurrent(bool b) { _concurrent = b; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    97
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    98
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    99
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   100
class ClearLoggedCardTableEntryClosure: public CardTableEntryClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   101
  int _calls;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   102
  G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   103
  CardTableModRefBS* _ctbs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   104
  int _histo[256];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   105
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   106
  ClearLoggedCardTableEntryClosure() :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   107
    _calls(0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   108
  {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   109
    _g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   110
    _ctbs = (CardTableModRefBS*)_g1h->barrier_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   111
    for (int i = 0; i < 256; i++) _histo[i] = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   112
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   113
  bool do_card_ptr(jbyte* card_ptr, int worker_i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   114
    if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   115
      _calls++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   116
      unsigned char* ujb = (unsigned char*)card_ptr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   117
      int ind = (int)(*ujb);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   118
      _histo[ind]++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   119
      *card_ptr = -1;
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
    return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   122
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   123
  int calls() { return _calls; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   124
  void print_histo() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   125
    gclog_or_tty->print_cr("Card table value histogram:");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   126
    for (int i = 0; i < 256; i++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   127
      if (_histo[i] != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   128
        gclog_or_tty->print_cr("  %d: %d", i, _histo[i]);
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
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   131
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   132
};
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
class RedirtyLoggedCardTableEntryClosure: public CardTableEntryClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   135
  int _calls;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   136
  G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   137
  CardTableModRefBS* _ctbs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   138
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   139
  RedirtyLoggedCardTableEntryClosure() :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   140
    _calls(0)
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
    _g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   143
    _ctbs = (CardTableModRefBS*)_g1h->barrier_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   144
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   145
  bool do_card_ptr(jbyte* card_ptr, int worker_i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   146
    if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   147
      _calls++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   148
      *card_ptr = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   149
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   150
    return true;
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
  int calls() { return _calls; }
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
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   155
class RedirtyLoggedCardTableEntryFastClosure : public CardTableEntryClosure {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   156
public:
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   157
  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
   158
    *card_ptr = CardTableModRefBS::dirty_card_val();
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   159
    return true;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   160
  }
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   161
};
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   162
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   163
YoungList::YoungList(G1CollectedHeap* g1h)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   164
  : _g1h(g1h), _head(NULL),
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   165
    _length(0),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   166
    _last_sampled_rs_lengths(0),
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   167
    _survivor_head(NULL), _survivor_tail(NULL), _survivor_length(0)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   168
{
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   169
  guarantee( check_list_empty(false), "just making sure..." );
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   172
void YoungList::push_region(HeapRegion *hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   173
  assert(!hr->is_young(), "should not already be young");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   174
  assert(hr->get_next_young_region() == NULL, "cause it should!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   175
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   176
  hr->set_next_young_region(_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   177
  _head = hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   178
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   179
  hr->set_young();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   180
  double yg_surv_rate = _g1h->g1_policy()->predict_yg_surv_rate((int)_length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   181
  ++_length;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   182
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   183
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   184
void YoungList::add_survivor_region(HeapRegion* hr) {
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   185
  assert(hr->is_survivor(), "should be flagged as survivor region");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   186
  assert(hr->get_next_young_region() == NULL, "cause it should!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   187
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   188
  hr->set_next_young_region(_survivor_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   189
  if (_survivor_head == NULL) {
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   190
    _survivor_tail = hr;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   191
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   192
  _survivor_head = hr;
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
  ++_survivor_length;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   195
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   196
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   197
void YoungList::empty_list(HeapRegion* list) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   198
  while (list != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   199
    HeapRegion* next = list->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   200
    list->set_next_young_region(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   201
    list->uninstall_surv_rate_group();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   202
    list->set_not_young();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   203
    list = next;
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
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   206
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   207
void YoungList::empty_list() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   208
  assert(check_list_well_formed(), "young list should be well formed");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   209
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   210
  empty_list(_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   211
  _head = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   212
  _length = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   213
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   214
  empty_list(_survivor_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   215
  _survivor_head = NULL;
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   216
  _survivor_tail = NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   217
  _survivor_length = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   218
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   219
  _last_sampled_rs_lengths = 0;
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
  assert(check_list_empty(false), "just making sure...");
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   224
bool YoungList::check_list_well_formed() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   225
  bool ret = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   226
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   227
  size_t length = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   228
  HeapRegion* curr = _head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   229
  HeapRegion* last = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   230
  while (curr != NULL) {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   231
    if (!curr->is_young()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   232
      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
   233
                             "incorrectly tagged (y: %d, surv: %d)",
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   234
                             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
   235
                             curr->is_young(), curr->is_survivor());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   236
      ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   237
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   238
    ++length;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   239
    last = curr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   240
    curr = curr->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   241
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   242
  ret = ret && (length == _length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   243
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   244
  if (!ret) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   245
    gclog_or_tty->print_cr("### YOUNG LIST seems not well formed!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   246
    gclog_or_tty->print_cr("###   list has %d entries, _length is %d",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   247
                           length, _length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   248
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   249
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   250
  return ret;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   251
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   252
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   253
bool YoungList::check_list_empty(bool check_sample) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   254
  bool ret = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   255
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   256
  if (_length != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   257
    gclog_or_tty->print_cr("### YOUNG LIST should have 0 length, not %d",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   258
                  _length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   259
    ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   260
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   261
  if (check_sample && _last_sampled_rs_lengths != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   262
    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
   263
    ret = false;
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
  if (_head != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   266
    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
   267
    ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   268
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   269
  if (!ret) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   270
    gclog_or_tty->print_cr("### YOUNG LIST does not seem empty");
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
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   273
  return ret;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   274
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   275
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   276
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   277
YoungList::rs_length_sampling_init() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   278
  _sampled_rs_lengths = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   279
  _curr               = _head;
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   282
bool
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   283
YoungList::rs_length_sampling_more() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   284
  return _curr != NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   285
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   286
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   287
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   288
YoungList::rs_length_sampling_next() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   289
  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
   290
  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
   291
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   292
  _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
   293
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   294
  // 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
   295
  // 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
   296
  // 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
   297
  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
   298
    // 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
   299
    _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
   300
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   301
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   302
  _curr = _curr->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   303
  if (_curr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   304
    _last_sampled_rs_lengths = _sampled_rs_lengths;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   305
    // 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
   306
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   307
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   308
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   309
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   310
YoungList::reset_auxilary_lists() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   311
  guarantee( is_empty(), "young list should be empty" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   312
  assert(check_list_well_formed(), "young list should be well formed");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   313
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   314
  // Add survivor regions to SurvRateGroup.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   315
  _g1h->g1_policy()->note_start_adding_survivor_regions();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   316
  _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
   317
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   318
  for (HeapRegion* curr = _survivor_head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   319
       curr != NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   320
       curr = curr->get_next_young_region()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   321
    _g1h->g1_policy()->set_region_survivors(curr);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   322
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   323
    // 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
   324
    // 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
   325
    // pause.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   326
    _g1h->g1_policy()->add_region_to_incremental_cset_rhs(curr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   327
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   328
  _g1h->g1_policy()->note_stop_adding_survivor_regions();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   329
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   330
  _head   = _survivor_head;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   331
  _length = _survivor_length;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   332
  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
   333
    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
   334
    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
   335
    _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
   336
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   337
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   338
  // 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
   339
  // 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
   340
  // 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
   341
  // 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
   342
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   343
  _g1h->g1_policy()->finished_recalculating_age_indexes(false /* is_survivors */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   344
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   345
  assert(check_list_well_formed(), "young list should be well formed");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   346
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   347
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   348
void YoungList::print() {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   349
  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
   350
  const char* names[] = {"YOUNG", "SURVIVOR"};
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   351
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   352
  for (unsigned int list = 0; list < ARRAY_SIZE(lists); ++list) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   353
    gclog_or_tty->print_cr("%s LIST CONTENTS", names[list]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   354
    HeapRegion *curr = lists[list];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   355
    if (curr == NULL)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   356
      gclog_or_tty->print_cr("  empty");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   357
    while (curr != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   358
      gclog_or_tty->print_cr("  [%08x-%08x], t: %08x, P: %08x, N: %08x, C: %08x, "
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   359
                             "age: %4d, y: %d, surv: %d",
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   360
                             curr->bottom(), curr->end(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   361
                             curr->top(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   362
                             curr->prev_top_at_mark_start(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   363
                             curr->next_top_at_mark_start(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   364
                             curr->top_at_conc_mark_count(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   365
                             curr->age_in_surv_rate_group_cond(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   366
                             curr->is_young(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   367
                             curr->is_survivor());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   368
      curr = curr->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   369
    }
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   372
  gclog_or_tty->print_cr("");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   373
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   374
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   375
void G1CollectedHeap::push_dirty_cards_region(HeapRegion* hr)
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   376
{
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   377
  // 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
   378
  // by installing a self pointer.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   379
  HeapRegion* next = hr->get_next_dirty_cards_region();
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   380
  if (next == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   381
    HeapRegion* res = (HeapRegion*)
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   382
      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
   383
                          NULL);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   384
    if (res == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   385
      HeapRegion* head;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   386
      do {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   387
        // Put the region to the dirty cards region list.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   388
        head = _dirty_cards_region_list;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   389
        next = (HeapRegion*)
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   390
          Atomic::cmpxchg_ptr(hr, &_dirty_cards_region_list, head);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   391
        if (next == head) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   392
          assert(hr->get_next_dirty_cards_region() == hr,
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   393
                 "hr->get_next_dirty_cards_region() != hr");
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
            // The last region in the list points to itself.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   396
            hr->set_next_dirty_cards_region(hr);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   397
          } else {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   398
            hr->set_next_dirty_cards_region(next);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   399
          }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   400
        }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   401
      } while (next != head);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   402
    }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   403
  }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   404
}
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   405
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   406
HeapRegion* G1CollectedHeap::pop_dirty_cards_region()
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   407
{
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   408
  HeapRegion* head;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   409
  HeapRegion* hr;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   410
  do {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   411
    head = _dirty_cards_region_list;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   412
    if (head == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   413
      return NULL;
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
    HeapRegion* new_head = head->get_next_dirty_cards_region();
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   416
    if (head == new_head) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   417
      // The last region.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   418
      new_head = NULL;
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
    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
   421
                                          head);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   422
  } while (hr != head);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   423
  assert(hr != NULL, "invariant");
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   424
  hr->set_next_dirty_cards_region(NULL);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   425
  return hr;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   426
}
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   427
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   428
void G1CollectedHeap::stop_conc_gc_threads() {
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
   429
  _cg1r->stop();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   430
  _cmThread->stop();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   431
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   432
9935
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   433
#ifdef ASSERT
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   434
// 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
   435
// 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
   436
// 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
   437
// 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
   438
// regions have been retired.  It is used for debugging
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   439
// 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
   440
// 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
   441
// inaccurate, it is sufficient for G1 because the conservative
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   442
// implementation of is_scavengable() for G1 will indicate that
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   443
// all nmethods must be scanned during a partial collection.
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   444
bool G1CollectedHeap::is_in_partial_collection(const void* p) {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   445
  HeapRegion* hr = heap_region_containing(p);
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   446
  return hr != NULL && hr->in_collection_set();
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   447
}
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   448
#endif
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   449
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   450
// Returns true if the reference points to an object that
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   451
// can move in an incremental collecction.
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   452
bool G1CollectedHeap::is_scavengable(const void* p) {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   453
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   454
  G1CollectorPolicy* g1p = g1h->g1_policy();
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   455
  HeapRegion* hr = heap_region_containing(p);
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   456
  if (hr == NULL) {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   457
     // perm gen (or null)
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   458
     return false;
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   459
  } else {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   460
    return !hr->isHumongous();
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
}
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   463
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   464
void G1CollectedHeap::check_ct_logs_at_safepoint() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   465
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   466
  CardTableModRefBS* ct_bs = (CardTableModRefBS*)barrier_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   467
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   468
  // Count the dirty cards at the start.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   469
  CountNonCleanMemRegionClosure count1(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   470
  ct_bs->mod_card_iterate(&count1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   471
  int orig_count = count1.n();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   472
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   473
  // First clear the logged cards.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   474
  ClearLoggedCardTableEntryClosure clear;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   475
  dcqs.set_closure(&clear);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   476
  dcqs.apply_closure_to_all_completed_buffers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   477
  dcqs.iterate_closure_all_threads(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   478
  clear.print_histo();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   479
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   480
  // Now ensure that there's no dirty cards.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   481
  CountNonCleanMemRegionClosure count2(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   482
  ct_bs->mod_card_iterate(&count2);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   483
  if (count2.n() != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   484
    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
   485
                           count2.n(), orig_count);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   486
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   487
  guarantee(count2.n() == 0, "Card table should be clean.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   488
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   489
  RedirtyLoggedCardTableEntryClosure redirty;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   490
  JavaThread::dirty_card_queue_set().set_closure(&redirty);
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
  gclog_or_tty->print_cr("Log entries = %d, dirty cards = %d.",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   494
                         clear.calls(), orig_count);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   495
  guarantee(redirty.calls() == clear.calls(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   496
            "Or else mechanism is broken.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   497
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   498
  CountNonCleanMemRegionClosure count3(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   499
  ct_bs->mod_card_iterate(&count3);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   500
  if (count3.n() != orig_count) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   501
    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
   502
                           orig_count, count3.n());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   503
    guarantee(count3.n() >= orig_count, "Should have restored them all.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   504
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   505
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   506
  JavaThread::dirty_card_queue_set().set_closure(_refine_cte_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   507
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   508
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   509
// Private class members.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   510
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   511
G1CollectedHeap* G1CollectedHeap::_g1h;
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
// Private methods.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   514
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   515
HeapRegion*
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   516
G1CollectedHeap::new_region_try_secondary_free_list() {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   517
  MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   518
  while (!_secondary_free_list.is_empty() || free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   519
    if (!_secondary_free_list.is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   520
      if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   521
        gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   522
                               "secondary_free_list has "SIZE_FORMAT" entries",
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   523
                               _secondary_free_list.length());
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   524
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   525
      // It looks as if there are free regions available on the
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   526
      // 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
   527
      // again to allocate from it.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   528
      append_secondary_free_list();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   529
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   530
      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
   531
             "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
   532
      HeapRegion* res = _free_list.remove_head();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   533
      if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   534
        gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   535
                               "allocated "HR_FORMAT" from secondary_free_list",
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   536
                               HR_FORMAT_PARAMS(res));
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   537
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   538
      return res;
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
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   541
    // Wait here until we get notifed either when (a) there are no
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   542
    // 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
   543
    // the secondary_free_list.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   544
    SecondaryFreeList_lock->wait(Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   545
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   546
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   547
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   548
    gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   549
                           "could not allocate from secondary_free_list");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   550
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   551
  return NULL;
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
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   554
HeapRegion* G1CollectedHeap::new_region(size_t word_size, bool do_expand) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   555
  assert(!isHumongous(word_size) ||
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   556
                                  word_size <= (size_t) HeapRegion::GrainWords,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   557
         "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
   558
         "when we are allocating a single humongous region");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   559
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   560
  HeapRegion* res;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   561
  if (G1StressConcRegionFreeing) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   562
    if (!_secondary_free_list.is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   563
      if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   564
        gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   565
                               "forced to look at the secondary_free_list");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   566
      }
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   567
      res = new_region_try_secondary_free_list();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   568
      if (res != NULL) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   569
        return res;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   570
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   571
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   572
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   573
  res = _free_list.remove_head_or_null();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   574
  if (res == NULL) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   575
    if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   576
      gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   577
                             "res == NULL, trying the secondary_free_list");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   578
    }
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   579
    res = new_region_try_secondary_free_list();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   580
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   581
  if (res == NULL && do_expand) {
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   582
    ergo_verbose1(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   583
                  "attempt heap expansion",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   584
                  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
   585
                  ergo_format_byte("allocation request"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   586
                  word_size * HeapWordSize);
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   587
    if (expand(word_size * HeapWordSize)) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   588
      // Even though the heap was expanded, it might not have reached
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   589
      // the desired size. So, we cannot assume that the allocation
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   590
      // will succeed.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   591
      res = _free_list.remove_head_or_null();
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   592
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   593
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   594
  return res;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   595
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   596
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   597
size_t G1CollectedHeap::humongous_obj_allocate_find_first(size_t num_regions,
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   598
                                                          size_t word_size) {
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   599
  assert(isHumongous(word_size), "word_size should be humongous");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   600
  assert(num_regions * HeapRegion::GrainWords >= word_size, "pre-condition");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   601
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   602
  size_t first = G1_NULL_HRS_INDEX;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   603
  if (num_regions == 1) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   604
    // Only one region to allocate, no need to go through the slower
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   605
    // path. The caller will attempt the expasion if this fails, so
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   606
    // 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
   607
    HeapRegion* hr = new_region(word_size, false /* do_expand */);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   608
    if (hr != NULL) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   609
      first = hr->hrs_index();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   610
    } else {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   611
      first = G1_NULL_HRS_INDEX;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   612
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   613
  } else {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   614
    // We can't allocate humongous regions while cleanupComplete() is
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   615
    // 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
   616
    // 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
   617
    // 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
   618
    // 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
   619
    // one region to satisfy the current humongous allocation
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   620
    // 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
   621
    // region allocation code (see above).
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   622
    wait_while_free_regions_coming();
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   623
    append_secondary_free_list_if_not_empty_with_lock();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   624
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   625
    if (free_regions() >= num_regions) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   626
      first = _hrs.find_contiguous(num_regions);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   627
      if (first != G1_NULL_HRS_INDEX) {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   628
        for (size_t i = first; i < first + num_regions; ++i) {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   629
          HeapRegion* hr = region_at(i);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   630
          assert(hr->is_empty(), "sanity");
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   631
          assert(is_on_master_free_list(hr), "sanity");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   632
          hr->set_pending_removal(true);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   633
        }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   634
        _free_list.remove_all_pending(num_regions);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   635
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   636
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   637
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   638
  return first;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   639
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   640
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   641
HeapWord*
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   642
G1CollectedHeap::humongous_obj_allocate_initialize_regions(size_t first,
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   643
                                                           size_t num_regions,
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   644
                                                           size_t word_size) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   645
  assert(first != G1_NULL_HRS_INDEX, "pre-condition");
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   646
  assert(isHumongous(word_size), "word_size should be humongous");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   647
  assert(num_regions * HeapRegion::GrainWords >= word_size, "pre-condition");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   648
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   649
  // Index of last region in the series + 1.
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   650
  size_t last = first + num_regions;
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   651
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   652
  // We need to initialize the region(s) we just discovered. This is
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   653
  // a bit tricky given that it can happen concurrently with
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   654
  // refinement threads refining cards on these regions and
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   655
  // potentially wanting to refine the BOT as they are scanning
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   656
  // those cards (this can happen shortly after a cleanup; see CR
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   657
  // 6991377). So we have to set up the region(s) carefully and in
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   658
  // a specific order.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   659
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   660
  // The word size sum of all the regions we will allocate.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   661
  size_t word_size_sum = num_regions * HeapRegion::GrainWords;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   662
  assert(word_size <= word_size_sum, "sanity");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   663
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   664
  // This will be the "starts humongous" region.
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   665
  HeapRegion* first_hr = region_at(first);
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   666
  // The header of the new object will be placed at the bottom of
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   667
  // the first region.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   668
  HeapWord* new_obj = first_hr->bottom();
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   669
  // This will be the new end of the first region in the series that
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   670
  // should also match the end of the last region in the seriers.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   671
  HeapWord* new_end = new_obj + word_size_sum;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   672
  // This will be the new top of the first region that will reflect
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   673
  // this allocation.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   674
  HeapWord* new_top = new_obj + word_size;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   675
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   676
  // First, we need to zero the header of the space that we will be
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   677
  // allocating. When we update top further down, some refinement
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   678
  // threads might try to scan the region. By zeroing the header we
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   679
  // ensure that any thread that will try to scan the region will
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   680
  // come across the zero klass word and bail out.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   681
  //
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   682
  // NOTE: It would not have been correct to have used
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   683
  // CollectedHeap::fill_with_object() and make the space look like
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   684
  // an int array. The thread that is doing the allocation will
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   685
  // later update the object header to a potentially different array
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   686
  // type and, for a very short period of time, the klass and length
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   687
  // fields will be inconsistent. This could cause a refinement
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   688
  // thread to calculate the object size incorrectly.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   689
  Copy::fill_to_words(new_obj, oopDesc::header_size(), 0);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   690
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   691
  // We will set up the first region as "starts humongous". This
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   692
  // will also update the BOT covering all the regions to reflect
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   693
  // that there is a single object that starts at the bottom of the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   694
  // first region.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   695
  first_hr->set_startsHumongous(new_top, new_end);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   696
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   697
  // Then, if there are any, we will set up the "continues
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   698
  // humongous" regions.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   699
  HeapRegion* hr = NULL;
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   700
  for (size_t i = first + 1; i < last; ++i) {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   701
    hr = region_at(i);
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   702
    hr->set_continuesHumongous(first_hr);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   703
  }
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   704
  // If we have "continues humongous" regions (hr != NULL), then the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   705
  // end of the last one should match new_end.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   706
  assert(hr == NULL || hr->end() == new_end, "sanity");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   707
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   708
  // Up to this point no concurrent thread would have been able to
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   709
  // do any scanning on any region in this series. All the top
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   710
  // fields still point to bottom, so the intersection between
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   711
  // [bottom,top] and [card_start,card_end] will be empty. Before we
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   712
  // update the top fields, we'll do a storestore to make sure that
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   713
  // no thread sees the update to top before the zeroing of the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   714
  // object header and the BOT initialization.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   715
  OrderAccess::storestore();
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   716
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   717
  // Now that the BOT and the object header have been initialized,
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   718
  // we can update top of the "starts humongous" region.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   719
  assert(first_hr->bottom() < new_top && new_top <= first_hr->end(),
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   720
         "new_top should be in this region");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   721
  first_hr->set_top(new_top);
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   722
  if (_hr_printer.is_active()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   723
    HeapWord* bottom = first_hr->bottom();
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   724
    HeapWord* end = first_hr->orig_end();
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   725
    if ((first + 1) == last) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   726
      // the series has a single humongous region
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   727
      _hr_printer.alloc(G1HRPrinter::SingleHumongous, first_hr, new_top);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   728
    } else {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   729
      // the series has more than one humongous regions
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   730
      _hr_printer.alloc(G1HRPrinter::StartsHumongous, first_hr, end);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   731
    }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   732
  }
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   733
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   734
  // Now, we will update the top fields of the "continues humongous"
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   735
  // regions. The reason we need to do this is that, otherwise,
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   736
  // these regions would look empty and this will confuse parts of
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   737
  // G1. For example, the code that looks for a consecutive number
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   738
  // of empty regions will consider them empty and try to
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   739
  // re-allocate them. We can extend is_empty() to also include
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   740
  // !continuesHumongous(), but it is easier to just update the top
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   741
  // fields here. The way we set top for all regions (i.e., top ==
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   742
  // end for all regions but the last one, top == new_top for the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   743
  // last one) is actually used when we will free up the humongous
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   744
  // region in free_humongous_region().
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   745
  hr = NULL;
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   746
  for (size_t i = first + 1; i < last; ++i) {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   747
    hr = region_at(i);
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   748
    if ((i + 1) == last) {
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   749
      // last continues humongous region
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   750
      assert(hr->bottom() < new_top && new_top <= hr->end(),
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   751
             "new_top should fall on this region");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   752
      hr->set_top(new_top);
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   753
      _hr_printer.alloc(G1HRPrinter::ContinuesHumongous, hr, new_top);
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   754
    } else {
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   755
      // not last one
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   756
      assert(new_top > hr->end(), "new_top should be above this region");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   757
      hr->set_top(hr->end());
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   758
      _hr_printer.alloc(G1HRPrinter::ContinuesHumongous, hr, hr->end());
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   759
    }
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   760
  }
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   761
  // If we have continues humongous regions (hr != NULL), then the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   762
  // end of the last one should match new_end and its top should
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   763
  // match new_top.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   764
  assert(hr == NULL ||
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   765
         (hr->end() == new_end && hr->top() == new_top), "sanity");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   766
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   767
  assert(first_hr->used() == word_size * HeapWordSize, "invariant");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   768
  _summary_bytes_used += first_hr->used();
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   769
  _humongous_set.add(first_hr);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   770
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   771
  return new_obj;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   772
}
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   773
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   774
// If could fit into free regions w/o expansion, try.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   775
// Otherwise, if can expand, do so.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   776
// 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
   777
HeapWord* G1CollectedHeap::humongous_obj_allocate(size_t word_size) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   778
  assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   779
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   780
  verify_region_sets_optional();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   781
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   782
  size_t num_regions =
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   783
         round_to(word_size, HeapRegion::GrainWords) / HeapRegion::GrainWords;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   784
  size_t x_size = expansion_regions();
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   785
  size_t fs = _hrs.free_suffix();
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   786
  size_t first = humongous_obj_allocate_find_first(num_regions, word_size);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   787
  if (first == G1_NULL_HRS_INDEX) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   788
    // The only thing we can do now is attempt expansion.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   789
    if (fs + x_size >= num_regions) {
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   790
      // 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
   791
      // 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
   792
      // 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
   793
      // should have succeeded and we wouldn't be here.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   794
      //
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   795
      // 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
   796
      // 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
   797
      // room available.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   798
      assert(num_regions > fs, "earlier allocation should have succeeded");
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   799
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   800
      ergo_verbose1(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   801
                    "attempt heap expansion",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   802
                    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
   803
                    ergo_format_byte("allocation request"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   804
                    word_size * HeapWordSize);
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   805
      if (expand((num_regions - fs) * HeapRegion::GrainBytes)) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   806
        // Even though the heap was expanded, it might not have
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   807
        // reached the desired size. So, we cannot assume that the
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   808
        // allocation will succeed.
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   809
        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
   810
      }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   811
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   812
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   813
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   814
  HeapWord* result = NULL;
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   815
  if (first != G1_NULL_HRS_INDEX) {
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   816
    result =
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   817
      humongous_obj_allocate_initialize_regions(first, num_regions, word_size);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   818
    assert(result != NULL, "it should always return a valid result");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   819
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   820
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   821
  verify_region_sets_optional();
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   822
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   823
  return result;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   824
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   825
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   826
HeapWord* G1CollectedHeap::allocate_new_tlab(size_t word_size) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   827
  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
   828
  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
   829
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   830
  unsigned int dummy_gc_count_before;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   831
  return attempt_allocation(word_size, &dummy_gc_count_before);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   832
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   833
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   834
HeapWord*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   835
G1CollectedHeap::mem_allocate(size_t word_size,
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   836
                              bool*  gc_overhead_limit_was_exceeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   837
  assert_heap_not_locked_and_not_at_safepoint();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   838
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   839
  // Loop until the allocation is satisified, or unsatisfied after GC.
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   840
  for (int try_count = 1; /* we'll return */; try_count += 1) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   841
    unsigned int gc_count_before;
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   842
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   843
    HeapWord* result = NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   844
    if (!isHumongous(word_size)) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   845
      result = attempt_allocation(word_size, &gc_count_before);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   846
    } else {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   847
      result = attempt_allocation_humongous(word_size, &gc_count_before);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   848
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   849
    if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   850
      return result;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   851
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   852
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   853
    // Create the garbage collection operation...
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   854
    VM_G1CollectForAllocation op(gc_count_before, word_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   855
    // ...and get the VM thread to execute it.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   856
    VMThread::execute(&op);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   857
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   858
    if (op.prologue_succeeded() && op.pause_succeeded()) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   859
      // If the operation was successful we'll return the result even
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   860
      // if it is NULL. If the allocation attempt failed immediately
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   861
      // 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
   862
      HeapWord* result = op.result();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   863
      if (result != NULL && !isHumongous(word_size)) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   864
        // Allocations that take place on VM operations do not do any
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   865
        // 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
   866
        // this for non-humongous allocations, though.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   867
        dirty_young_block(result, word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   868
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   869
      return result;
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   870
    } else {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   871
      assert(op.result() == NULL,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   872
             "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
   873
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   874
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   875
    // Give a warning if we seem to be looping forever.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   876
    if ((QueuedAllocationWarningCount > 0) &&
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   877
        (try_count % QueuedAllocationWarningCount == 0)) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   878
      warning("G1CollectedHeap::mem_allocate retries %d times", try_count);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   879
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   880
  }
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   881
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   882
  ShouldNotReachHere();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   883
  return NULL;
1374
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
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   886
HeapWord* G1CollectedHeap::attempt_allocation_slow(size_t word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   887
                                           unsigned int *gc_count_before_ret) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   888
  // 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
   889
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   890
  assert_heap_not_locked_and_not_at_safepoint();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   891
  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
   892
         "be called for humongous allocation requests");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   893
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   894
  // 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
   895
  // (attempt_allocation()) failed to allocate.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   896
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   897
  // 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
   898
  // 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
   899
  // 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
   900
  // return NULL.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   901
  HeapWord* result = NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   902
  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
   903
    bool should_try_gc;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   904
    unsigned int gc_count_before;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   905
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   906
    {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   907
      MutexLockerEx x(Heap_lock);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   908
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   909
      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
   910
                                                      false /* bot_updates */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   911
      if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   912
        return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   913
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   914
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   915
      // 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
   916
      // 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
   917
      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
   918
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   919
      if (GC_locker::is_active_and_needs_gc()) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   920
        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
   921
          // 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
   922
          // 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
   923
          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
   924
                                                      false /* bot_updates */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   925
          if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   926
            return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   927
          }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   928
        }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   929
        should_try_gc = false;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   930
      } else {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   931
        // Read the GC count while still holding the Heap_lock.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   932
        gc_count_before = SharedHeap::heap()->total_collections();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   933
        should_try_gc = true;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   934
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   935
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   936
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   937
    if (should_try_gc) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   938
      bool succeeded;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   939
      result = do_collection_pause(word_size, gc_count_before, &succeeded);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   940
      if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   941
        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
   942
        return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   943
      }
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
      if (succeeded) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   946
        // 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
   947
        // 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
   948
        // further. We'll just return NULL.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   949
        MutexLockerEx x(Heap_lock);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   950
        *gc_count_before_ret = SharedHeap::heap()->total_collections();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   951
        return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   952
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   953
    } else {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   954
      GC_locker::stall_until_clear();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   955
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   956
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   957
    // We can reach here if we were unsuccessul in scheduling a
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   958
    // 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
   959
    // 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
   960
    // allocation attempt in case another thread successfully
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   961
    // 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
   962
    // 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
   963
    // 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
   964
    // iteration (after taking the Heap_lock).
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   965
    result = _mutator_alloc_region.attempt_allocation(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   966
                                                      false /* bot_updates */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   967
    if (result != NULL ){
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   968
      return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   969
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   970
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   971
    // 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
   972
    if ((QueuedAllocationWarningCount > 0) &&
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   973
        (try_count % QueuedAllocationWarningCount == 0)) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   974
      warning("G1CollectedHeap::attempt_allocation_slow() "
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   975
              "retries %d times", try_count);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   976
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   977
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   978
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   979
  ShouldNotReachHere();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   980
  return NULL;
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
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   983
HeapWord* G1CollectedHeap::attempt_allocation_humongous(size_t word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   984
                                          unsigned int * gc_count_before_ret) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   985
  // 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
   986
  // 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
   987
  // 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
   988
  // 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
   989
  // 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
   990
  // 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
   991
  // 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
   992
  // 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
   993
  // 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
   994
  // much as possible.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   995
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   996
  assert_heap_not_locked_and_not_at_safepoint();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   997
  assert(isHumongous(word_size), "attempt_allocation_humongous() "
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   998
         "should only be called for humongous allocations");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   999
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1000
  // 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
  1001
  // 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
  1002
  // 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
  1003
  // return NULL.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1004
  HeapWord* result = NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1005
  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
  1006
    bool should_try_gc;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1007
    unsigned int gc_count_before;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1008
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1009
    {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1010
      MutexLockerEx x(Heap_lock);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1011
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1012
      // 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
  1013
      // 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
  1014
      // 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
  1015
      result = humongous_obj_allocate(word_size);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1016
      if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1017
        return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1018
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1019
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1020
      if (GC_locker::is_active_and_needs_gc()) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1021
        should_try_gc = false;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1022
      } else {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1023
        // Read the GC count while still holding the Heap_lock.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1024
        gc_count_before = SharedHeap::heap()->total_collections();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1025
        should_try_gc = true;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1026
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1027
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1028
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1029
    if (should_try_gc) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1030
      // 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
  1031
      // 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
  1032
      // 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
  1033
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1034
      bool succeeded;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1035
      result = do_collection_pause(word_size, gc_count_before, &succeeded);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1036
      if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1037
        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
  1038
        return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1039
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1040
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1041
      if (succeeded) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1042
        // 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
  1043
        // 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
  1044
        // further. We'll just return NULL.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1045
        MutexLockerEx x(Heap_lock);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1046
        *gc_count_before_ret = SharedHeap::heap()->total_collections();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1047
        return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1048
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1049
    } else {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1050
      GC_locker::stall_until_clear();
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
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1053
    // We can reach here if we were unsuccessul in scheduling a
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1054
    // 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
  1055
    // 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
  1056
    // allocation attempt in case another thread successfully
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1057
    // 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
  1058
    // warning if we seem to be looping forever.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1059
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1060
    if ((QueuedAllocationWarningCount > 0) &&
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1061
        (try_count % QueuedAllocationWarningCount == 0)) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1062
      warning("G1CollectedHeap::attempt_allocation_humongous() "
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1063
              "retries %d times", try_count);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1064
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1065
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1066
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1067
  ShouldNotReachHere();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1068
  return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1069
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1070
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1071
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
  1072
                                       bool expect_null_mutator_alloc_region) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1073
  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
  1074
  assert(_mutator_alloc_region.get() == NULL ||
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1075
                                             !expect_null_mutator_alloc_region,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1076
         "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
  1077
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1078
  if (!isHumongous(word_size)) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1079
    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
  1080
                                                      false /* bot_updates */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1081
  } else {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1082
    return humongous_obj_allocate(word_size);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1083
  }
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
  ShouldNotReachHere();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1086
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1087
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1088
class PostMCRemSetClearClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1089
  ModRefBarrierSet* _mr_bs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1090
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1091
  PostMCRemSetClearClosure(ModRefBarrierSet* mr_bs) : _mr_bs(mr_bs) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1092
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1093
    r->reset_gc_time_stamp();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1094
    if (r->continuesHumongous())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1095
      return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1096
    HeapRegionRemSet* hrrs = r->rem_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1097
    if (hrrs != NULL) hrrs->clear();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1098
    // You might think here that we could clear just the cards
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1099
    // 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
  1100
    // 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
  1101
    // from being enqueued, and cause it to be missed.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1102
    // 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
  1103
    _mr_bs->clear(MemRegion(r->bottom(), r->end()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1104
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1105
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1106
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1107
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1108
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1109
class PostMCRemSetInvalidateClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1110
  ModRefBarrierSet* _mr_bs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1111
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1112
  PostMCRemSetInvalidateClosure(ModRefBarrierSet* mr_bs) : _mr_bs(mr_bs) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1113
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1114
    if (r->continuesHumongous()) return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1115
    if (r->used_region().word_size() != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1116
      _mr_bs->invalidate(r->used_region(), true /*whole heap*/);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1117
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1118
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1119
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1120
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1121
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1122
class RebuildRSOutOfRegionClosure: public HeapRegionClosure {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1123
  G1CollectedHeap*   _g1h;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1124
  UpdateRSOopClosure _cl;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1125
  int                _worker_i;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1126
public:
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1127
  RebuildRSOutOfRegionClosure(G1CollectedHeap* g1, int worker_i = 0) :
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  1128
    _cl(g1->g1_rem_set(), worker_i),
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1129
    _worker_i(worker_i),
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1130
    _g1h(g1)
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1131
  { }
7385
eaca4b61b374 6978187: G1: assert(ParallelGCThreads> 1 || n_yielded() == _hrrs->occupied()) strikes again
johnc
parents: 6980
diff changeset
  1132
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1133
  bool doHeapRegion(HeapRegion* r) {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1134
    if (!r->continuesHumongous()) {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1135
      _cl.set_from(r);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1136
      r->oop_iterate(&_cl);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1137
    }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1138
    return false;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1139
  }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1140
};
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1141
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1142
class ParRebuildRSTask: public AbstractGangTask {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1143
  G1CollectedHeap* _g1;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1144
public:
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1145
  ParRebuildRSTask(G1CollectedHeap* g1)
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1146
    : AbstractGangTask("ParRebuildRSTask"),
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1147
      _g1(g1)
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1148
  { }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1149
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1150
  void work(int i) {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1151
    RebuildRSOutOfRegionClosure rebuild_rs(_g1, i);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1152
    _g1->heap_region_par_iterate_chunked(&rebuild_rs, i,
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1153
                                         HeapRegion::RebuildRSClaimValue);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1154
  }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1155
};
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1156
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1157
class PostCompactionPrinterClosure: public HeapRegionClosure {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1158
private:
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1159
  G1HRPrinter* _hr_printer;
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1160
public:
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1161
  bool doHeapRegion(HeapRegion* hr) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1162
    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
  1163
    // We only generate output for non-empty regions.
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1164
    if (!hr->is_empty()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1165
      if (!hr->isHumongous()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1166
        _hr_printer->post_compaction(hr, G1HRPrinter::Old);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1167
      } else if (hr->startsHumongous()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1168
        if (hr->capacity() == (size_t) HeapRegion::GrainBytes) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1169
          // single humongous region
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1170
          _hr_printer->post_compaction(hr, G1HRPrinter::SingleHumongous);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1171
        } else {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1172
          _hr_printer->post_compaction(hr, G1HRPrinter::StartsHumongous);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1173
        }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1174
      } else {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1175
        assert(hr->continuesHumongous(), "only way to get here");
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1176
        _hr_printer->post_compaction(hr, G1HRPrinter::ContinuesHumongous);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1177
      }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1178
    }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1179
    return false;
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1180
  }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1181
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1182
  PostCompactionPrinterClosure(G1HRPrinter* hr_printer)
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1183
    : _hr_printer(hr_printer) { }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1184
};
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1185
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1186
bool G1CollectedHeap::do_collection(bool explicit_gc,
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1187
                                    bool clear_all_soft_refs,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1188
                                    size_t word_size) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1189
  assert_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1190
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  1191
  if (GC_locker::check_active_before_gc()) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1192
    return false;
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  1193
  }
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  1194
7896
08aadd7aa3ee 6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents: 7659
diff changeset
  1195
  SvcGCMarker sgcm(SvcGCMarker::FULL);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1196
  ResourceMark rm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1197
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1198
  if (PrintHeapAtGC) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1199
    Universe::print_heap_before_gc();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1200
  }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1201
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1202
  verify_region_sets_optional();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1203
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1204
  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
  1205
                           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
  1206
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1207
  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
  1208
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1209
  {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1210
    IsGCActiveMark x;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1211
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1212
    // Timing
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1213
    bool system_gc = (gc_cause() == GCCause::_java_lang_system_gc);
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1214
    assert(!system_gc || explicit_gc, "invariant");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1215
    gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1216
    TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1217
    TraceTime t(system_gc ? "Full GC (System.gc())" : "Full GC",
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1218
                PrintGC, true, gclog_or_tty);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1219
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  1220
    TraceCollectorStats tcs(g1mm()->full_collection_counters());
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents: 9424
diff changeset
  1221
    TraceMemoryManagerStats tms(true /* fullGC */, gc_cause());
4459
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  1222
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1223
    double start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1224
    g1_policy()->record_full_collection_start();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1225
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1226
    wait_while_free_regions_coming();
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  1227
    append_secondary_free_list_if_not_empty_with_lock();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1228
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1229
    gc_prologue(true);
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1230
    increment_total_collections(true /* full gc */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1231
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1232
    size_t g1h_prev_used = used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1233
    assert(used() == recalculate_used(), "Should be equal");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1234
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1235
    if (VerifyBeforeGC && total_collections() >= VerifyGCStartAt) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1236
      HandleMark hm;  // Discard invalid handles created during verification
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1237
      gclog_or_tty->print(" VerifyBeforeGC:");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1238
      prepare_for_verify();
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  1239
      Universe::verify(/* allow dirty */ true,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  1240
                       /* silent      */ false,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  1241
                       /* option      */ VerifyOption_G1UsePrevMarking);
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  1242
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1243
    }
10282
aa2bcd7f4149 6810861: G1: support -XX:+{PrintClassHistogram,HeapDump}{Before,After}FullGC
ysr
parents: 10280
diff changeset
  1244
    pre_full_gc_dump();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1245
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1246
    COMPILER2_PRESENT(DerivedPointerTable::clear());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1247
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1248
    // Disable discovery and empty the discovered lists
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1249
    // for the CM ref processor.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1250
    ref_processor_cm()->disable_discovery();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1251
    ref_processor_cm()->abandon_partial_discovery();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1252
    ref_processor_cm()->verify_no_references_recorded();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1253
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1254
    // Abandon current iterations of concurrent marking and concurrent
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1255
    // refinement, if any are in progress.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1256
    concurrent_mark()->abort();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1257
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1258
    // Make sure we'll choose a new allocation region afterwards.
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1259
    release_mutator_alloc_region();
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1260
    abandon_gc_alloc_regions();
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  1261
    g1_rem_set()->cleanupHRRS();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1262
    tear_down_region_lists();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1263
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1264
    // We should call this after we retire any currently active alloc
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1265
    // regions so that all the ALLOC / RETIRE events are generated
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1266
    // before the start GC event.
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1267
    _hr_printer.start_gc(true /* full */, (size_t) total_collections());
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1268
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1269
    // We may have added regions to the current incremental collection
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1270
    // set between the last GC or pause and now. We need to clear the
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1271
    // incremental collection set and then start rebuilding it afresh
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1272
    // after this full GC.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1273
    abandon_collection_set(g1_policy()->inc_cset_head());
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1274
    g1_policy()->clear_incremental_cset();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1275
    g1_policy()->stop_incremental_cset_building();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1276
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  1277
    empty_young_list();
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  1278
    g1_policy()->set_full_young_gcs(true);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1279
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1280
    // See the comments in g1CollectedHeap.hpp and
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1281
    // G1CollectedHeap::ref_processing_init() about
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  1282
    // how reference processing currently works in G1.
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  1283
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1284
    // Temporarily make discovery by the STW ref processor single threaded (non-MT).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1285
    ReferenceProcessorMTDiscoveryMutator stw_rp_disc_ser(ref_processor_stw(), false);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1286
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1287
    // Temporarily clear the STW ref processor's _is_alive_non_header field.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1288
    ReferenceProcessorIsAliveMutator stw_rp_is_alive_null(ref_processor_stw(), NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1289
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1290
    ref_processor_stw()->enable_discovery(true /*verify_disabled*/, true /*verify_no_refs*/);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1291
    ref_processor_stw()->setup_policy(do_clear_all_soft_refs);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1292
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1293
    // Do collection work
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1294
    {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1295
      HandleMark hm;  // Discard invalid handles created during gc
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1296
      G1MarkSweep::invoke_at_safepoint(ref_processor_stw(), do_clear_all_soft_refs);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1297
    }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1298
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1299
    assert(free_regions() == 0, "we should not have added any free regions");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1300
    rebuild_region_lists();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1301
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1302
    _summary_bytes_used = recalculate_used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1303
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1304
    // Enqueue any discovered reference objects that have
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1305
    // not been removed from the discovered lists.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1306
    ref_processor_stw()->enqueue_discovered_references();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1307
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1308
    COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1309
4459
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  1310
    MemoryService::track_memory_usage();
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  1311
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1312
    if (VerifyAfterGC && total_collections() >= VerifyGCStartAt) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1313
      HandleMark hm;  // Discard invalid handles created during verification
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1314
      gclog_or_tty->print(" VerifyAfterGC:");
2249
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  1315
      prepare_for_verify();
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  1316
      Universe::verify(/* allow dirty */ false,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  1317
                       /* silent      */ false,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  1318
                       /* option      */ VerifyOption_G1UsePrevMarking);
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  1319
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1320
    }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1321
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1322
    assert(!ref_processor_stw()->discovery_enabled(), "Postcondition");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1323
    ref_processor_stw()->verify_no_references_recorded();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1324
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1325
    // Note: since we've just done a full GC, concurrent
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1326
    // marking is no longer active. Therefore we need not
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1327
    // re-enable reference discovery for the CM ref processor.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1328
    // That will be done at the start of the next marking cycle.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1329
    assert(!ref_processor_cm()->discovery_enabled(), "Postcondition");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1330
    ref_processor_cm()->verify_no_references_recorded();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1331
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1332
    reset_gc_time_stamp();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1333
    // Since everything potentially moved, we will clear all remembered
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1334
    // sets, and clear all cards.  Later we will rebuild remebered
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1335
    // sets. We will also reset the GC time stamps of the regions.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1336
    PostMCRemSetClearClosure rs_clear(mr_bs());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1337
    heap_region_iterate(&rs_clear);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1338
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1339
    // Resize the heap if necessary.
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1340
    resize_if_necessary_after_full_collection(explicit_gc ? 0 : word_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1341
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1342
    if (_hr_printer.is_active()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1343
      // We should do this after we potentially resize the heap so
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1344
      // that all the COMMIT / UNCOMMIT events are generated before
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1345
      // the end GC event.
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1346
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1347
      PostCompactionPrinterClosure cl(hr_printer());
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1348
      heap_region_iterate(&cl);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1349
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1350
      _hr_printer.end_gc(true /* full */, (size_t) total_collections());
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1351
    }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1352
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1353
    if (_cg1r->use_cache()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1354
      _cg1r->clear_and_record_card_counts();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1355
      _cg1r->clear_hot_cache();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1356
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1357
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1358
    // Rebuild remembered sets of all regions.
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  1359
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  1360
    if (G1CollectedHeap::use_parallel_gc_threads()) {
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1361
      ParRebuildRSTask rebuild_rs_task(this);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1362
      assert(check_heap_region_claim_values(
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1363
             HeapRegion::InitialClaimValue), "sanity check");
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1364
      set_par_threads(workers()->total_workers());
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1365
      workers()->run_task(&rebuild_rs_task);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1366
      set_par_threads(0);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1367
      assert(check_heap_region_claim_values(
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1368
             HeapRegion::RebuildRSClaimValue), "sanity check");
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1369
      reset_heap_region_claim_values();
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1370
    } else {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1371
      RebuildRSOutOfRegionClosure rebuild_rs(this);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1372
      heap_region_iterate(&rebuild_rs);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1373
    }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1374
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1375
    if (PrintGC) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1376
      print_size_transition(gclog_or_tty, g1h_prev_used, used(), capacity());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1377
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1378
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1379
    if (true) { // FIXME
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1380
      // Ask the permanent generation to adjust size for full collections
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1381
      perm()->compute_new_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1382
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1383
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1384
    // Start a new incremental collection set for the next pause
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1385
    assert(g1_policy()->collection_set() == NULL, "must be");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1386
    g1_policy()->start_incremental_cset_building();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1387
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1388
    // Clear the _cset_fast_test bitmap in anticipation of adding
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1389
    // regions to the incremental collection set for the next
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1390
    // evacuation pause.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1391
    clear_cset_fast_test();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1392
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1393
    init_mutator_alloc_region();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1394
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1395
    double end = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1396
    g1_policy()->record_full_collection_end();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1397
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  1398
#ifdef TRACESPINNING
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  1399
    ParallelTaskTerminator::print_termination_counts();
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  1400
#endif
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  1401
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1402
    gc_epilogue(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1403
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  1404
    // Discard all rset updates
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  1405
    JavaThread::dirty_card_queue_set().abandon_logs();
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  1406
    assert(!G1DeferredRSUpdate
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  1407
           || (G1DeferredRSUpdate && (dirty_card_queue_set().completed_buffers_num() == 0)), "Should not be any");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1408
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1409
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  1410
  _young_list->reset_sampled_info();
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  1411
  // At this point there should be no regions in the
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  1412
  // entire heap tagged as young.
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  1413
  assert( check_young_list_empty(true /* check_heap */),
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  1414
    "young list should be empty at this point");
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1415
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1416
  // Update the number of full collections that have been completed.
7455
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  1417
  increment_full_collections_completed(false /* concurrent */);
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1418
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1419
  _hrs.verify_optional();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1420
  verify_region_sets_optional();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1421
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1422
  if (PrintHeapAtGC) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1423
    Universe::print_heap_after_gc();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1424
  }
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  1425
  g1mm()->update_counters();
10282
aa2bcd7f4149 6810861: G1: support -XX:+{PrintClassHistogram,HeapDump}{Before,After}FullGC
ysr
parents: 10280
diff changeset
  1426
  post_full_gc_dump();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1427
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1428
  return true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1429
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1430
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1431
void G1CollectedHeap::do_full_collection(bool clear_all_soft_refs) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1432
  // do_collection() will return whether it succeeded in performing
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1433
  // the GC. Currently, there is no facility on the
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1434
  // do_full_collection() API to notify the caller than the collection
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1435
  // 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
  1436
  // locker). So, right now, we'll ignore the return value.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1437
  bool dummy = do_collection(true,                /* explicit_gc */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1438
                             clear_all_soft_refs,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1439
                             0                    /* word_size */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1440
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1441
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1442
// This code is mostly copied from TenuredGeneration.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1443
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1444
G1CollectedHeap::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1445
resize_if_necessary_after_full_collection(size_t word_size) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1446
  assert(MinHeapFreeRatio <= MaxHeapFreeRatio, "sanity check");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1447
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1448
  // Include the current allocation, if any, and bytes that will be
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1449
  // pre-allocated to support collections, as "used".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1450
  const size_t used_after_gc = used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1451
  const size_t capacity_after_gc = capacity();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1452
  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
  1453
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1454
  // This is enforced in arguments.cpp.
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1455
  assert(MinHeapFreeRatio <= MaxHeapFreeRatio,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1456
         "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
  1457
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1458
  // 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
  1459
  const double minimum_free_percentage = (double) MinHeapFreeRatio / 100.0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1460
  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
  1461
  const double maximum_free_percentage = (double) MaxHeapFreeRatio / 100.0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1462
  const double minimum_used_percentage = 1.0 - maximum_free_percentage;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1463
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1464
  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
  1465
  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
  1466
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1467
  // 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
  1468
  // 32-bit size_t's.
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1469
  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
  1470
  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
  1471
  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
  1472
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1473
  // 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
  1474
  // 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
  1475
  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
  1476
  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
  1477
                                    desired_capacity_upper_bound);
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1478
  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
  1479
                                    desired_capacity_upper_bound);
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1480
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1481
  // 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
  1482
  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
  1483
  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
  1484
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1485
  // 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
  1486
  // 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
  1487
  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
  1488
         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
  1489
                 "maximum_desired_capacity = "SIZE_FORMAT,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1490
                 minimum_desired_capacity, maximum_desired_capacity));
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1491
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1492
  // 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
  1493
  // 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
  1494
  // 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
  1495
  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
  1496
  // 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
  1497
  // 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
  1498
  // 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
  1499
  maximum_desired_capacity =  MAX2(maximum_desired_capacity, min_heap_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1500
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1501
  if (capacity_after_gc < minimum_desired_capacity) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1502
    // Don't expand unless it's significant
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1503
    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
  1504
    ergo_verbose4(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1505
                  "attempt heap expansion",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1506
                  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
  1507
                                     "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
  1508
                  ergo_format_byte("capacity")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1509
                  ergo_format_byte("occupancy")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1510
                  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
  1511
                  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
  1512
                  minimum_desired_capacity, (double) MinHeapFreeRatio);
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1513
    expand(expand_bytes);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1514
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1515
    // 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
  1516
  } else if (capacity_after_gc > maximum_desired_capacity) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1517
    // Capacity too large, compute shrinking size
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1518
    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
  1519
    ergo_verbose4(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1520
                  "attempt heap shrinking",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1521
                  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
  1522
                                     "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
  1523
                  ergo_format_byte("capacity")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1524
                  ergo_format_byte("occupancy")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1525
                  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
  1526
                  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
  1527
                  maximum_desired_capacity, (double) MaxHeapFreeRatio);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1528
    shrink(shrink_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1529
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1530
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1531
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1532
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1533
HeapWord*
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1534
G1CollectedHeap::satisfy_failed_allocation(size_t word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1535
                                           bool* succeeded) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1536
  assert_at_safepoint(true /* should_be_vm_thread */);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1537
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1538
  *succeeded = true;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1539
  // Let's attempt the allocation first.
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1540
  HeapWord* result =
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1541
    attempt_allocation_at_safepoint(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1542
                                 false /* expect_null_mutator_alloc_region */);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1543
  if (result != NULL) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1544
    assert(*succeeded, "sanity");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1545
    return result;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1546
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1547
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1548
  // 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
  1549
  // incremental pauses.  Therefore, at least for now, we'll favor
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1550
  // 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
  1551
  // do something smarter than full collection to satisfy a failed alloc.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1552
  result = expand_and_allocate(word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1553
  if (result != NULL) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1554
    assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1555
    return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1556
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1557
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1558
  // 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
  1559
  bool gc_succeeded = do_collection(false, /* explicit_gc */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1560
                                    false, /* clear_all_soft_refs */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1561
                                    word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1562
  if (!gc_succeeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1563
    *succeeded = false;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1564
    return NULL;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1565
  }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1566
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1567
  // Retry the allocation
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1568
  result = attempt_allocation_at_safepoint(word_size,
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1569
                                  true /* expect_null_mutator_alloc_region */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1570
  if (result != NULL) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1571
    assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1572
    return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1573
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1574
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1575
  // Then, try a Full GC that will collect all soft references.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1576
  gc_succeeded = do_collection(false, /* explicit_gc */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1577
                               true,  /* clear_all_soft_refs */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1578
                               word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1579
  if (!gc_succeeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1580
    *succeeded = false;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1581
    return NULL;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1582
  }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1583
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1584
  // Retry the allocation once more
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1585
  result = attempt_allocation_at_safepoint(word_size,
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1586
                                  true /* expect_null_mutator_alloc_region */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1587
  if (result != NULL) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1588
    assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1589
    return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1590
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1591
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1592
  assert(!collector_policy()->should_clear_all_soft_refs(),
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1593
         "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
  1594
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1595
  // What else?  We might try synchronous finalization later.  If the total
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1596
  // space available is large enough for the allocation, then a more
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1597
  // complete compaction phase than we've tried so far might be
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1598
  // appropriate.
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1599
  assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1600
  return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1601
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1602
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1603
// Attempting to expand the heap sufficiently
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1604
// to support an allocation of the given "word_size".  If
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1605
// successful, perform the allocation and return the address of the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1606
// allocated block, or else "NULL".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1607
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1608
HeapWord* G1CollectedHeap::expand_and_allocate(size_t word_size) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1609
  assert_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1610
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1611
  verify_region_sets_optional();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1612
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1613
  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
  1614
  ergo_verbose1(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1615
                "attempt heap expansion",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1616
                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
  1617
                ergo_format_byte("allocation request"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1618
                word_size * HeapWordSize);
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1619
  if (expand(expand_bytes)) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1620
    _hrs.verify_optional();
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1621
    verify_region_sets_optional();
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1622
    return attempt_allocation_at_safepoint(word_size,
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1623
                                 false /* expect_null_mutator_alloc_region */);
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1624
  }
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1625
  return NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1626
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1627
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1628
void G1CollectedHeap::update_committed_space(HeapWord* old_end,
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1629
                                             HeapWord* new_end) {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1630
  assert(old_end != new_end, "don't call this otherwise");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1631
  assert((HeapWord*) _g1_storage.high() == new_end, "invariant");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1632
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1633
  // Update the committed mem region.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1634
  _g1_committed.set_end(new_end);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1635
  // Tell the card table about the update.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1636
  Universe::heap()->barrier_set()->resize_covered_region(_g1_committed);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1637
  // Tell the BOT about the update.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1638
  _bot_shared->resize(_g1_committed.word_size());
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1639
}
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1640
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1641
bool G1CollectedHeap::expand(size_t expand_bytes) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1642
  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
  1643
  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
  1644
  aligned_expand_bytes = align_size_up(aligned_expand_bytes,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1645
                                       HeapRegion::GrainBytes);
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1646
  ergo_verbose2(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1647
                "expand the heap",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1648
                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
  1649
                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
  1650
                expand_bytes, aligned_expand_bytes);
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1651
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1652
  // First commit the memory.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1653
  HeapWord* old_end = (HeapWord*) _g1_storage.high();
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1654
  bool successful = _g1_storage.expand_by(aligned_expand_bytes);
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1655
  if (successful) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1656
    // Then propagate this update to the necessary data structures.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1657
    HeapWord* new_end = (HeapWord*) _g1_storage.high();
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1658
    update_committed_space(old_end, new_end);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1659
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1660
    FreeRegionList expansion_list("Local Expansion List");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1661
    MemRegion mr = _hrs.expand_by(old_end, new_end, &expansion_list);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1662
    assert(mr.start() == old_end, "post-condition");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1663
    // mr might be a smaller region than what was requested if
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1664
    // expand_by() was unable to allocate the HeapRegion instances
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1665
    assert(mr.end() <= new_end, "post-condition");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1666
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1667
    size_t actual_expand_bytes = mr.byte_size();
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1668
    assert(actual_expand_bytes <= aligned_expand_bytes, "post-condition");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1669
    assert(actual_expand_bytes == expansion_list.total_capacity_bytes(),
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1670
           "post-condition");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1671
    if (actual_expand_bytes < aligned_expand_bytes) {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1672
      // 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
  1673
      // need to shrink the committed space accordingly.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1674
      assert(mr.end() < new_end, "invariant");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1675
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1676
      size_t diff_bytes = aligned_expand_bytes - actual_expand_bytes;
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1677
      // First uncommit the memory.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1678
      _g1_storage.shrink_by(diff_bytes);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1679
      // Then propagate this update to the necessary data structures.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1680
      update_committed_space(new_end, mr.end());
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1681
    }
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1682
    _free_list.add_as_tail(&expansion_list);
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1683
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1684
    if (_hr_printer.is_active()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1685
      HeapWord* curr = mr.start();
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1686
      while (curr < mr.end()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1687
        HeapWord* curr_end = curr + HeapRegion::GrainWords;
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1688
        _hr_printer.commit(curr, curr_end);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1689
        curr = curr_end;
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1690
      }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1691
      assert(curr == mr.end(), "post-condition");
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1692
    }
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1693
    g1_policy()->record_new_heap_size(n_regions());
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1694
  } else {
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1695
    ergo_verbose0(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1696
                  "did not expand the heap",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1697
                  ergo_format_reason("heap expansion operation failed"));
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1698
    // The expansion of the virtual storage space was unsuccessful.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1699
    // 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
  1700
    if (G1ExitOnExpansionFailure &&
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1701
        _g1_storage.uncommitted_size() >= aligned_expand_bytes) {
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1702
      // We had head room...
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1703
      vm_exit_out_of_memory(aligned_expand_bytes, "G1 heap expansion");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1704
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1705
  }
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1706
  return successful;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1707
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1708
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1709
void G1CollectedHeap::shrink_helper(size_t shrink_bytes) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1710
  size_t old_mem_size = _g1_storage.committed_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1711
  size_t aligned_shrink_bytes =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1712
    ReservedSpace::page_align_size_down(shrink_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1713
  aligned_shrink_bytes = align_size_down(aligned_shrink_bytes,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1714
                                         HeapRegion::GrainBytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1715
  size_t num_regions_deleted = 0;
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1716
  MemRegion mr = _hrs.shrink_by(aligned_shrink_bytes, &num_regions_deleted);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1717
  HeapWord* old_end = (HeapWord*) _g1_storage.high();
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1718
  assert(mr.end() == old_end, "post-condition");
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1719
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1720
  ergo_verbose3(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1721
                "shrink the heap",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1722
                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
  1723
                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
  1724
                ergo_format_byte("attempted shrinking amount"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1725
                shrink_bytes, aligned_shrink_bytes, mr.byte_size());
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1726
  if (mr.byte_size() > 0) {
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1727
    if (_hr_printer.is_active()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1728
      HeapWord* curr = mr.end();
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1729
      while (curr > mr.start()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1730
        HeapWord* curr_end = curr;
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1731
        curr -= HeapRegion::GrainWords;
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1732
        _hr_printer.uncommit(curr, curr_end);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1733
      }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1734
      assert(curr == mr.start(), "post-condition");
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1735
    }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1736
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1737
    _g1_storage.shrink_by(mr.byte_size());
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1738
    HeapWord* new_end = (HeapWord*) _g1_storage.high();
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1739
    assert(mr.start() == new_end, "post-condition");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1740
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1741
    _expansion_regions += num_regions_deleted;
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1742
    update_committed_space(old_end, new_end);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1743
    HeapRegionRemSet::shrink_heap(n_regions());
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1744
    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
  1745
  } else {
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1746
    ergo_verbose0(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1747
                  "did not shrink the heap",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1748
                  ergo_format_reason("heap shrinking operation failed"));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1749
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1750
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1751
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1752
void G1CollectedHeap::shrink(size_t shrink_bytes) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1753
  verify_region_sets_optional();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1754
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  1755
  // 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
  1756
  // 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
  1757
  // 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
  1758
  abandon_gc_alloc_regions();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  1759
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1760
  // Instead of tearing down / rebuilding the free lists here, we
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1761
  // 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
  1762
  // remove only the ones that we need to remove.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1763
  tear_down_region_lists();  // We will rebuild them in a moment.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1764
  shrink_helper(shrink_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1765
  rebuild_region_lists();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1766
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1767
  _hrs.verify_optional();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1768
  verify_region_sets_optional();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1769
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1770
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1771
// Public methods.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1772
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1773
#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
  1774
#pragma warning( disable:4355 ) // 'this' : used in base member initializer list
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1775
#endif // _MSC_VER
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1776
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1777
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1778
G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1779
  SharedHeap(policy_),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1780
  _g1_policy(policy_),
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  1781
  _dirty_card_queue_set(false),
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  1782
  _into_cset_dirty_card_queue_set(false),
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1783
  _is_alive_closure_cm(this),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1784
  _is_alive_closure_stw(this),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1785
  _ref_processor_cm(NULL),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1786
  _ref_processor_stw(NULL),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1787
  _process_strong_tasks(new SubTasksDone(G1H_PS_NumElements)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1788
  _bot_shared(NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1789
  _objs_with_preserved_marks(NULL), _preserved_marks_of_objs(NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1790
  _evac_failure_scan_stack(NULL) ,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1791
  _mark_in_progress(false),
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1792
  _cg1r(NULL), _summary_bytes_used(0),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1793
  _refine_cte_cl(NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1794
  _full_collection(false),
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1795
  _free_list("Master Free List"),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1796
  _secondary_free_list("Secondary Free List"),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1797
  _humongous_set("Master Humongous Set"),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1798
  _free_regions_coming(false),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1799
  _young_list(new YoungList(this)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1800
  _gc_time_stamp(0),
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  1801
  _retained_old_gc_alloc_region(NULL),
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  1802
  _surviving_young_words(NULL),
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1803
  _full_collections_completed(0),
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  1804
  _in_cset_fast_test(NULL),
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  1805
  _in_cset_fast_test_base(NULL),
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  1806
  _dirty_cards_region_list(NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1807
  _g1h = this; // To catch bugs.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1808
  if (_process_strong_tasks == NULL || !_process_strong_tasks->valid()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1809
    vm_exit_during_initialization("Failed necessary allocation.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1810
  }
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  1811
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  1812
  _humongous_object_threshold_in_words = HeapRegion::GrainWords / 2;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  1813
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1814
  int n_queues = MAX2((int)ParallelGCThreads, 1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1815
  _task_queues = new RefToScanQueueSet(n_queues);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1816
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1817
  int n_rem_sets = HeapRegionRemSet::num_par_rem_sets();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1818
  assert(n_rem_sets > 0, "Invariant.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1819
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1820
  HeapRegionRemSetIterator** iter_arr =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1821
    NEW_C_HEAP_ARRAY(HeapRegionRemSetIterator*, n_queues);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1822
  for (int i = 0; i < n_queues; i++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1823
    iter_arr[i] = new HeapRegionRemSetIterator();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1824
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1825
  _rem_set_iterator = iter_arr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1826
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1827
  for (int i = 0; i < n_queues; i++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1828
    RefToScanQueue* q = new RefToScanQueue();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1829
    q->initialize();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1830
    _task_queues->register_queue(i, q);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1831
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1832
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1833
  guarantee(_task_queues != NULL, "task_queues allocation failure.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1834
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1835
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1836
jint G1CollectedHeap::initialize() {
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4481
diff changeset
  1837
  CollectedHeap::pre_initialize();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1838
  os::enable_vtime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1839
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1840
  // Necessary to satisfy locking discipline assertions.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1841
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1842
  MutexLocker x(Heap_lock);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1843
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1844
  // 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
  1845
  // it will be used then.
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1846
  _hr_printer.set_active(G1PrintHeapRegions);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1847
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1848
  // While there are no constraints in the GC code that HeapWordSize
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1849
  // be any particular value, there are multiple other areas in the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1850
  // 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
  1851
  // cases incorrectly returns the size in wordSize units rather than
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1852
  // HeapWordSize).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1853
  guarantee(HeapWordSize == wordSize, "HeapWordSize must equal wordSize");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1854
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1855
  size_t init_byte_size = collector_policy()->initial_heap_byte_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1856
  size_t max_byte_size = collector_policy()->max_heap_byte_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1857
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1858
  // Ensure that the sizes are properly aligned.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1859
  Universe::check_alignment(init_byte_size, HeapRegion::GrainBytes, "g1 heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1860
  Universe::check_alignment(max_byte_size, HeapRegion::GrainBytes, "g1 heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1861
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1862
  _cg1r = new ConcurrentG1Refine();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1863
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1864
  // Reserve the maximum.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1865
  PermanentGenerationSpec* pgs = collector_policy()->permanent_generation();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1866
  // Includes the perm-gen.
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1867
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1868
  // When compressed oops are enabled, the preferred heap base
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1869
  // is calculated by subtracting the requested size from the
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1870
  // 32Gb boundary and using the result as the base address for
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1871
  // heap reservation. If the requested size is not aligned to
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1872
  // HeapRegion::GrainBytes (i.e. the alignment that is passed
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1873
  // into the ReservedHeapSpace constructor) then the actual
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1874
  // base of the reserved heap may end up differing from the
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1875
  // address that was requested (i.e. the preferred heap base).
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1876
  // 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
  1877
  // compressed oops mode.
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1878
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1879
  // Since max_byte_size is aligned to the size of a heap region (checked
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1880
  // above), we also need to align the perm gen size as it might not be.
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1881
  const size_t total_reserved = max_byte_size +
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1882
                                align_size_up(pgs->max_size(), HeapRegion::GrainBytes);
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1883
  Universe::check_alignment(total_reserved, HeapRegion::GrainBytes, "g1 heap and perm");
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1884
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1885
  char* addr = Universe::preferred_heap_base(total_reserved, Universe::UnscaledNarrowOop);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1886
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1887
  ReservedHeapSpace heap_rs(total_reserved, HeapRegion::GrainBytes,
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1888
                            UseLargePages, addr);
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1889
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1890
  if (UseCompressedOops) {
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1891
    if (addr != NULL && !heap_rs.is_reserved()) {
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1892
      // Failed to reserve at specified address - the requested memory
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1893
      // region is taken already, for example, by 'java' launcher.
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1894
      // Try again to reserver heap higher.
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1895
      addr = Universe::preferred_heap_base(total_reserved, Universe::ZeroBasedNarrowOop);
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1896
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1897
      ReservedHeapSpace heap_rs0(total_reserved, HeapRegion::GrainBytes,
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1898
                                 UseLargePages, addr);
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1899
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1900
      if (addr != NULL && !heap_rs0.is_reserved()) {
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1901
        // Failed to reserve at specified address again - give up.
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1902
        addr = Universe::preferred_heap_base(total_reserved, Universe::HeapBasedNarrowOop);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1903
        assert(addr == NULL, "");
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1904
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1905
        ReservedHeapSpace heap_rs1(total_reserved, HeapRegion::GrainBytes,
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  1906
                                   UseLargePages, addr);
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1907
        heap_rs = heap_rs1;
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1908
      } else {
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1909
        heap_rs = heap_rs0;
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1910
      }
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1911
    }
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1912
  }
1374
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
  if (!heap_rs.is_reserved()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1915
    vm_exit_during_initialization("Could not reserve enough space for object heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1916
    return JNI_ENOMEM;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1917
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1918
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1919
  // It is important to do this in a way such that concurrent readers can't
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1920
  // temporarily think somethings in the heap.  (I've actually seen this
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1921
  // happen in asserts: DLD.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1922
  _reserved.set_word_size(0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1923
  _reserved.set_start((HeapWord*)heap_rs.base());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1924
  _reserved.set_end((HeapWord*)(heap_rs.base() + heap_rs.size()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1925
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1926
  _expansion_regions = max_byte_size/HeapRegion::GrainBytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1927
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1928
  // 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
  1929
  _rem_set = collector_policy()->create_rem_set(_reserved, 2);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1930
  set_barrier_set(rem_set()->bs());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1931
  if (barrier_set()->is_a(BarrierSet::ModRef)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1932
    _mr_bs = (ModRefBarrierSet*)_barrier_set;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1933
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1934
    vm_exit_during_initialization("G1 requires a mod ref bs.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1935
    return JNI_ENOMEM;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1936
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1937
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1938
  // Also create a G1 rem set.
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  1939
  if (mr_bs()->is_a(BarrierSet::CardTableModRef)) {
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  1940
    _g1_rem_set = new G1RemSet(this, (CardTableModRefBS*)mr_bs());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1941
  } else {
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  1942
    vm_exit_during_initialization("G1 requires a cardtable mod ref bs.");
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  1943
    return JNI_ENOMEM;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1944
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1945
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1946
  // Carve out the G1 part of the heap.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1947
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1948
  ReservedSpace g1_rs   = heap_rs.first_part(max_byte_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1949
  _g1_reserved = MemRegion((HeapWord*)g1_rs.base(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1950
                           g1_rs.size()/HeapWordSize);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1951
  ReservedSpace perm_gen_rs = heap_rs.last_part(max_byte_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1952
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1953
  _perm_gen = pgs->init(perm_gen_rs, pgs->init_size(), rem_set());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1954
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1955
  _g1_storage.initialize(g1_rs, 0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1956
  _g1_committed = MemRegion((HeapWord*)_g1_storage.low(), (size_t) 0);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1957
  _hrs.initialize((HeapWord*) _g1_reserved.start(),
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1958
                  (HeapWord*) _g1_reserved.end(),
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1959
                  _expansion_regions);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1960
2996
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  1961
  // 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
  1962
  // in the remembered set structures.
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  1963
  const size_t max_region_idx = ((size_t)1 << (sizeof(RegionIdx_t)*BitsPerByte-1)) - 1;
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  1964
  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
  1965
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  1966
  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
  1967
  guarantee(HeapRegion::CardsPerRegion > 0, "make sure it's initialized");
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  1968
  guarantee((size_t) HeapRegion::CardsPerRegion < max_cards_per_region,
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  1969
            "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
  1970
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1971
  HeapRegionSet::set_unrealistically_long_length(max_regions() + 1);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1972
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1973
  _bot_shared = new G1BlockOffsetSharedArray(_reserved,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1974
                                             heap_word_size(init_byte_size));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1975
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1976
  _g1h = this;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1977
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1978
   _in_cset_fast_test_length = max_regions();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1979
   _in_cset_fast_test_base = NEW_C_HEAP_ARRAY(bool, _in_cset_fast_test_length);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1980
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1981
   // We're biasing _in_cset_fast_test to avoid subtracting the
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1982
   // beginning of the heap every time we want to index; basically
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1983
   // it's the same with what we do with the card table.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1984
   _in_cset_fast_test = _in_cset_fast_test_base -
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1985
                ((size_t) _g1_reserved.start() >> HeapRegion::LogOfHRGrainBytes);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1986
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1987
   // Clear the _cset_fast_test bitmap in anticipation of adding
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1988
   // regions to the incremental collection set for the first
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1989
   // evacuation pause.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1990
   clear_cset_fast_test();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1991
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1992
  // Create the ConcurrentMark data structure and thread.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1993
  // (Must do this late, so that "max_regions" is defined.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1994
  _cm       = new ConcurrentMark(heap_rs, (int) max_regions());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1995
  _cmThread = _cm->cmThread();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1996
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1997
  // Initialize the from_card cache structure of HeapRegionRemSet.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1998
  HeapRegionRemSet::init_heap(max_regions());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1999
2344
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2259
diff changeset
  2000
  // Now expand into the initial heap size.
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  2001
  if (!expand(init_byte_size)) {
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  2002
    vm_exit_during_initialization("Failed to allocate initial heap.");
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  2003
    return JNI_ENOMEM;
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  2004
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2005
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2006
  // Perform any initialization actions delegated to the policy.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2007
  g1_policy()->init();
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
  g1_policy()->note_start_of_mark_thread();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2010
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2011
  _refine_cte_cl =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2012
    new RefineCardTableEntryClosure(ConcurrentG1RefineThread::sts(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2013
                                    g1_rem_set(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2014
                                    concurrent_g1_refine());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2015
  JavaThread::dirty_card_queue_set().set_closure(_refine_cte_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2016
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2017
  JavaThread::satb_mark_queue_set().initialize(SATB_Q_CBL_mon,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2018
                                               SATB_Q_FL_lock,
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2019
                                               G1SATBProcessCompletedThreshold,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2020
                                               Shared_SATB_Q_lock);
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2021
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2022
  JavaThread::dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2023
                                                DirtyCardQ_FL_lock,
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2024
                                                concurrent_g1_refine()->yellow_zone(),
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2025
                                                concurrent_g1_refine()->red_zone(),
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2026
                                                Shared_DirtyCardQ_lock);
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2027
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2028
  if (G1DeferredRSUpdate) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2029
    dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2030
                                      DirtyCardQ_FL_lock,
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2031
                                      -1, // never trigger processing
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2032
                                      -1, // no limit on length
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2033
                                      Shared_DirtyCardQ_lock,
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2034
                                      &JavaThread::dirty_card_queue_set());
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2035
  }
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2036
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2037
  // Initialize the card queue set used to hold cards containing
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2038
  // references into the collection set.
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2039
  _into_cset_dirty_card_queue_set.initialize(DirtyCardQ_CBL_mon,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2040
                                             DirtyCardQ_FL_lock,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2041
                                             -1, // never trigger processing
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2042
                                             -1, // no limit on length
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2043
                                             Shared_DirtyCardQ_lock,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2044
                                             &JavaThread::dirty_card_queue_set());
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2045
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2046
  // In case we're keeping closure specialization stats, initialize those
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2047
  // counts and that mechanism.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2048
  SpecializationStats::clear();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2049
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2050
  // Do later initialization work for concurrent refinement.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2051
  _cg1r->init();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2052
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2053
  // 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
  2054
  // 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
  2055
  // space here, lots of asserts fire.
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2056
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2057
  HeapRegion* dummy_region = new_heap_region(0 /* index of bottom region */,
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2058
                                             _g1_reserved.start());
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2059
  // 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
  2060
  // 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
  2061
  // 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
  2062
  // 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
  2063
  dummy_region->set_young();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2064
  // Make sure it's full.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2065
  dummy_region->set_top(dummy_region->end());
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2066
  G1AllocRegion::setup(this, dummy_region);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2067
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2068
  init_mutator_alloc_region();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2069
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  2070
  // 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
  2071
  // values in the heap have been properly initialized.
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  2072
  _g1mm = new G1MonitoringSupport(this, &_g1_storage);
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  2073
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2074
  return JNI_OK;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2075
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2076
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2077
void G1CollectedHeap::ref_processing_init() {
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2078
  // Reference processing in G1 currently works as follows:
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2079
  //
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2080
  // * There are two reference processor instances. One is
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2081
  //   used to record and process discovered references
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2082
  //   during concurrent marking; the other is used to
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2083
  //   record and process references during STW pauses
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2084
  //   (both full and incremental).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2085
  // * Both ref processors need to 'span' the entire heap as
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2086
  //   the regions in the collection set may be dotted around.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2087
  //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2088
  // * For the concurrent marking ref processor:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2089
  //   * Reference discovery is enabled at initial marking.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2090
  //   * Reference discovery is disabled and the discovered
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2091
  //     references processed etc during remarking.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2092
  //   * Reference discovery is MT (see below).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2093
  //   * Reference discovery requires a barrier (see below).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2094
  //   * Reference processing may or may not be MT
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2095
  //     (depending on the value of ParallelRefProcEnabled
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2096
  //     and ParallelGCThreads).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2097
  //   * A full GC disables reference discovery by the CM
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2098
  //     ref processor and abandons any entries on it's
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2099
  //     discovered lists.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2100
  //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2101
  // * For the STW processor:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2102
  //   * 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
  2103
  //   * Processing and enqueueing during a full GC is non-MT.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2104
  //   * During a full GC, references are processed after marking.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2105
  //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2106
  //   * 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
  2107
  //     of an incremental evacuation pause.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2108
  //   * References are processed near the end of a STW evacuation pause.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2109
  //   * For both types of GC:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2110
  //     * Discovery is atomic - i.e. not concurrent.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2111
  //     * Reference discovery will not need a barrier.
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2112
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2113
  SharedHeap::ref_processing_init();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2114
  MemRegion mr = reserved_region();
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2115
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2116
  // Concurrent Mark ref processor
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2117
  _ref_processor_cm =
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8680
diff changeset
  2118
    new ReferenceProcessor(mr,    // span
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2119
                           ParallelRefProcEnabled && (ParallelGCThreads > 1),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2120
                                // mt processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2121
                           (int) ParallelGCThreads,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2122
                                // degree of mt processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2123
                           (ParallelGCThreads > 1) || (ConcGCThreads > 1),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2124
                                // mt discovery
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2125
                           (int) MAX2(ParallelGCThreads, ConcGCThreads),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2126
                                // degree of mt discovery
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2127
                           false,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2128
                                // Reference discovery is not atomic
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2129
                           &_is_alive_closure_cm,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2130
                                // is alive closure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2131
                                // (for efficiency/performance)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2132
                           true);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2133
                                // Setting next fields of discovered
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2134
                                // lists requires a barrier.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2135
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2136
  // STW ref processor
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2137
  _ref_processor_stw =
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2138
    new ReferenceProcessor(mr,    // span
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2139
                           ParallelRefProcEnabled && (ParallelGCThreads > 1),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2140
                                // mt processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2141
                           MAX2((int)ParallelGCThreads, 1),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2142
                                // degree of mt processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2143
                           (ParallelGCThreads > 1),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2144
                                // mt discovery
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2145
                           MAX2((int)ParallelGCThreads, 1),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2146
                                // degree of mt discovery
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2147
                           true,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2148
                                // Reference discovery is atomic
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2149
                           &_is_alive_closure_stw,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2150
                                // is alive closure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2151
                                // (for efficiency/performance)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2152
                           false);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2153
                                // Setting next fields of discovered
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2154
                                // lists requires a barrier.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2155
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2156
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2157
size_t G1CollectedHeap::capacity() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2158
  return _g1_committed.byte_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2159
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2160
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2161
void G1CollectedHeap::iterate_dirty_card_closure(CardTableEntryClosure* cl,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2162
                                                 DirtyCardQueue* into_cset_dcq,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2163
                                                 bool concurrent,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2164
                                                 int worker_i) {
3589
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  2165
  // Clean cards in the hot card cache
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2166
  concurrent_g1_refine()->clean_up_cache(worker_i, g1_rem_set(), into_cset_dcq);
3589
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  2167
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2168
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2169
  int n_completed_buffers = 0;
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2170
  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
  2171
    n_completed_buffers++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2172
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2173
  g1_policy()->record_update_rs_processed_buffers(worker_i,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2174
                                                  (double) n_completed_buffers);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2175
  dcqs.clear_n_completed_buffers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2176
  assert(!dcqs.completed_buffers_exist_dirty(), "Completed buffers exist!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2177
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2178
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2179
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2180
// Computes the sum of the storage used by the various regions.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2181
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2182
size_t G1CollectedHeap::used() const {
3279
1af8fdb08664 6863216: Clean up debugging debris inadvertently pushed with 6700789
ysr
parents: 3278
diff changeset
  2183
  assert(Heap_lock->owner() != NULL,
1af8fdb08664 6863216: Clean up debugging debris inadvertently pushed with 6700789
ysr
parents: 3278
diff changeset
  2184
         "Should be owned on this thread's behalf.");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2185
  size_t result = _summary_bytes_used;
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2186
  // 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
  2187
  HeapRegion* hr = _mutator_alloc_region.get();
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2188
  if (hr != NULL)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2189
    result += hr->used();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2190
  return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2191
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2192
3263
23d2d46c6d08 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 3262
diff changeset
  2193
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
  2194
  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
  2195
  return result;
23d2d46c6d08 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 3262
diff changeset
  2196
}
23d2d46c6d08 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 3262
diff changeset
  2197
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2198
class SumUsedClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2199
  size_t _used;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2200
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2201
  SumUsedClosure() : _used(0) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2202
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2203
    if (!r->continuesHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2204
      _used += r->used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2205
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2206
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2207
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2208
  size_t result() { return _used; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2209
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2210
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2211
size_t G1CollectedHeap::recalculate_used() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2212
  SumUsedClosure blk;
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2213
  heap_region_iterate(&blk);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2214
  return blk.result();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2215
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2216
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2217
size_t G1CollectedHeap::unsafe_max_alloc() {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2218
  if (free_regions() > 0) return HeapRegion::GrainBytes;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2219
  // otherwise, is there space in the current allocation region?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2220
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2221
  // 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
  2222
  // 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
  2223
  // there may be other threads which overwrite the current allocation
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2224
  // region field. attempt_allocation(), for example, sets it to NULL
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2225
  // 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
  2226
  // 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
  2227
  // 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
  2228
  // current allocation region field are optimized away.
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2229
  HeapRegion* hr = _mutator_alloc_region.get();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2230
  if (hr == NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2231
    return 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2232
  }
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2233
  return hr->free();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2234
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2235
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2236
bool G1CollectedHeap::should_do_concurrent_full_gc(GCCause::Cause cause) {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2237
  return
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2238
    ((cause == GCCause::_gc_locker           && GCLockerInvokesConcurrent) ||
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2239
     (cause == GCCause::_java_lang_system_gc && ExplicitGCInvokesConcurrent));
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2240
}
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2241
9334
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2242
#ifndef PRODUCT
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2243
void G1CollectedHeap::allocate_dummy_regions() {
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2244
  // Let's fill up most of the region
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2245
  size_t word_size = HeapRegion::GrainWords - 1024;
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2246
  // 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
  2247
  guarantee(isHumongous(word_size), "sanity");
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2248
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2249
  for (uintx i = 0; i < G1DummyRegionsPerGC; ++i) {
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2250
    // 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
  2251
    HeapWord* dummy_obj = humongous_obj_allocate(word_size);
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2252
    if (dummy_obj != NULL) {
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2253
      MemRegion mr(dummy_obj, word_size);
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2254
      CollectedHeap::fill_with_object(mr);
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2255
    } else {
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2256
      // 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
  2257
      // again. Let's get out of the loop.
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2258
      break;
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2259
    }
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2260
  }
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2261
}
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2262
#endif // !PRODUCT
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2263
7455
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2264
void G1CollectedHeap::increment_full_collections_completed(bool concurrent) {
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2265
  MonitorLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2266
7455
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2267
  // 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
  2268
  // 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
  2269
  // 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
  2270
  // assert here.
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2271
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2272
  // We have already incremented _total_full_collections at the start
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2273
  // of the GC, so total_full_collections() represents how many full
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2274
  // collections have been started.
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2275
  unsigned int full_collections_started = total_full_collections();
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2276
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2277
  // 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
  2278
  // 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
  2279
  // interrupt a concurrent cycle), the number of full collections
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2280
  // 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
  2281
  // 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
  2282
  // behind the number of full collections started.
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2283
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2284
  // 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
  2285
  assert(concurrent ||
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2286
         (full_collections_started == _full_collections_completed + 1) ||
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2287
         (full_collections_started == _full_collections_completed + 2),
7455
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2288
         err_msg("for inner caller (Full GC): full_collections_started = %u "
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2289
                 "is inconsistent with _full_collections_completed = %u",
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2290
                 full_collections_started, _full_collections_completed));
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2291
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2292
  // 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
  2293
  assert(!concurrent ||
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2294
         (full_collections_started == _full_collections_completed + 1),
7455
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2295
         err_msg("for outer caller (concurrent cycle): "
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2296
                 "full_collections_started = %u "
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2297
                 "is inconsistent with _full_collections_completed = %u",
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2298
                 full_collections_started, _full_collections_completed));
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2299
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2300
  _full_collections_completed += 1;
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2301
6766
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2302
  // 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
  2303
  // we wake up any waiters (especially when ExplicitInvokesConcurrent
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2304
  // is set) so that if a waiter requests another System.gc() it doesn't
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2305
  // incorrectly see that a marking cyle is still in progress.
7455
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2306
  if (concurrent) {
6766
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2307
    _cmThread->clear_in_progress();
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2308
  }
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2309
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2310
  // 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
  2311
  // System.gc() with (with ExplicitGCInvokesConcurrent set or not)
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2312
  // 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
  2313
  // waiting in VM_G1IncCollectionPause::doit_epilogue().
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2314
  FullGCCount_lock->notify_all();
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2315
}
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2316
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2317
void G1CollectedHeap::collect_as_vm_thread(GCCause::Cause cause) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2318
  assert_at_safepoint(true /* should_be_vm_thread */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2319
  GCCauseSetter gcs(this, cause);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2320
  switch (cause) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2321
    case GCCause::_heap_inspection:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2322
    case GCCause::_heap_dump: {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2323
      HandleMark hm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2324
      do_full_collection(false);         // don't clear all soft refs
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2325
      break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2326
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2327
    default: // XXX FIX ME
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2328
      ShouldNotReachHere(); // Unexpected use of this function
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2329
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2330
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2331
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2332
void G1CollectedHeap::collect(GCCause::Cause cause) {
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2333
  // The caller doesn't have the Heap_lock
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2334
  assert(!Heap_lock->owned_by_self(), "this thread should not own the Heap_lock");
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2335
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2336
  unsigned int gc_count_before;
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2337
  unsigned int full_gc_count_before;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2338
  {
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2339
    MutexLocker ml(Heap_lock);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2340
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2341
    // Read the GC count while holding the Heap_lock
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2342
    gc_count_before = SharedHeap::heap()->total_collections();
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2343
    full_gc_count_before = SharedHeap::heap()->total_full_collections();
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2344
  }
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2345
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2346
  if (should_do_concurrent_full_gc(cause)) {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2347
    // Schedule an initial-mark evacuation pause that will start a
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2348
    // concurrent cycle. We're setting word_size to 0 which means that
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2349
    // we are not requesting a post-GC allocation.
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2350
    VM_G1IncCollectionPause op(gc_count_before,
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2351
                               0,     /* word_size */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2352
                               true,  /* should_initiate_conc_mark */
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2353
                               g1_policy()->max_pause_time_ms(),
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2354
                               cause);
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2355
    VMThread::execute(&op);
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2356
  } else {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2357
    if (cause == GCCause::_gc_locker
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2358
        DEBUG_ONLY(|| cause == GCCause::_scavenge_alot)) {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2359
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2360
      // Schedule a standard evacuation pause. We're setting word_size
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2361
      // to 0 which means that we are not requesting a post-GC allocation.
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2362
      VM_G1IncCollectionPause op(gc_count_before,
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2363
                                 0,     /* word_size */
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2364
                                 false, /* should_initiate_conc_mark */
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2365
                                 g1_policy()->max_pause_time_ms(),
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2366
                                 cause);
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2367
      VMThread::execute(&op);
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2368
    } else {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2369
      // Schedule a Full GC.
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2370
      VM_G1CollectFull op(gc_count_before, full_gc_count_before, cause);
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2371
      VMThread::execute(&op);
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2372
    }
1374
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
}
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
bool G1CollectedHeap::is_in(const void* p) const {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2377
  HeapRegion* hr = _hrs.addr_to_region((HeapWord*) p);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2378
  if (hr != NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2379
    return hr->is_in(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2380
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2381
    return _perm_gen->as_gen()->is_in(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2382
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2383
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2384
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2385
// Iteration functions.
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
// Iterates an OopClosure over all ref-containing fields of objects
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2388
// within a HeapRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2389
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2390
class IterateOopClosureRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2391
  MemRegion _mr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2392
  OopClosure* _cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2393
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2394
  IterateOopClosureRegionClosure(MemRegion mr, OopClosure* cl)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2395
    : _mr(mr), _cl(cl) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2396
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2397
    if (! r->continuesHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2398
      r->oop_iterate(_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2399
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2400
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2401
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2402
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2403
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2404
void G1CollectedHeap::oop_iterate(OopClosure* cl, bool do_perm) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2405
  IterateOopClosureRegionClosure blk(_g1_committed, cl);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2406
  heap_region_iterate(&blk);
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2407
  if (do_perm) {
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2408
    perm_gen()->oop_iterate(cl);
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2409
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2410
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2411
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2412
void G1CollectedHeap::oop_iterate(MemRegion mr, OopClosure* cl, bool do_perm) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2413
  IterateOopClosureRegionClosure blk(mr, cl);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2414
  heap_region_iterate(&blk);
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2415
  if (do_perm) {
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2416
    perm_gen()->oop_iterate(cl);
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2417
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2418
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2419
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2420
// Iterates an ObjectClosure over all objects within a HeapRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2421
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2422
class IterateObjectClosureRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2423
  ObjectClosure* _cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2424
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2425
  IterateObjectClosureRegionClosure(ObjectClosure* cl) : _cl(cl) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2426
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2427
    if (! r->continuesHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2428
      r->object_iterate(_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2429
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2430
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2431
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2432
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2433
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2434
void G1CollectedHeap::object_iterate(ObjectClosure* cl, bool do_perm) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2435
  IterateObjectClosureRegionClosure blk(cl);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2436
  heap_region_iterate(&blk);
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2437
  if (do_perm) {
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2438
    perm_gen()->object_iterate(cl);
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2439
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2440
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2441
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2442
void G1CollectedHeap::object_iterate_since_last_GC(ObjectClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2443
  // FIXME: is this right?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2444
  guarantee(false, "object_iterate_since_last_GC not supported by G1 heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2445
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2446
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2447
// Calls a SpaceClosure on a HeapRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2448
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2449
class SpaceClosureRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2450
  SpaceClosure* _cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2451
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2452
  SpaceClosureRegionClosure(SpaceClosure* cl) : _cl(cl) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2453
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2454
    _cl->do_space(r);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2455
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2456
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2457
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2458
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2459
void G1CollectedHeap::space_iterate(SpaceClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2460
  SpaceClosureRegionClosure blk(cl);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2461
  heap_region_iterate(&blk);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2462
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2463
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2464
void G1CollectedHeap::heap_region_iterate(HeapRegionClosure* cl) const {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2465
  _hrs.iterate(cl);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2466
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2467
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2468
void G1CollectedHeap::heap_region_iterate_from(HeapRegion* r,
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2469
                                               HeapRegionClosure* cl) const {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2470
  _hrs.iterate_from(r, cl);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2471
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2472
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2473
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2474
G1CollectedHeap::heap_region_par_iterate_chunked(HeapRegionClosure* cl,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2475
                                                 int worker,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2476
                                                 jint claim_value) {
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2477
  const size_t regions = n_regions();
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  2478
  const size_t worker_num = (G1CollectedHeap::use_parallel_gc_threads() ? ParallelGCThreads : 1);
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2479
  // try to spread out the starting points of the workers
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2480
  const size_t start_index = regions / worker_num * (size_t) worker;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2481
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2482
  // each worker will actually look at all regions
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2483
  for (size_t count = 0; count < regions; ++count) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2484
    const size_t index = (start_index + count) % regions;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2485
    assert(0 <= index && index < regions, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2486
    HeapRegion* r = region_at(index);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2487
    // 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
  2488
    // when we come across their corresponding "start humongous"
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2489
    // region) and regions already claimed
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2490
    if (r->claim_value() == claim_value || r->continuesHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2491
      continue;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2492
    }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2493
    // OK, try to claim it
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2494
    if (r->claimHeapRegion(claim_value)) {
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2495
      // success!
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2496
      assert(!r->continuesHumongous(), "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2497
      if (r->startsHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2498
        // 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
  2499
        // "continues humongous" first; in fact we'll do them
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2500
        // 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
  2501
        // closure on the "starts humongous" region might de-allocate
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2502
        // 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
  2503
        // 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
  2504
        // 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
  2505
        // then we'll do the "starts humongous" region.
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2506
        for (size_t ch_index = index + 1; ch_index < regions; ++ch_index) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2507
          HeapRegion* chr = region_at(ch_index);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2508
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2509
          // 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
  2510
          // "continues humongous" we're done
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2511
          if (chr->claim_value() == claim_value ||
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2512
              !chr->continuesHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2513
            break;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2514
          }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2515
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2516
          // Noone should have claimed it directly. We can given
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2517
          // that we claimed its "starts humongous" region.
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2518
          assert(chr->claim_value() != claim_value, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2519
          assert(chr->humongous_start_region() == r, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2520
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2521
          if (chr->claimHeapRegion(claim_value)) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2522
            // we should always be able to claim it; noone else should
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2523
            // be trying to claim this region
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2524
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2525
            bool res2 = cl->doHeapRegion(chr);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2526
            assert(!res2, "Should not abort");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2527
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2528
            // 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
  2529
            // does something with "continues humongous" regions
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2530
            // 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
  2531
            // 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
  2532
            assert(chr->continuesHumongous(), "should still be the case");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2533
            assert(chr->humongous_start_region() == r, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2534
          } else {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2535
            guarantee(false, "we should not reach here");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2536
          }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2537
        }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2538
      }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2539
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2540
      assert(!r->continuesHumongous(), "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2541
      bool res = cl->doHeapRegion(r);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2542
      assert(!res, "Should not abort");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2543
    }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2544
  }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2545
}
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2546
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2547
class ResetClaimValuesClosure: public HeapRegionClosure {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2548
public:
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2549
  bool doHeapRegion(HeapRegion* r) {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2550
    r->set_claim_value(HeapRegion::InitialClaimValue);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2551
    return false;
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2552
  }
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2553
};
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2554
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2555
void
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2556
G1CollectedHeap::reset_heap_region_claim_values() {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2557
  ResetClaimValuesClosure blk;
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2558
  heap_region_iterate(&blk);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2559
}
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2560
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2561
#ifdef ASSERT
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2562
// 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
  2563
// 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
  2564
// humongous_start_region() information on "continues humongous"
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2565
// regions is correct.
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2566
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2567
class CheckClaimValuesClosure : public HeapRegionClosure {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2568
private:
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2569
  jint _claim_value;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2570
  size_t _failures;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2571
  HeapRegion* _sh_region;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2572
public:
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2573
  CheckClaimValuesClosure(jint claim_value) :
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2574
    _claim_value(claim_value), _failures(0), _sh_region(NULL) { }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2575
  bool doHeapRegion(HeapRegion* r) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2576
    if (r->claim_value() != _claim_value) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2577
      gclog_or_tty->print_cr("Region ["PTR_FORMAT","PTR_FORMAT"), "
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2578
                             "claim value = %d, should be %d",
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2579
                             r->bottom(), r->end(), r->claim_value(),
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2580
                             _claim_value);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2581
      ++_failures;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2582
    }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2583
    if (!r->isHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2584
      _sh_region = NULL;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2585
    } else if (r->startsHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2586
      _sh_region = r;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2587
    } else if (r->continuesHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2588
      if (r->humongous_start_region() != _sh_region) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2589
        gclog_or_tty->print_cr("Region ["PTR_FORMAT","PTR_FORMAT"), "
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2590
                               "HS = "PTR_FORMAT", should be "PTR_FORMAT,
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2591
                               r->bottom(), r->end(),
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2592
                               r->humongous_start_region(),
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2593
                               _sh_region);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2594
        ++_failures;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2595
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2596
    }
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2597
    return false;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2598
  }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2599
  size_t failures() {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2600
    return _failures;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2601
  }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2602
};
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2603
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2604
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
  2605
  CheckClaimValuesClosure cl(claim_value);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2606
  heap_region_iterate(&cl);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2607
  return cl.failures() == 0;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2608
}
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2609
#endif // ASSERT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2610
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2611
void G1CollectedHeap::collection_set_iterate(HeapRegionClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2612
  HeapRegion* r = g1_policy()->collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2613
  while (r != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2614
    HeapRegion* next = r->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2615
    if (cl->doHeapRegion(r)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2616
      cl->incomplete();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2617
      return;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2618
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2619
    r = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2620
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2621
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2622
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2623
void G1CollectedHeap::collection_set_iterate_from(HeapRegion* r,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2624
                                                  HeapRegionClosure *cl) {
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2625
  if (r == NULL) {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2626
    // 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
  2627
    return;
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2628
  }
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2629
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2630
  assert(r->in_collection_set(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2631
         "Start region must be a member of the collection set.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2632
  HeapRegion* cur = r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2633
  while (cur != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2634
    HeapRegion* next = cur->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2635
    if (cl->doHeapRegion(cur) && false) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2636
      cl->incomplete();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2637
      return;
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
    cur = next;
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
  cur = g1_policy()->collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2642
  while (cur != r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2643
    HeapRegion* next = cur->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2644
    if (cl->doHeapRegion(cur) && false) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2645
      cl->incomplete();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2646
      return;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2647
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2648
    cur = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2649
  }
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
CompactibleSpace* G1CollectedHeap::first_compactible_space() {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2653
  return n_regions() > 0 ? region_at(0) : NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2654
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2655
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
Space* G1CollectedHeap::space_containing(const void* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2658
  Space* res = heap_region_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2659
  if (res == NULL)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2660
    res = perm_gen()->space_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2661
  return res;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2662
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2663
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2664
HeapWord* G1CollectedHeap::block_start(const void* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2665
  Space* sp = space_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2666
  if (sp != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2667
    return sp->block_start(addr);
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
  return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2670
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2671
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2672
size_t G1CollectedHeap::block_size(const HeapWord* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2673
  Space* sp = space_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2674
  assert(sp != NULL, "block_size of address outside of heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2675
  return sp->block_size(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2676
}
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
bool G1CollectedHeap::block_is_obj(const HeapWord* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2679
  Space* sp = space_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2680
  return sp->block_is_obj(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2681
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2682
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2683
bool G1CollectedHeap::supports_tlab_allocation() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2684
  return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2685
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2686
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2687
size_t G1CollectedHeap::tlab_capacity(Thread* ignored) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2688
  return HeapRegion::GrainBytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2689
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2690
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2691
size_t G1CollectedHeap::unsafe_max_tlab_alloc(Thread* ignored) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2692
  // 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
  2693
  // the min TLAB size.
5078
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2694
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2695
  // Also, this value can be at most the humongous object threshold,
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2696
  // since we can't allow tlabs to grow big enough to accomodate
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2697
  // humongous objects.
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2698
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2699
  HeapRegion* hr = _mutator_alloc_region.get();
5078
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2700
  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
  2701
  if (hr == NULL) {
5078
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2702
    return max_tlab_size;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2703
  } else {
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2704
    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
  2705
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2706
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2707
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2708
size_t G1CollectedHeap::max_capacity() const {
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  2709
  return _g1_reserved.byte_size();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2710
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2711
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2712
jlong G1CollectedHeap::millis_since_last_gc() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2713
  // assert(false, "NYI");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2714
  return 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2715
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2716
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2717
void G1CollectedHeap::prepare_for_verify() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2718
  if (SafepointSynchronize::is_at_safepoint() || ! UseTLAB) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2719
    ensure_parsability(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2720
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2721
  g1_rem_set()->prepare_for_verify();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2722
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2723
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2724
class VerifyLivenessOopClosure: public OopClosure {
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2725
  G1CollectedHeap* _g1h;
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2726
  VerifyOption _vo;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2727
public:
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2728
  VerifyLivenessOopClosure(G1CollectedHeap* g1h, VerifyOption vo):
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2729
    _g1h(g1h), _vo(vo)
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2730
  { }
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2731
  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
  2732
  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
  2733
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2734
  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
  2735
    oop obj = oopDesc::load_decode_heap_oop(p);
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2736
    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
  2737
              "Dead object referenced by a not dead object");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2738
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2739
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2740
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2741
class VerifyObjsInRegionClosure: public ObjectClosure {
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2742
private:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2743
  G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2744
  size_t _live_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2745
  HeapRegion *_hr;
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2746
  VerifyOption _vo;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2747
public:
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2748
  // _vo == UsePrevMarking -> use "prev" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2749
  // _vo == UseNextMarking -> use "next" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2750
  // _vo == UseMarkWord    -> use mark word from object header.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2751
  VerifyObjsInRegionClosure(HeapRegion *hr, VerifyOption vo)
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2752
    : _live_bytes(0), _hr(hr), _vo(vo) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2753
    _g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2754
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2755
  void do_object(oop o) {
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2756
    VerifyLivenessOopClosure isLive(_g1h, _vo);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2757
    assert(o != NULL, "Huh?");
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2758
    if (!_g1h->is_obj_dead_cond(o, _vo)) {
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2759
      // If the object is alive according to the mark word,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2760
      // then verify that the marking information agrees.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2761
      // Note we can't verify the contra-positive of the
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2762
      // above: if the object is dead (according to the mark
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2763
      // 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
  2764
      // but has since became dead, or may have been allocated
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2765
      // since the last marking.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2766
      if (_vo == VerifyOption_G1UseMarkWord) {
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2767
        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
  2768
      }
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2769
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2770
      o->oop_iterate(&isLive);
5345
d3bd6e8757d8 6943926: G1: Integer overflow during heap region verification
johnc
parents: 5344
diff changeset
  2771
      if (!_hr->obj_allocated_since_prev_marking(o)) {
d3bd6e8757d8 6943926: G1: Integer overflow during heap region verification
johnc
parents: 5344
diff changeset
  2772
        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
  2773
        _live_bytes += (obj_size * HeapWordSize);
d3bd6e8757d8 6943926: G1: Integer overflow during heap region verification
johnc
parents: 5344
diff changeset
  2774
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2775
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2776
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2777
  size_t live_bytes() { return _live_bytes; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2778
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2779
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2780
class PrintObjsInRegionClosure : public ObjectClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2781
  HeapRegion *_hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2782
  G1CollectedHeap *_g1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2783
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2784
  PrintObjsInRegionClosure(HeapRegion *hr) : _hr(hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2785
    _g1 = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2786
  };
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2787
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2788
  void do_object(oop o) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2789
    if (o != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2790
      HeapWord *start = (HeapWord *) o;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2791
      size_t word_sz = o->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2792
      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
  2793
                          " isMarkedPrev %d isMarkedNext %d isAllocSince %d\n",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2794
                          (void*) o, word_sz,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2795
                          _g1->isMarkedPrev(o),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2796
                          _g1->isMarkedNext(o),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2797
                          _hr->obj_allocated_since_prev_marking(o));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2798
      HeapWord *end = start + word_sz;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2799
      HeapWord *cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2800
      int *val;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2801
      for (cur = start; cur < end; cur++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2802
        val = (int *) cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2803
        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
  2804
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2805
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2806
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2807
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2808
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2809
class VerifyRegionClosure: public HeapRegionClosure {
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2810
private:
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2811
  bool         _allow_dirty;
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2812
  bool         _par;
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2813
  VerifyOption _vo;
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2814
  bool         _failures;
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2815
public:
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2816
  // _vo == UsePrevMarking -> use "prev" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2817
  // _vo == UseNextMarking -> use "next" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2818
  // _vo == UseMarkWord    -> use mark word from object header.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2819
  VerifyRegionClosure(bool allow_dirty, bool par, VerifyOption vo)
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2820
    : _allow_dirty(allow_dirty),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2821
      _par(par),
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2822
      _vo(vo),
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2823
      _failures(false) {}
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2824
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2825
  bool failures() {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2826
    return _failures;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2827
  }
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2828
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2829
  bool doHeapRegion(HeapRegion* r) {
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2830
    guarantee(_par || r->claim_value() == HeapRegion::InitialClaimValue,
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2831
              "Should be unclaimed at verify points.");
2249
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  2832
    if (!r->continuesHumongous()) {
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2833
      bool failures = false;
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2834
      r->verify(_allow_dirty, _vo, &failures);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2835
      if (failures) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2836
        _failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2837
      } else {
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2838
        VerifyObjsInRegionClosure not_dead_yet_cl(r, _vo);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2839
        r->object_iterate(&not_dead_yet_cl);
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2840
        if (r->max_live_bytes() < not_dead_yet_cl.live_bytes()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2841
          gclog_or_tty->print_cr("["PTR_FORMAT","PTR_FORMAT"] "
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2842
                                 "max_live_bytes "SIZE_FORMAT" "
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2843
                                 "< calculated "SIZE_FORMAT,
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2844
                                 r->bottom(), r->end(),
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2845
                                 r->max_live_bytes(),
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2846
                                 not_dead_yet_cl.live_bytes());
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2847
          _failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2848
        }
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2849
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2850
    }
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2851
    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
  2852
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2853
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2854
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2855
class VerifyRootsClosure: public OopsInGenClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2856
private:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2857
  G1CollectedHeap* _g1h;
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2858
  VerifyOption     _vo;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2859
  bool             _failures;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2860
public:
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2861
  // _vo == UsePrevMarking -> use "prev" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2862
  // _vo == UseNextMarking -> use "next" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2863
  // _vo == UseMarkWord    -> use mark word from object header.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2864
  VerifyRootsClosure(VerifyOption vo) :
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2865
    _g1h(G1CollectedHeap::heap()),
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2866
    _vo(vo),
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2867
    _failures(false) { }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2868
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2869
  bool failures() { return _failures; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2870
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2871
  template <class T> void do_oop_nv(T* p) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2872
    T heap_oop = oopDesc::load_heap_oop(p);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2873
    if (!oopDesc::is_null(heap_oop)) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2874
      oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2875
      if (_g1h->is_obj_dead_cond(obj, _vo)) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2876
        gclog_or_tty->print_cr("Root location "PTR_FORMAT" "
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2877
                              "points to dead obj "PTR_FORMAT, p, (void*) obj);
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2878
        if (_vo == VerifyOption_G1UseMarkWord) {
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2879
          gclog_or_tty->print_cr("  Mark word: "PTR_FORMAT, (void*)(obj->mark()));
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2880
        }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2881
        obj->print_on(gclog_or_tty);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2882
        _failures = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2883
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2884
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2885
  }
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2886
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2887
  void do_oop(oop* p)       { do_oop_nv(p); }
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2888
  void do_oop(narrowOop* p) { do_oop_nv(p); }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2889
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2890
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2891
// This is the task used for parallel heap verification.
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2892
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2893
class G1ParVerifyTask: public AbstractGangTask {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2894
private:
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2895
  G1CollectedHeap* _g1h;
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2896
  bool             _allow_dirty;
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2897
  VerifyOption     _vo;
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2898
  bool             _failures;
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2899
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2900
public:
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2901
  // _vo == UsePrevMarking -> use "prev" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2902
  // _vo == UseNextMarking -> use "next" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2903
  // _vo == UseMarkWord    -> use mark word from object header.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2904
  G1ParVerifyTask(G1CollectedHeap* g1h, bool allow_dirty, VerifyOption vo) :
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2905
    AbstractGangTask("Parallel verify task"),
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2906
    _g1h(g1h),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2907
    _allow_dirty(allow_dirty),
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2908
    _vo(vo),
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2909
    _failures(false) { }
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2910
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2911
  bool failures() {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2912
    return _failures;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2913
  }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2914
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2915
  void work(int worker_i) {
2249
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  2916
    HandleMark hm;
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2917
    VerifyRegionClosure blk(_allow_dirty, true, _vo);
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2918
    _g1h->heap_region_par_iterate_chunked(&blk, worker_i,
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2919
                                          HeapRegion::ParVerifyClaimValue);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2920
    if (blk.failures()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2921
      _failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2922
    }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2923
  }
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2924
};
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2925
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2926
void G1CollectedHeap::verify(bool allow_dirty, bool silent) {
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2927
  verify(allow_dirty, silent, VerifyOption_G1UsePrevMarking);
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2928
}
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2929
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2930
void G1CollectedHeap::verify(bool allow_dirty,
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2931
                             bool silent,
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2932
                             VerifyOption vo) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2933
  if (SafepointSynchronize::is_at_safepoint() || ! UseTLAB) {
9342
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  2934
    if (!silent) { gclog_or_tty->print("Roots (excluding permgen) "); }
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2935
    VerifyRootsClosure rootsCl(vo);
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  2936
    CodeBlobToOopClosure blobsCl(&rootsCl, /*do_marking=*/ false);
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2937
9342
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  2938
    // 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
  2939
    // system dictionary, the string table and the code cache.
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  2940
    const int so = SharedHeap::SO_AllClasses | SharedHeap::SO_Strings | SharedHeap::SO_CodeCache;
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2941
9342
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  2942
    process_strong_roots(true,      // activate StrongRootsScope
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  2943
                         true,      // we set "collecting perm gen" to true,
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  2944
                                    // so we don't reset the dirty cards in the perm gen.
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  2945
                         SharedHeap::ScanningOption(so),  // roots scanning options
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2946
                         &rootsCl,
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  2947
                         &blobsCl,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2948
                         &rootsCl);
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2949
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2950
    // If we're verifying after the marking phase of a Full GC then we can't
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2951
    // treat the perm gen as roots into the G1 heap. Some of the objects in
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2952
    // the perm gen may be dead and hence not marked. If one of these dead
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2953
    // objects is considered to be a root then we may end up with a false
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2954
    // "Root location <x> points to dead ob <y>" failure.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2955
    if (vo != VerifyOption_G1UseMarkWord) {
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2956
      // Since we used "collecting_perm_gen" == true above, we will not have
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2957
      // checked the refs from perm into the G1-collected heap. We check those
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2958
      // references explicitly below. Whether the relevant cards are dirty
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2959
      // is checked further below in the rem set verification.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2960
      if (!silent) { gclog_or_tty->print("Permgen roots "); }
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2961
      perm_gen()->oop_iterate(&rootsCl);
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2962
    }
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2963
    bool failures = rootsCl.failures();
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2964
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2965
    if (vo != VerifyOption_G1UseMarkWord) {
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2966
      // 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
  2967
      // 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
  2968
      // verifying the region sets will fail. So we only verify
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2969
      // the region sets when not in a full GC.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2970
      if (!silent) { gclog_or_tty->print("HeapRegionSets "); }
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2971
      verify_region_sets();
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2972
    }
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2973
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2974
    if (!silent) { gclog_or_tty->print("HeapRegions "); }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2975
    if (GCParallelVerificationEnabled && ParallelGCThreads > 1) {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2976
      assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2977
             "sanity check");
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2978
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2979
      G1ParVerifyTask task(this, allow_dirty, vo);
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2980
      int n_workers = workers()->total_workers();
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2981
      set_par_threads(n_workers);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2982
      workers()->run_task(&task);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2983
      set_par_threads(0);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2984
      if (task.failures()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2985
        failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2986
      }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2987
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2988
      assert(check_heap_region_claim_values(HeapRegion::ParVerifyClaimValue),
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2989
             "sanity check");
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2990
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2991
      reset_heap_region_claim_values();
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2992
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2993
      assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2994
             "sanity check");
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2995
    } else {
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  2996
      VerifyRegionClosure blk(allow_dirty, false, vo);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2997
      heap_region_iterate(&blk);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2998
      if (blk.failures()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2999
        failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3000
      }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3001
    }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3002
    if (!silent) gclog_or_tty->print("RemSet ");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3003
    rem_set()->verify();
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3004
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3005
    if (failures) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3006
      gclog_or_tty->print_cr("Heap:");
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3007
      print_on(gclog_or_tty, true /* extended */);
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3008
      gclog_or_tty->print_cr("");
5542
be05c5ffe905 6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents: 5540
diff changeset
  3009
#ifndef PRODUCT
4099
77d31ea5a439 6890137: G1: revamp reachable object dump
tonyp
parents: 4023
diff changeset
  3010
      if (VerifyDuringGC && G1VerifyDuringGCPrintReachable) {
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5343
diff changeset
  3011
        concurrent_mark()->print_reachable("at-verification-failure",
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3012
                                           vo, false /* all */);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3013
      }
5542
be05c5ffe905 6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents: 5540
diff changeset
  3014
#endif
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3015
      gclog_or_tty->flush();
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3016
    }
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3017
    guarantee(!failures, "there should not have been any failures");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3018
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3019
    if (!silent) gclog_or_tty->print("(SKIPPING roots, heapRegions, remset) ");
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
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3022
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3023
class PrintRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3024
  outputStream* _st;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3025
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3026
  PrintRegionClosure(outputStream* st) : _st(st) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3027
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3028
    r->print_on(_st);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3029
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3030
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3031
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3032
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3033
void G1CollectedHeap::print() const { print_on(tty); }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3034
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3035
void G1CollectedHeap::print_on(outputStream* st) const {
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3036
  print_on(st, PrintHeapAtGCExtended);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3037
}
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3038
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3039
void G1CollectedHeap::print_on(outputStream* st, bool extended) const {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3040
  st->print(" %-20s", "garbage-first heap");
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3041
  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
  3042
            capacity()/K, used_unlocked()/K);
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3043
  st->print(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", " INTPTR_FORMAT ")",
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3044
            _g1_storage.low_boundary(),
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3045
            _g1_storage.high(),
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3046
            _g1_storage.high_boundary());
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3047
  st->cr();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3048
  st->print("  region size " SIZE_FORMAT "K, ",
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3049
            HeapRegion::GrainBytes/K);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3050
  size_t young_regions = _young_list->length();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3051
  st->print(SIZE_FORMAT " young (" SIZE_FORMAT "K), ",
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3052
            young_regions, young_regions * HeapRegion::GrainBytes / K);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3053
  size_t survivor_regions = g1_policy()->recorded_survivor_regions();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3054
  st->print(SIZE_FORMAT " survivors (" SIZE_FORMAT "K)",
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3055
            survivor_regions, survivor_regions * HeapRegion::GrainBytes / K);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3056
  st->cr();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3057
  perm()->as_gen()->print_on(st);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3058
  if (extended) {
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3059
    st->cr();
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3060
    print_on_extended(st);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3061
  }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3062
}
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3063
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3064
void G1CollectedHeap::print_on_extended(outputStream* st) const {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3065
  PrintRegionClosure blk(st);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  3066
  heap_region_iterate(&blk);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3067
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3068
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3069
void G1CollectedHeap::print_gc_threads_on(outputStream* st) const {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  3070
  if (G1CollectedHeap::use_parallel_gc_threads()) {
4022
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3071
    workers()->print_worker_threads_on(st);
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3072
  }
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3073
  _cmThread->print_on(st);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3074
  st->cr();
4022
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3075
  _cm->print_worker_threads_on(st);
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3076
  _cg1r->print_worker_threads_on(st);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3077
  st->cr();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3078
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3079
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3080
void G1CollectedHeap::gc_threads_do(ThreadClosure* tc) const {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  3081
  if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3082
    workers()->threads_do(tc);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3083
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3084
  tc->do_thread(_cmThread);
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  3085
  _cg1r->threads_do(tc);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3086
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3087
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3088
void G1CollectedHeap::print_tracing_info() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3089
  // We'll overload this to mean "trace GC pause statistics."
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3090
  if (TraceGen0Time || TraceGen1Time) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3091
    // The "G1CollectorPolicy" is keeping track of these stats, so delegate
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3092
    // to that.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3093
    g1_policy()->print_tracing_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3094
  }
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2345
diff changeset
  3095
  if (G1SummarizeRSetStats) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3096
    g1_rem_set()->print_summary_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3097
  }
5033
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
  3098
  if (G1SummarizeConcMark) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3099
    concurrent_mark()->print_summary_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3100
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3101
  g1_policy()->print_yg_surv_rate_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3102
  SpecializationStats::print();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3103
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3104
10000
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3105
#ifndef PRODUCT
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3106
// Helpful for debugging RSet issues.
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3107
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3108
class PrintRSetsClosure : public HeapRegionClosure {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3109
private:
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3110
  const char* _msg;
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3111
  size_t _occupied_sum;
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3112
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3113
public:
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3114
  bool doHeapRegion(HeapRegion* r) {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3115
    HeapRegionRemSet* hrrs = r->rem_set();
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3116
    size_t occupied = hrrs->occupied();
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3117
    _occupied_sum += occupied;
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3118
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3119
    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
  3120
                           HR_FORMAT_PARAMS(r));
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3121
    if (occupied == 0) {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3122
      gclog_or_tty->print_cr("  RSet is empty");
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3123
    } else {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3124
      hrrs->print();
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3125
    }
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3126
    gclog_or_tty->print_cr("----------");
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3127
    return false;
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3128
  }
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3129
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3130
  PrintRSetsClosure(const char* msg) : _msg(msg), _occupied_sum(0) {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3131
    gclog_or_tty->cr();
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3132
    gclog_or_tty->print_cr("========================================");
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3133
    gclog_or_tty->print_cr(msg);
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3134
    gclog_or_tty->cr();
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3135
  }
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3136
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3137
  ~PrintRSetsClosure() {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3138
    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
  3139
    gclog_or_tty->print_cr("========================================");
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3140
    gclog_or_tty->cr();
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3141
  }
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3142
};
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3143
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3144
void G1CollectedHeap::print_cset_rsets() {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3145
  PrintRSetsClosure cl("Printing CSet RSets");
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3146
  collection_set_iterate(&cl);
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3147
}
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3148
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3149
void G1CollectedHeap::print_all_rsets() {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3150
  PrintRSetsClosure cl("Printing All RSets");;
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3151
  heap_region_iterate(&cl);
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3152
}
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3153
#endif // PRODUCT
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3154
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3155
G1CollectedHeap* G1CollectedHeap::heap() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3156
  assert(_sh->kind() == CollectedHeap::G1CollectedHeap,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3157
         "not a garbage-first heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3158
  return _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3159
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3160
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3161
void G1CollectedHeap::gc_prologue(bool full /* Ignored */) {
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4637
diff changeset
  3162
  // always_do_update_barrier = false;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3163
  assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3164
  // Call allocation profiler
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3165
  AllocationProfiler::iterate_since_last_gc();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3166
  // Fill TLAB's and such
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3167
  ensure_parsability(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3168
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3169
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3170
void G1CollectedHeap::gc_epilogue(bool full /* Ignored */) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3171
  // FIXME: what is this about?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3172
  // I'm ignoring the "fill_newgen()" call if "alloc_event_enabled"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3173
  // is set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3174
  COMPILER2_PRESENT(assert(DerivedPointerTable::is_empty(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3175
                        "derived pointer present"));
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4637
diff changeset
  3176
  // always_do_update_barrier = true;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3177
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3178
  // We have just completed a GC. Update the soft reference
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3179
  // policy with the new heap occupancy
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3180
  Universe::update_heap_info_at_gc();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3181
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3182
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3183
HeapWord* G1CollectedHeap::do_collection_pause(size_t word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3184
                                               unsigned int gc_count_before,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3185
                                               bool* succeeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3186
  assert_heap_not_locked_and_not_at_safepoint();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3187
  g1_policy()->record_stop_world_start();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3188
  VM_G1IncCollectionPause op(gc_count_before,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3189
                             word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3190
                             false, /* should_initiate_conc_mark */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3191
                             g1_policy()->max_pause_time_ms(),
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3192
                             GCCause::_g1_inc_collection_pause);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3193
  VMThread::execute(&op);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3194
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3195
  HeapWord* result = op.result();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3196
  bool ret_succeeded = op.prologue_succeeded() && op.pause_succeeded();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3197
  assert(result == NULL || ret_succeeded,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3198
         "the result should be NULL if the VM did not succeed");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3199
  *succeeded = ret_succeeded;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3200
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3201
  assert_heap_not_locked();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3202
  return result;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3203
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3204
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3205
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3206
G1CollectedHeap::doConcurrentMark() {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3207
  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
  3208
  if (!_cmThread->in_progress()) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3209
    _cmThread->set_started();
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3210
    CGC_lock->notify();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3211
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3212
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3213
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3214
// <NEW PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3215
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3216
double G1CollectedHeap::predict_region_elapsed_time_ms(HeapRegion *hr,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3217
                                                       bool young) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3218
  return _g1_policy->predict_region_elapsed_time_ms(hr, young);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3219
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3220
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3221
void G1CollectedHeap::check_if_region_is_too_expensive(double
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3222
                                                           predicted_time_ms) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3223
  _g1_policy->check_if_region_is_too_expensive(predicted_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3224
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3225
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3226
size_t G1CollectedHeap::pending_card_num() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3227
  size_t extra_cards = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3228
  JavaThread *curr = Threads::first();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3229
  while (curr != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3230
    DirtyCardQueue& dcq = curr->dirty_card_queue();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3231
    extra_cards += dcq.size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3232
    curr = curr->next();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3233
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3234
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3235
  size_t buffer_size = dcqs.buffer_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3236
  size_t buffer_num = dcqs.completed_buffers_num();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3237
  return buffer_size * buffer_num + extra_cards;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3238
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3239
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3240
size_t G1CollectedHeap::max_pending_card_num() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3241
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3242
  size_t buffer_size = dcqs.buffer_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3243
  size_t buffer_num  = dcqs.completed_buffers_num();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3244
  int thread_num  = Threads::number_of_threads();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3245
  return (buffer_num + thread_num) * buffer_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3246
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3247
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3248
size_t G1CollectedHeap::cards_scanned() {
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  3249
  return g1_rem_set()->cardsScanned();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3250
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3251
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3252
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3253
G1CollectedHeap::setup_surviving_young_words() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3254
  guarantee( _surviving_young_words == NULL, "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3255
  size_t array_length = g1_policy()->young_cset_length();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3256
  _surviving_young_words = NEW_C_HEAP_ARRAY(size_t, array_length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3257
  if (_surviving_young_words == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3258
    vm_exit_out_of_memory(sizeof(size_t) * array_length,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3259
                          "Not enough space for young surv words summary.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3260
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3261
  memset(_surviving_young_words, 0, array_length * sizeof(size_t));
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3262
#ifdef ASSERT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3263
  for (size_t i = 0;  i < array_length; ++i) {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3264
    assert( _surviving_young_words[i] == 0, "memset above" );
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3265
  }
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3266
#endif // !ASSERT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3267
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3268
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3269
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3270
G1CollectedHeap::update_surviving_young_words(size_t* surv_young_words) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3271
  MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3272
  size_t array_length = g1_policy()->young_cset_length();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3273
  for (size_t i = 0; i < array_length; ++i)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3274
    _surviving_young_words[i] += surv_young_words[i];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3275
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3276
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3277
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3278
G1CollectedHeap::cleanup_surviving_young_words() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3279
  guarantee( _surviving_young_words != NULL, "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3280
  FREE_C_HEAP_ARRAY(size_t, _surviving_young_words);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3281
  _surviving_young_words = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3282
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3283
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3284
// </NEW PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3285
10000
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3286
#ifdef ASSERT
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3287
class VerifyCSetClosure: public HeapRegionClosure {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3288
public:
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3289
  bool doHeapRegion(HeapRegion* hr) {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3290
    // 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
  3291
    // 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
  3292
    // 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
  3293
    // 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
  3294
    // 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
  3295
    // 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
  3296
    // 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
  3297
    // 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
  3298
    // evacuation failure handling.
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3299
    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
  3300
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3301
    // 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
  3302
    // perform on CSet regions.
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3303
    return false;
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3304
  }
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3305
};
10000
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3306
#endif // ASSERT
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3307
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3308
#if TASKQUEUE_STATS
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3309
void G1CollectedHeap::print_taskqueue_stats_hdr(outputStream* const st) {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3310
  st->print_raw_cr("GC Task Stats");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3311
  st->print_raw("thr "); TaskQueueStats::print_header(1, st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3312
  st->print_raw("--- "); TaskQueueStats::print_header(2, st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3313
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3314
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3315
void G1CollectedHeap::print_taskqueue_stats(outputStream* const st) const {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3316
  print_taskqueue_stats_hdr(st);
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3317
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3318
  TaskQueueStats totals;
6425
206fd9fee2cf 6978300: G1: debug builds crash if ParallelGCThreads==0
jcoomes
parents: 6261
diff changeset
  3319
  const int n = workers() != NULL ? workers()->total_workers() : 1;
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3320
  for (int i = 0; i < n; ++i) {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3321
    st->print("%3d ", i); task_queue(i)->stats.print(st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3322
    totals += task_queue(i)->stats;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3323
  }
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3324
  st->print_raw("tot "); totals.print(st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3325
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3326
  DEBUG_ONLY(totals.verify());
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3327
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3328
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3329
void G1CollectedHeap::reset_taskqueue_stats() {
6425
206fd9fee2cf 6978300: G1: debug builds crash if ParallelGCThreads==0
jcoomes
parents: 6261
diff changeset
  3330
  const int n = workers() != NULL ? workers()->total_workers() : 1;
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3331
  for (int i = 0; i < n; ++i) {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3332
    task_queue(i)->stats.reset();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3333
  }
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3334
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3335
#endif // TASKQUEUE_STATS
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3336
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3337
bool
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3338
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
  3339
  assert_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3340
  guarantee(!is_gc_active(), "collection is not reentrant");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3341
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3342
  if (GC_locker::check_active_before_gc()) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3343
    return false;
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3344
  }
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3345
7896
08aadd7aa3ee 6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents: 7659
diff changeset
  3346
  SvcGCMarker sgcm(SvcGCMarker::MINOR);
7659
1d92613a1e8a 6896624: G1: hotspot:::gc and hotspot:::mem-pool-gc probes are not fired
tonyp
parents: 7658
diff changeset
  3347
  ResourceMark rm;
1d92613a1e8a 6896624: G1: hotspot:::gc and hotspot:::mem-pool-gc probes are not fired
tonyp
parents: 7658
diff changeset
  3348
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3349
  if (PrintHeapAtGC) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3350
    Universe::print_heap_before_gc();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3351
  }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3352
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3353
  verify_region_sets_optional();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3354
  verify_dirty_young_regions();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3355
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3356
  {
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3357
    // This call will decide whether this pause is an initial-mark
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3358
    // pause. If it is, during_initial_mark_pause() will return true
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3359
    // for the duration of this pause.
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3360
    g1_policy()->decide_on_conc_mark_initiation();
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3361
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3362
    char verbose_str[128];
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3363
    sprintf(verbose_str, "GC pause ");
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  3364
    if (g1_policy()->full_young_gcs()) {
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  3365
      strcat(verbose_str, "(young)");
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  3366
    } else {
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  3367
      strcat(verbose_str, "(partial)");
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3368
    }
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3369
    if (g1_policy()->during_initial_mark_pause()) {
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3370
      strcat(verbose_str, " (initial-mark)");
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3371
      // 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
  3372
      // full collection counter.
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3373
      increment_total_full_collections();
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3374
    }
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3375
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3376
    // if PrintGCDetails is on, we'll print long statistics information
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3377
    // in the collector policy code, so let's not print this as the output
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3378
    // is messy if we do.
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3379
    gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3380
    TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3381
    TraceTime t(verbose_str, PrintGC && !PrintGCDetails, true, gclog_or_tty);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3382
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  3383
    TraceCollectorStats tcs(g1mm()->incremental_collection_counters());
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents: 9424
diff changeset
  3384
    TraceMemoryManagerStats tms(false /* fullGC */, gc_cause());
4459
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  3385
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3386
    // If the secondary_free_list is not empty, append it to the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3387
    // free_list. No need to wait for the cleanup operation to finish;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3388
    // the region allocation code will check the secondary_free_list
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3389
    // and wait if necessary. If the G1StressConcRegionFreeing flag is
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3390
    // set, skip this step so that the region allocation code has to
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3391
    // get entries from the secondary_free_list.
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3392
    if (!G1StressConcRegionFreeing) {
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3393
      append_secondary_free_list_if_not_empty_with_lock();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3394
    }
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3395
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  3396
    assert(check_young_list_well_formed(),
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  3397
      "young list should be well formed");
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3398
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3399
    { // 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
  3400
      IsGCActiveMark x;
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3401
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3402
      gc_prologue(false);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3403
      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
  3404
      increment_gc_time_stamp();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3405
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3406
      if (VerifyBeforeGC && total_collections() >= VerifyGCStartAt) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3407
        HandleMark hm;  // Discard invalid handles created during verification
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3408
        gclog_or_tty->print(" VerifyBeforeGC:");
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3409
        prepare_for_verify();
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3410
        Universe::verify(/* allow dirty */ false,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3411
                         /* silent      */ false,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3412
                         /* option      */ VerifyOption_G1UsePrevMarking);
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3413
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3414
      }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3415
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3416
      COMPILER2_PRESENT(DerivedPointerTable::clear());
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3417
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3418
      // Please see comment in g1CollectedHeap.hpp and
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3419
      // G1CollectedHeap::ref_processing_init() to see how
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3420
      // reference processing currently works in G1.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3421
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3422
      // Enable discovery in the STW reference processor
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3423
      ref_processor_stw()->enable_discovery(true /*verify_disabled*/,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3424
                                            true /*verify_no_refs*/);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3425
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3426
      {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3427
        // We want to temporarily turn off discovery by the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3428
        // CM ref processor, if necessary, and turn it back on
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3429
        // on again later if we do. Using a scoped
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3430
        // NoRefDiscovery object will do this.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3431
        NoRefDiscovery no_cm_discovery(ref_processor_cm());
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3432
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3433
        // 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
  3434
        // of the collection set!).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3435
        release_mutator_alloc_region();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3436
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3437
        // We should call this after we retire the mutator alloc
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3438
        // region(s) so that all the ALLOC / RETIRE events are generated
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3439
        // before the start GC event.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3440
        _hr_printer.start_gc(false /* full */, (size_t) total_collections());
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3441
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3442
        // The elapsed time induced by the start time below deliberately elides
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3443
        // the possible verification above.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3444
        double start_time_sec = os::elapsedTime();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3445
        size_t start_used_bytes = used();
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3446
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3447
#if YOUNG_LIST_VERBOSE
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3448
        gclog_or_tty->print_cr("\nBefore recording pause start.\nYoung_list:");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3449
        _young_list->print();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3450
        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
  3451
#endif // YOUNG_LIST_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3452
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3453
        g1_policy()->record_collection_pause_start(start_time_sec,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3454
                                                   start_used_bytes);
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3455
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3456
#if YOUNG_LIST_VERBOSE
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3457
        gclog_or_tty->print_cr("\nAfter recording pause start.\nYoung_list:");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3458
        _young_list->print();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3459
#endif // YOUNG_LIST_VERBOSE
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3460
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3461
        if (g1_policy()->during_initial_mark_pause()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3462
          concurrent_mark()->checkpointRootsInitialPre();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3463
        }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3464
        perm_gen()->save_marks();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3465
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3466
        // We must do this before any possible evacuation that should propagate
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3467
        // marks.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3468
        if (mark_in_progress()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3469
          double start_time_sec = os::elapsedTime();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3470
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3471
          _cm->drainAllSATBBuffers();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3472
          double finish_mark_ms = (os::elapsedTime() - start_time_sec) * 1000.0;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3473
          g1_policy()->record_satb_drain_time(finish_mark_ms);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3474
        }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3475
        // Record the number of elements currently on the mark stack, so we
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3476
        // only iterate over these.  (Since evacuation may add to the mark
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3477
        // stack, doing more exposes race conditions.)  If no mark is in
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3478
        // progress, this will be zero.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3479
        _cm->set_oops_do_bound();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3480
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3481
        if (mark_in_progress()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3482
          concurrent_mark()->newCSet();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3483
        }
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3484
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3485
#if YOUNG_LIST_VERBOSE
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3486
        gclog_or_tty->print_cr("\nBefore choosing collection set.\nYoung_list:");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3487
        _young_list->print();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3488
        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
  3489
#endif // YOUNG_LIST_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3490
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3491
        g1_policy()->choose_collection_set(target_pause_time_ms);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3492
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3493
        if (_hr_printer.is_active()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3494
          HeapRegion* hr = g1_policy()->collection_set();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3495
          while (hr != NULL) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3496
            G1HRPrinter::RegionType type;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3497
            if (!hr->is_young()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3498
              type = G1HRPrinter::Old;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3499
            } else if (hr->is_survivor()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3500
              type = G1HRPrinter::Survivor;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3501
            } else {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3502
              type = G1HRPrinter::Eden;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3503
            }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3504
            _hr_printer.cset(hr);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3505
            hr = hr->next_in_collection_set();
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  3506
          }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  3507
        }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3508
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3509
        // We have chosen the complete collection set. If marking is
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3510
        // active then, we clear the region fields of any of the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3511
        // concurrent marking tasks whose region fields point into
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3512
        // the collection set as these values will become stale. This
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3513
        // will cause the owning marking threads to claim a new region
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3514
        // when marking restarts.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3515
        if (mark_in_progress()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3516
          concurrent_mark()->reset_active_task_region_fields_in_cset();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3517
        }
9936
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9935
diff changeset
  3518
10000
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3519
#ifdef ASSERT
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3520
        VerifyCSetClosure cl;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3521
        collection_set_iterate(&cl);
10000
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3522
#endif // ASSERT
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3523
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3524
        setup_surviving_young_words();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3525
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3526
        // Initialize the GC alloc regions.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3527
        init_gc_alloc_regions();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3528
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3529
        // Actually do the work...
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3530
        evacuate_collection_set();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3531
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3532
        free_collection_set(g1_policy()->collection_set());
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3533
        g1_policy()->clear_collection_set();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3534
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3535
        cleanup_surviving_young_words();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3536
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3537
        // Start a new incremental collection set for the next pause.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3538
        g1_policy()->start_incremental_cset_building();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3539
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3540
        // Clear the _cset_fast_test bitmap in anticipation of adding
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3541
        // regions to the incremental collection set for the next
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3542
        // evacuation pause.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3543
        clear_cset_fast_test();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3544
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3545
        _young_list->reset_sampled_info();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3546
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3547
        // Don't check the whole heap at this point as the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3548
        // GC alloc regions from this pause have been tagged
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3549
        // as survivors and moved on to the survivor list.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3550
        // Survivor regions will fail the !is_young() check.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3551
        assert(check_young_list_empty(false /* check_heap */),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3552
          "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
  3553
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3554
#if YOUNG_LIST_VERBOSE
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3555
        gclog_or_tty->print_cr("Before recording survivors.\nYoung List:");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3556
        _young_list->print();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3557
#endif // YOUNG_LIST_VERBOSE
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3558
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3559
        g1_policy()->record_survivor_regions(_young_list->survivor_length(),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3560
                                            _young_list->first_survivor_region(),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3561
                                            _young_list->last_survivor_region());
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3562
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3563
        _young_list->reset_auxilary_lists();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3564
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3565
        if (evacuation_failed()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3566
          _summary_bytes_used = recalculate_used();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3567
        } else {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3568
          // The "used" of the the collection set have already been subtracted
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3569
          // when they were freed.  Add in the bytes evacuated.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3570
          _summary_bytes_used += g1_policy()->bytes_copied_during_gc();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3571
        }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3572
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3573
        if (g1_policy()->during_initial_mark_pause()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3574
          concurrent_mark()->checkpointRootsInitialPost();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3575
          set_marking_started();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3576
          // CAUTION: after the doConcurrentMark() call below,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3577
          // the concurrent marking thread(s) could be running
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3578
          // concurrently with us. Make sure that anything after
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3579
          // this point does not assume that we are the only GC thread
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3580
          // running. Note: of course, the actual marking work will
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3581
          // not start until the safepoint itself is released in
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3582
          // ConcurrentGCThread::safepoint_desynchronize().
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3583
          doConcurrentMark();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3584
        }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3585
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3586
        allocate_dummy_regions();
9334
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  3587
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3588
#if YOUNG_LIST_VERBOSE
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3589
        gclog_or_tty->print_cr("\nEnd of the pause.\nYoung_list:");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3590
        _young_list->print();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3591
        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
  3592
#endif // YOUNG_LIST_VERBOSE
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3593
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3594
        init_mutator_alloc_region();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3595
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3596
        {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3597
          size_t expand_bytes = g1_policy()->expansion_amount();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3598
          if (expand_bytes > 0) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3599
            size_t bytes_before = capacity();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3600
            if (!expand(expand_bytes)) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3601
              // We failed to expand the heap so let's verify that
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3602
              // committed/uncommitted amount match the backing store
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3603
              assert(capacity() == _g1_storage.committed_size(), "committed size mismatch");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3604
              assert(max_capacity() == _g1_storage.reserved_size(), "reserved size mismatch");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3605
            }
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  3606
          }
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  3607
        }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3608
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3609
        double end_time_sec = os::elapsedTime();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3610
        double pause_time_ms = (end_time_sec - start_time_sec) * MILLIUNITS;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3611
        g1_policy()->record_pause_time_ms(pause_time_ms);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3612
        g1_policy()->record_collection_pause_end();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3613
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3614
        MemoryService::track_memory_usage();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3615
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3616
        // 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
  3617
        // update buffers to bring the RSets up-to-date if
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3618
        // G1HRRSFlushLogBuffersOnVerify has been set. While scanning
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3619
        // 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
  3620
        // regions we just allocated to (i.e., the GC alloc
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3621
        // regions). However, during the last GC we called
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3622
        // set_saved_mark() on all the GC alloc regions, so card
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3623
        // scanning might skip the [saved_mark_word()...top()] area of
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3624
        // those regions (i.e., the area we allocated objects into
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3625
        // during the last GC). But it shouldn't. Given that
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3626
        // saved_mark_word() is conditional on whether the GC time stamp
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3627
        // 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
  3628
        // 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
  3629
        // regions and saved_mark_word() will simply return top() for
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3630
        // 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
  3631
        // than iterating over the regions and fixing them. In fact, the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3632
        // GC time stamp increment here also ensures that
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3633
        // saved_mark_word() will return top() between pauses, i.e.,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3634
        // during concurrent refinement. So we don't need the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3635
        // is_gc_active() check to decided which top to use when
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3636
        // scanning cards (see CR 7039627).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3637
        increment_gc_time_stamp();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3638
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3639
        if (VerifyAfterGC && total_collections() >= VerifyGCStartAt) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3640
          HandleMark hm;  // Discard invalid handles created during verification
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3641
          gclog_or_tty->print(" VerifyAfterGC:");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3642
          prepare_for_verify();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3643
          Universe::verify(/* allow dirty */ true,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3644
                           /* silent      */ false,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3645
                           /* option      */ VerifyOption_G1UsePrevMarking);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3646
        }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3647
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3648
        assert(!ref_processor_stw()->discovery_enabled(), "Postcondition");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3649
        ref_processor_stw()->verify_no_references_recorded();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3650
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3651
        // 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
  3652
      }
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  3653
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3654
      {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3655
        size_t expand_bytes = g1_policy()->expansion_amount();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3656
        if (expand_bytes > 0) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3657
          size_t bytes_before = capacity();
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  3658
          // 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
  3659
          // expansion_amount() does this when it returns a value > 0.
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  3660
          if (!expand(expand_bytes)) {
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  3661
            // We failed to expand the heap so let's verify that
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  3662
            // committed/uncommitted amount match the backing store
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  3663
            assert(capacity() == _g1_storage.committed_size(), "committed size mismatch");
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  3664
            assert(max_capacity() == _g1_storage.reserved_size(), "reserved size mismatch");
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  3665
          }
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3666
        }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3667
      }
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  3668
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  3669
      // 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
  3670
      // 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
  3671
      // 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
  3672
      // RETIRE events are generated before the end GC event.
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  3673
      _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
  3674
9987
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 9936
diff changeset
  3675
      // We have to do this after we decide whether to expand the heap or not.
6e2b9796996f 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 9936
diff changeset
  3676
      g1_policy()->print_heap_transition();
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3677
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3678
      if (mark_in_progress()) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3679
        concurrent_mark()->update_g1_committed();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3680
      }
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  3681
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  3682
#ifdef TRACESPINNING
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3683
      ParallelTaskTerminator::print_termination_counts();
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  3684
#endif
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3685
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3686
      gc_epilogue(false);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3687
    }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3688
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3689
    if (ExitAfterGCNum > 0 && total_collections() == ExitAfterGCNum) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3690
      gclog_or_tty->print_cr("Stopping after GC #%d", ExitAfterGCNum);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3691
      print_tracing_info();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3692
      vm_exit(-1);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3693
    }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3694
  }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3695
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  3696
  _hrs.verify_optional();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3697
  verify_region_sets_optional();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3698
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3699
  TASKQUEUE_STATS_ONLY(if (ParallelGCVerbose) print_taskqueue_stats());
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3700
  TASKQUEUE_STATS_ONLY(reset_taskqueue_stats());
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3701
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3702
  if (PrintHeapAtGC) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3703
    Universe::print_heap_after_gc();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3704
  }
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  3705
  g1mm()->update_counters();
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  3706
3584
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  3707
  if (G1SummarizeRSetStats &&
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  3708
      (G1SummarizeRSetStatsPeriod > 0) &&
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  3709
      (total_collections() % G1SummarizeRSetStatsPeriod == 0)) {
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  3710
    g1_rem_set()->print_summary_info();
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  3711
  }
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3712
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3713
  return true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3714
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3715
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3716
size_t G1CollectedHeap::desired_plab_sz(GCAllocPurpose purpose)
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3717
{
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3718
  size_t gclab_word_size;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3719
  switch (purpose) {
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3720
    case GCAllocForSurvived:
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3721
      gclab_word_size = YoungPLABSize;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3722
      break;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3723
    case GCAllocForTenured:
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3724
      gclab_word_size = OldPLABSize;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3725
      break;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3726
    default:
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3727
      assert(false, "unknown GCAllocPurpose");
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3728
      gclab_word_size = OldPLABSize;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3729
      break;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3730
  }
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3731
  return gclab_word_size;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3732
}
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3733
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3734
void G1CollectedHeap::init_mutator_alloc_region() {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3735
  assert(_mutator_alloc_region.get() == NULL, "pre-condition");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3736
  _mutator_alloc_region.init();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3737
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3738
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3739
void G1CollectedHeap::release_mutator_alloc_region() {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3740
  _mutator_alloc_region.release();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3741
  assert(_mutator_alloc_region.get() == NULL, "post-condition");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3742
}
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3743
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3744
void G1CollectedHeap::init_gc_alloc_regions() {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3745
  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
  3746
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3747
  _survivor_gc_alloc_region.init();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3748
  _old_gc_alloc_region.init();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3749
  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
  3750
  _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
  3751
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3752
  // 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
  3753
  // 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
  3754
  // 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
  3755
  // 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
  3756
  // 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
  3757
  // 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
  3758
  // during a cleanup and was added to the free list, but
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3759
  // has been subseqently used to allocate a humongous
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3760
  // 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
  3761
  if (retained_region != NULL &&
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3762
      !retained_region->in_collection_set() &&
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3763
      !(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
  3764
      !retained_region->is_empty() &&
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3765
      !retained_region->isHumongous()) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3766
    retained_region->set_saved_mark();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3767
    _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
  3768
    _hr_printer.reuse(retained_region);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3769
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3770
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3771
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3772
void G1CollectedHeap::release_gc_alloc_regions() {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3773
  _survivor_gc_alloc_region.release();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3774
  // 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
  3775
  // _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
  3776
  // _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
  3777
  // 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
  3778
  // condition.
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3779
  _retained_old_gc_alloc_region = _old_gc_alloc_region.release();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3780
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3781
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3782
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
  3783
  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
  3784
  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
  3785
  _retained_old_gc_alloc_region = NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3786
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3787
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3788
void G1CollectedHeap::init_for_evac_failure(OopsInHeapRegionClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3789
  _drain_in_progress = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3790
  set_evac_failure_closure(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3791
  _evac_failure_scan_stack = new (ResourceObj::C_HEAP) GrowableArray<oop>(40, true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3792
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3793
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3794
void G1CollectedHeap::finalize_for_evac_failure() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3795
  assert(_evac_failure_scan_stack != NULL &&
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3796
         _evac_failure_scan_stack->length() == 0,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3797
         "Postcondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3798
  assert(!_drain_in_progress, "Postcondition");
4100
4f43ba12619a 6870843: G1: G1 GC memory leak
apetrusenko
parents: 4099
diff changeset
  3799
  delete _evac_failure_scan_stack;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3800
  _evac_failure_scan_stack = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3801
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3802
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3803
class UpdateRSetDeferred : public OopsInHeapRegionClosure {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3804
private:
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3805
  G1CollectedHeap* _g1;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3806
  DirtyCardQueue *_dcq;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3807
  CardTableModRefBS* _ct_bs;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3808
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3809
public:
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3810
  UpdateRSetDeferred(G1CollectedHeap* g1, DirtyCardQueue* dcq) :
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3811
    _g1(g1), _ct_bs((CardTableModRefBS*)_g1->barrier_set()), _dcq(dcq) {}
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3812
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3813
  virtual 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
  3814
  virtual 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
  3815
  template <class T> void do_oop_work(T* p) {
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3816
    assert(_from->is_in_reserved(p), "paranoia");
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3817
    if (!_from->is_in_reserved(oopDesc::load_decode_heap_oop(p)) &&
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3818
        !_from->is_survivor()) {
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3819
      size_t card_index = _ct_bs->index_for(p);
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3820
      if (_ct_bs->mark_card_deferred(card_index)) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3821
        _dcq->enqueue((jbyte*)_ct_bs->byte_for_index(card_index));
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3822
      }
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3823
    }
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3824
  }
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3825
};
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3826
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3827
class RemoveSelfPointerClosure: public ObjectClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3828
private:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3829
  G1CollectedHeap* _g1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3830
  ConcurrentMark* _cm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3831
  HeapRegion* _hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3832
  size_t _prev_marked_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3833
  size_t _next_marked_bytes;
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3834
  OopsInHeapRegionClosure *_cl;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3835
public:
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3836
  RemoveSelfPointerClosure(G1CollectedHeap* g1, HeapRegion* hr,
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3837
                           OopsInHeapRegionClosure* cl) :
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3838
    _g1(g1), _hr(hr), _cm(_g1->concurrent_mark()),  _prev_marked_bytes(0),
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3839
    _next_marked_bytes(0), _cl(cl) {}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3840
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3841
  size_t prev_marked_bytes() { return _prev_marked_bytes; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3842
  size_t next_marked_bytes() { return _next_marked_bytes; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3843
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3844
  // <original comment>
1384
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3845
  // The original idea here was to coalesce evacuated and dead objects.
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3846
  // However that caused complications with the block offset table (BOT).
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3847
  // In particular if there were two TLABs, one of them partially refined.
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3848
  // |----- TLAB_1--------|----TLAB_2-~~~(partially refined part)~~~|
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3849
  // The BOT entries of the unrefined part of TLAB_2 point to the start
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3850
  // of TLAB_2. If the last object of the TLAB_1 and the first object
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3851
  // of TLAB_2 are coalesced, then the cards of the unrefined part
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3852
  // would point into middle of the filler object.
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3853
  // The current approach is to not coalesce and leave the BOT contents intact.
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3854
  // </original comment>
1384
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3855
  //
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3856
  // We now reset the BOT when we start the object iteration over the
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3857
  // region and refine its entries for every object we come across. So
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3858
  // the above comment is not really relevant and we should be able
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3859
  // to coalesce dead objects if we want to.
1384
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3860
  void do_object(oop obj) {
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3861
    HeapWord* obj_addr = (HeapWord*) obj;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3862
    assert(_hr->is_in(obj_addr), "sanity");
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3863
    size_t obj_size = obj->size();
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3864
    _hr->update_bot_for_object(obj_addr, obj_size);
1384
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3865
    if (obj->is_forwarded() && obj->forwardee() == obj) {
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3866
      // The object failed to move.
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3867
      assert(!_g1->is_obj_dead(obj), "We should not be preserving dead objs.");
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3868
      _cm->markPrev(obj);
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3869
      assert(_cm->isPrevMarked(obj), "Should be marked!");
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3870
      _prev_marked_bytes += (obj_size * HeapWordSize);
1384
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3871
      if (_g1->mark_in_progress() && !_g1->is_obj_ill(obj)) {
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3872
        _cm->markAndGrayObjectIfNecessary(obj);
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3873
      }
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3874
      obj->set_mark(markOopDesc::prototype());
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3875
      // While we were processing RSet buffers during the
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3876
      // collection, we actually didn't scan any cards on the
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3877
      // collection set, since we didn't want to update remebered
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3878
      // sets with entries that point into the collection set, given
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3879
      // that live objects fromthe collection set are about to move
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3880
      // and such entries will be stale very soon. This change also
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3881
      // dealt with a reliability issue which involved scanning a
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3882
      // card in the collection set and coming across an array that
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3883
      // was being chunked and looking malformed. The problem is
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3884
      // that, if evacuation fails, we might have remembered set
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3885
      // entries missing given that we skipped cards on the
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3886
      // collection set. So, we'll recreate such entries now.
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3887
      obj->oop_iterate(_cl);
1384
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3888
      assert(_cm->isPrevMarked(obj), "Should be marked!");
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3889
    } else {
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3890
      // The object has been either evacuated or is dead. Fill it with a
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3891
      // dummy object.
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3892
      MemRegion mr((HeapWord*)obj, obj_size);
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  3893
      CollectedHeap::fill_with_object(mr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3894
      _cm->clearRangeBothMaps(mr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3895
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3896
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3897
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3898
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3899
void G1CollectedHeap::remove_self_forwarding_pointers() {
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  3900
  UpdateRSetImmediate immediate_update(_g1h->g1_rem_set());
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3901
  DirtyCardQueue dcq(&_g1h->dirty_card_queue_set());
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3902
  UpdateRSetDeferred deferred_update(_g1h, &dcq);
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3903
  OopsInHeapRegionClosure *cl;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3904
  if (G1DeferredRSUpdate) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3905
    cl = &deferred_update;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3906
  } else {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3907
    cl = &immediate_update;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3908
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3909
  HeapRegion* cur = g1_policy()->collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3910
  while (cur != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3911
    assert(g1_policy()->assertMarkedBytesDataOK(), "Should be!");
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3912
    assert(!cur->isHumongous(), "sanity");
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3913
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3914
    if (cur->evacuation_failed()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3915
      assert(cur->in_collection_set(), "bad CS");
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3916
      RemoveSelfPointerClosure rspc(_g1h, cur, cl);
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3917
10000
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3918
      // In the common case we make sure that this is done when the
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3919
      // region is freed so that it is "ready-to-go" when it's
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3920
      // re-allocated. However, when evacuation failure happens, a
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3921
      // region will remain in the heap and might ultimately be added
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3922
      // to a CSet in the future. So we have to be careful here and
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3923
      // make sure the region's RSet is ready for parallel iteration
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3924
      // whenever this might be required in the future.
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3925
      cur->rem_set()->reset_for_par_iteration();
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3926
      cur->reset_bot();
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3927
      cl->set_region(cur);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3928
      cur->object_iterate(&rspc);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3929
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3930
      // A number of manipulations to make the TAMS be the current top,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3931
      // and the marked bytes be the ones observed in the iteration.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3932
      if (_g1h->concurrent_mark()->at_least_one_mark_complete()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3933
        // The comments below are the postconditions achieved by the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3934
        // calls.  Note especially the last such condition, which says that
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3935
        // the count of marked bytes has been properly restored.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3936
        cur->note_start_of_marking(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3937
        // _next_top_at_mark_start == top, _next_marked_bytes == 0
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3938
        cur->add_to_marked_bytes(rspc.prev_marked_bytes());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3939
        // _next_marked_bytes == prev_marked_bytes.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3940
        cur->note_end_of_marking();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3941
        // _prev_top_at_mark_start == top(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3942
        // _prev_marked_bytes == prev_marked_bytes
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3943
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3944
      // If there is no mark in progress, we modified the _next variables
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3945
      // above needlessly, but harmlessly.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3946
      if (_g1h->mark_in_progress()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3947
        cur->note_start_of_marking(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3948
        // _next_top_at_mark_start == top, _next_marked_bytes == 0
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3949
        // _next_marked_bytes == next_marked_bytes.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3950
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3951
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3952
      // Now make sure the region has the right index in the sorted array.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3953
      g1_policy()->note_change_in_marked_bytes(cur);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3954
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3955
    cur = cur->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3956
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3957
  assert(g1_policy()->assertMarkedBytesDataOK(), "Should be!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3958
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3959
  // Now restore saved marks, if any.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3960
  if (_objs_with_preserved_marks != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3961
    assert(_preserved_marks_of_objs != NULL, "Both or none.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3962
    guarantee(_objs_with_preserved_marks->length() ==
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3963
              _preserved_marks_of_objs->length(), "Both or none.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3964
    for (int i = 0; i < _objs_with_preserved_marks->length(); i++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3965
      oop obj   = _objs_with_preserved_marks->at(i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3966
      markOop m = _preserved_marks_of_objs->at(i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3967
      obj->set_mark(m);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3968
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3969
    // Delete the preserved marks growable arrays (allocated on the C heap).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3970
    delete _objs_with_preserved_marks;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3971
    delete _preserved_marks_of_objs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3972
    _objs_with_preserved_marks = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3973
    _preserved_marks_of_objs = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3974
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3975
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3976
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3977
void G1CollectedHeap::push_on_evac_failure_scan_stack(oop obj) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3978
  _evac_failure_scan_stack->push(obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3979
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3980
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3981
void G1CollectedHeap::drain_evac_failure_scan_stack() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3982
  assert(_evac_failure_scan_stack != NULL, "precondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3983
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3984
  while (_evac_failure_scan_stack->length() > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3985
     oop obj = _evac_failure_scan_stack->pop();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3986
     _evac_failure_closure->set_region(heap_region_containing(obj));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3987
     obj->oop_iterate_backwards(_evac_failure_closure);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3988
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3989
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3990
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3991
oop
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3992
G1CollectedHeap::handle_evacuation_failure_par(OopsInHeapRegionClosure* cl,
10664
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  3993
                                               oop old,
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  3994
                                               bool should_mark_root) {
9424
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  3995
  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
  3996
         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
  3997
                 (HeapWord*) old));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3998
  markOop m = old->mark();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3999
  oop forward_ptr = old->forward_to_atomic(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4000
  if (forward_ptr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4001
    // Forward-to-self succeeded.
10664
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4002
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4003
    // should_mark_root will be true when this routine is called
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4004
    // from a root scanning closure during an initial mark pause.
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4005
    // In this case the thread that succeeds in self-forwarding the
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4006
    // object is also responsible for marking the object.
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4007
    if (should_mark_root) {
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4008
      assert(!oopDesc::is_null(old), "shouldn't be");
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4009
      _cm->grayRoot(old);
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4010
    }
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4011
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4012
    if (_evac_failure_closure != cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4013
      MutexLockerEx x(EvacFailureStack_lock, Mutex::_no_safepoint_check_flag);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4014
      assert(!_drain_in_progress,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4015
             "Should only be true while someone holds the lock.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4016
      // Set the global evac-failure closure to the current thread's.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4017
      assert(_evac_failure_closure == NULL, "Or locking has failed.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4018
      set_evac_failure_closure(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4019
      // Now do the common part.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4020
      handle_evacuation_failure_common(old, m);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4021
      // Reset to NULL.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4022
      set_evac_failure_closure(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4023
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4024
      // The lock is already held, and this is recursive.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4025
      assert(_drain_in_progress, "This should only be the recursive case.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4026
      handle_evacuation_failure_common(old, m);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4027
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4028
    return old;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4029
  } 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
  4030
    // 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
  4031
    // 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
  4032
    // 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
  4033
    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
  4034
           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
  4035
                   "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
  4036
                   (HeapWord*) old, (HeapWord*) forward_ptr));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4037
    return forward_ptr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4038
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4039
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4040
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4041
void G1CollectedHeap::handle_evacuation_failure_common(oop old, markOop m) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4042
  set_evacuation_failed(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4043
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4044
  preserve_mark_if_necessary(old, m);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4045
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4046
  HeapRegion* r = heap_region_containing(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4047
  if (!r->evacuation_failed()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4048
    r->set_evacuation_failed(true);
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  4049
    _hr_printer.evac_failure(r);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4050
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4051
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4052
  push_on_evac_failure_scan_stack(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4053
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4054
  if (!_drain_in_progress) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4055
    // prevent recursion in copy_to_survivor_space()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4056
    _drain_in_progress = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4057
    drain_evac_failure_scan_stack();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4058
    _drain_in_progress = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4059
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4060
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4061
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4062
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
  4063
  assert(evacuation_failed(), "Oversaving!");
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7657
diff changeset
  4064
  // 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
  4065
  // case of a promotion failure.
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7657
diff changeset
  4066
  if (m->must_be_preserved_for_promotion_failure(obj)) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4067
    if (_objs_with_preserved_marks == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4068
      assert(_preserved_marks_of_objs == NULL, "Both or none.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4069
      _objs_with_preserved_marks =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4070
        new (ResourceObj::C_HEAP) GrowableArray<oop>(40, true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4071
      _preserved_marks_of_objs =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4072
        new (ResourceObj::C_HEAP) GrowableArray<markOop>(40, true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4073
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4074
    _objs_with_preserved_marks->push(obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4075
    _preserved_marks_of_objs->push(m);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4076
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4077
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4078
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4079
HeapWord* G1CollectedHeap::par_allocate_during_gc(GCAllocPurpose purpose,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4080
                                                  size_t word_size) {
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4081
  if (purpose == GCAllocForSurvived) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4082
    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
  4083
    if (result != NULL) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4084
      return result;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4085
    } else {
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4086
      // 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
  4087
      // object there.
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4088
      return old_attempt_allocation(word_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4089
    }
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4090
  } else {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4091
    assert(purpose ==  GCAllocForTenured, "sanity");
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4092
    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
  4093
    if (result != NULL) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4094
      return result;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4095
    } else {
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4096
      // 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
  4097
      // object there.
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4098
      return survivor_attempt_allocation(word_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4099
    }
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4100
  }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4101
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4102
  ShouldNotReachHere();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4103
  // 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
  4104
  return NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4105
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4106
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4107
#ifndef PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4108
bool GCLabBitMapClosure::do_bit(size_t offset) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4109
  HeapWord* addr = _bitmap->offsetToHeapWord(offset);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4110
  guarantee(_cm->isMarked(oop(addr)), "it should be!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4111
  return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4112
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4113
#endif // PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4114
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4115
G1ParGCAllocBuffer::G1ParGCAllocBuffer(size_t gclab_word_size) :
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4116
  ParGCAllocBuffer(gclab_word_size),
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4117
  _should_mark_objects(false),
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4118
  _bitmap(G1CollectedHeap::heap()->reserved_region().start(), gclab_word_size),
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4119
  _retired(false)
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4120
{
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4121
  //_should_mark_objects is set to true when G1ParCopyHelper needs to
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4122
  // mark the forwarded location of an evacuated object.
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4123
  // We set _should_mark_objects to true if marking is active, i.e. when we
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4124
  // need to propagate a mark, or during an initial mark pause, i.e. when we
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4125
  // need to mark objects immediately reachable by the roots.
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4126
  if (G1CollectedHeap::heap()->mark_in_progress() ||
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4127
      G1CollectedHeap::heap()->g1_policy()->during_initial_mark_pause()) {
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4128
    _should_mark_objects = true;
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4129
  }
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4130
}
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4131
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4132
G1ParScanThreadState::G1ParScanThreadState(G1CollectedHeap* g1h, int queue_num)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4133
  : _g1h(g1h),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4134
    _refs(g1h->task_queue(queue_num)),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4135
    _dcq(&g1h->dirty_card_queue_set()),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4136
    _ct_bs((CardTableModRefBS*)_g1h->barrier_set()),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4137
    _g1_rem(g1h->g1_rem_set()),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4138
    _hash_seed(17), _queue_num(queue_num),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4139
    _term_attempts(0),
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4140
    _surviving_alloc_buffer(g1h->desired_plab_sz(GCAllocForSurvived)),
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4141
    _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
  4142
    _age_table(false),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4143
    _strong_roots_time(0), _term_time(0),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4144
    _alloc_buffer_waste(0), _undo_waste(0)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4145
{
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4146
  // we allocate G1YoungSurvRateNumRegions plus one entries, since
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4147
  // 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
  4148
  // non-young regions (where the age is -1)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4149
  // 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
  4150
  // an attempt to eliminate cache contention
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4151
  size_t real_length = 1 + _g1h->g1_policy()->young_cset_length();
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4152
  size_t array_length = PADDING_ELEM_NUM +
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4153
                        real_length +
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4154
                        PADDING_ELEM_NUM;
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4155
  _surviving_young_words_base = NEW_C_HEAP_ARRAY(size_t, array_length);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4156
  if (_surviving_young_words_base == NULL)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4157
    vm_exit_out_of_memory(array_length * sizeof(size_t),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4158
                          "Not enough space for young surv histo.");
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4159
  _surviving_young_words = _surviving_young_words_base + PADDING_ELEM_NUM;
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4160
  memset(_surviving_young_words, 0, real_length * sizeof(size_t));
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4161
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4162
  _alloc_buffers[GCAllocForSurvived] = &_surviving_alloc_buffer;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4163
  _alloc_buffers[GCAllocForTenured]  = &_tenured_alloc_buffer;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4164
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4165
  _start = os::elapsedTime();
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4166
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4167
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4168
void
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4169
G1ParScanThreadState::print_termination_stats_hdr(outputStream* const st)
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4170
{
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4171
  st->print_raw_cr("GC Termination Stats");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4172
  st->print_raw_cr("     elapsed  --strong roots-- -------termination-------"
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4173
                   " ------waste (KiB)------");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4174
  st->print_raw_cr("thr     ms        ms      %        ms      %    attempts"
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4175
                   "  total   alloc    undo");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4176
  st->print_raw_cr("--- --------- --------- ------ --------- ------ --------"
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4177
                   " ------- ------- -------");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4178
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4179
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4180
void
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4181
G1ParScanThreadState::print_termination_stats(int i,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4182
                                              outputStream* const st) const
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4183
{
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4184
  const double elapsed_ms = elapsed_time() * 1000.0;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4185
  const double s_roots_ms = strong_roots_time() * 1000.0;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4186
  const double term_ms    = term_time() * 1000.0;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4187
  st->print_cr("%3d %9.2f %9.2f %6.2f "
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4188
               "%9.2f %6.2f " SIZE_FORMAT_W(8) " "
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4189
               SIZE_FORMAT_W(7) " " SIZE_FORMAT_W(7) " " SIZE_FORMAT_W(7),
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4190
               i, elapsed_ms, s_roots_ms, s_roots_ms * 100 / elapsed_ms,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4191
               term_ms, term_ms * 100 / elapsed_ms, term_attempts(),
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4192
               (alloc_buffer_waste() + undo_waste()) * HeapWordSize / K,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4193
               alloc_buffer_waste() * HeapWordSize / K,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4194
               undo_waste() * HeapWordSize / K);
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4195
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4196
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4197
#ifdef ASSERT
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4198
bool G1ParScanThreadState::verify_ref(narrowOop* ref) const {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4199
  assert(ref != NULL, "invariant");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4200
  assert(UseCompressedOops, "sanity");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4201
  assert(!has_partial_array_mask(ref), err_msg("ref=" PTR_FORMAT, ref));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4202
  oop p = oopDesc::load_decode_heap_oop(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4203
  assert(_g1h->is_in_g1_reserved(p),
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4204
         err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4205
  return true;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4206
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4207
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4208
bool G1ParScanThreadState::verify_ref(oop* ref) const {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4209
  assert(ref != NULL, "invariant");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4210
  if (has_partial_array_mask(ref)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4211
    // Must be in the collection set--it's already been copied.
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4212
    oop p = clear_partial_array_mask(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4213
    assert(_g1h->obj_in_cs(p),
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4214
           err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4215
  } else {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4216
    oop p = oopDesc::load_decode_heap_oop(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4217
    assert(_g1h->is_in_g1_reserved(p),
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4218
           err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4219
  }
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4220
  return true;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4221
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4222
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4223
bool G1ParScanThreadState::verify_task(StarTask ref) const {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4224
  if (ref.is_narrow()) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4225
    return verify_ref((narrowOop*) ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4226
  } else {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4227
    return verify_ref((oop*) ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4228
  }
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4229
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4230
#endif // ASSERT
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4231
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4232
void G1ParScanThreadState::trim_queue() {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4233
  assert(_evac_cl != NULL, "not set");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4234
  assert(_evac_failure_cl != NULL, "not set");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4235
  assert(_partial_scan_cl != NULL, "not set");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4236
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4237
  StarTask ref;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4238
  do {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4239
    // Drain the overflow stack first, so other threads can steal.
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4240
    while (refs()->pop_overflow(ref)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4241
      deal_with_reference(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4242
    }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4243
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4244
    while (refs()->pop_local(ref)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4245
      deal_with_reference(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4246
    }
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4247
  } while (!refs()->is_empty());
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4248
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4249
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4250
G1ParClosureSuper::G1ParClosureSuper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4251
  _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
  4252
  _par_scan_state(par_scan_state),
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4253
  _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
  4254
  _mark_in_progress(_g1->mark_in_progress()) { }
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4255
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4256
template <class T> void G1ParCopyHelper::mark_object(T* p) {
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4257
  // This is called from do_oop_work for objects that are not
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4258
  // in the collection set. Objects in the collection set
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4259
  // are marked after they have been evacuated.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4260
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4261
  T heap_oop = oopDesc::load_heap_oop(p);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4262
  if (!oopDesc::is_null(heap_oop)) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4263
    oop obj = oopDesc::decode_heap_oop(heap_oop);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4264
    HeapWord* addr = (HeapWord*)obj;
9424
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4265
    if (_g1->is_in_g1_reserved(addr)) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4266
      _cm->grayRoot(oop(addr));
9424
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4267
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4268
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4269
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4270
10664
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4271
oop G1ParCopyHelper::copy_to_survivor_space(oop old, bool should_mark_root,
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4272
                                                     bool should_mark_copy) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4273
  size_t    word_sz = old->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4274
  HeapRegion* from_region = _g1->heap_region_containing_raw(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4275
  // +1 to make the -1 indexes valid...
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4276
  int       young_index = from_region->young_index_in_cset()+1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4277
  assert( (from_region->is_young() && young_index > 0) ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4278
          (!from_region->is_young() && young_index == 0), "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4279
  G1CollectorPolicy* g1p = _g1->g1_policy();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4280
  markOop m = old->mark();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4281
  int age = m->has_displaced_mark_helper() ? m->displaced_mark_helper()->age()
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4282
                                           : m->age();
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4283
  GCAllocPurpose alloc_purpose = g1p->evacuation_destination(from_region, age,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4284
                                                             word_sz);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4285
  HeapWord* obj_ptr = _par_scan_state->allocate(alloc_purpose, word_sz);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4286
  oop       obj     = oop(obj_ptr);
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
  if (obj_ptr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4289
    // 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
  4290
    // installed a forwarding pointer.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4291
    OopsInHeapRegionClosure* cl = _par_scan_state->evac_failure_closure();
10664
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4292
    return _g1->handle_evacuation_failure_par(cl, old, should_mark_root);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4293
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4294
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4295
  // We're going to allocate linearly, so might as well prefetch ahead.
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4296
  Prefetch::write(obj_ptr, PrefetchCopyIntervalInBytes);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4297
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4298
  oop forward_ptr = old->forward_to_atomic(obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4299
  if (forward_ptr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4300
    Copy::aligned_disjoint_words((HeapWord*) old, obj_ptr, word_sz);
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4301
    if (g1p->track_object_age(alloc_purpose)) {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4302
      // We could simply do obj->incr_age(). However, this causes a
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4303
      // performance issue. obj->incr_age() will first check whether
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4304
      // the object has a displaced mark by checking its mark word;
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4305
      // getting the mark word from the new location of the object
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4306
      // stalls. So, given that we already have the mark word and we
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4307
      // are about to install it anyway, it's better to increase the
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4308
      // age on the mark word, when the object does not have a
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4309
      // displaced mark word. We're not expecting many objects to have
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4310
      // a displaced marked word, so that case is not optimized
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4311
      // further (it could be...) and we simply call obj->incr_age().
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4312
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4313
      if (m->has_displaced_mark_helper()) {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4314
        // in this case, we have to install the mark word first,
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4315
        // otherwise obj looks to be forwarded (the old mark word,
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4316
        // which contains the forward pointer, was copied)
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4317
        obj->set_mark(m);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4318
        obj->incr_age();
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4319
      } else {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4320
        m = m->incr_age();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4321
        obj->set_mark(m);
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4322
      }
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4323
      _par_scan_state->age_table()->add(obj, word_sz);
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4324
    } else {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4325
      obj->set_mark(m);
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4326
    }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4327
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4328
    // Mark the evacuated object or propagate "next" mark bit
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4329
    if (should_mark_copy) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4330
      if (!use_local_bitmaps ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4331
          !_par_scan_state->alloc_buffer(alloc_purpose)->mark(obj_ptr)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4332
        // if we couldn't mark it on the local bitmap (this happens when
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4333
        // the object was not allocated in the GCLab), we have to bite
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4334
        // the bullet and do the standard parallel mark
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4335
        _cm->markAndGrayObjectIfNecessary(obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4336
      }
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4337
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4338
      if (_g1->isMarkedNext(old)) {
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4339
        // Unmark the object's old location so that marking
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4340
        // doesn't think the old object is alive.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4341
        _cm->nextMarkBitMap()->parClear((HeapWord*)old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4342
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4343
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4344
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4345
    size_t* surv_young_words = _par_scan_state->surviving_young_words();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4346
    surv_young_words[young_index] += word_sz;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4347
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4348
    if (obj->is_objArray() && arrayOop(obj)->length() >= ParGCArrayScanChunk) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4349
      arrayOop(old)->set_length(0);
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4350
      oop* old_p = set_partial_array_mask(old);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4351
      _par_scan_state->push_on_queue(old_p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4352
    } else {
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4353
      // No point in using the slower heap_region_containing() method,
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4354
      // given that we know obj is in the heap.
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4355
      _scanner->set_region(_g1->heap_region_containing_raw(obj));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4356
      obj->oop_iterate_backwards(_scanner);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4357
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4358
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4359
    _par_scan_state->undo_allocation(alloc_purpose, obj_ptr, word_sz);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4360
    obj = forward_ptr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4361
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4362
  return obj;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4363
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4364
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4365
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
  4366
template <class T>
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4367
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
  4368
::do_oop_work(T* p) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4369
  oop obj = oopDesc::load_decode_heap_oop(p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4370
  assert(barrier != G1BarrierRS || obj != NULL,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4371
         "Precondition: G1BarrierRS implies obj is nonNull");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4372
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4373
  // Marking:
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4374
  // If the object is in the collection set, then the thread
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4375
  // that copies the object should mark, or propagate the
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4376
  // mark to, the evacuated object.
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4377
  // If the object is not in the collection set then we
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4378
  // should call the mark_object() method depending on the
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4379
  // value of the template parameter do_mark_object (which will
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4380
  // be true for root scanning closures during an initial mark
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4381
  // pause).
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4382
  // The mark_object() method first checks whether the object
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4383
  // is marked and, if not, attempts to mark the object.
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4384
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4385
  // 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
  4386
  if (_g1->in_cset_fast_test(obj)) {
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4387
    if (obj->is_forwarded()) {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4388
      oopDesc::encode_store_heap_oop(p, obj->forwardee());
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4389
      // If we are a root scanning closure during an initial
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4390
      // mark pause (i.e. do_mark_object will be true) then
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4391
      // we also need to handle marking of roots in the
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4392
      // event of an evacuation failure. In the event of an
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4393
      // evacuation failure, the object is forwarded to itself
10664
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4394
      // and not copied. For root-scanning closures, the
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4395
      // object would be marked after a successful self-forward
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4396
      // but an object could be pointed to by both a root and non
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4397
      // root location and be self-forwarded by a non-root-scanning
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4398
      // closure. Therefore we also have to attempt to mark the
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4399
      // self-forwarded root object here.
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4400
      if (do_mark_object && obj->forwardee() == obj) {
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4401
        mark_object(p);
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4402
      }
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4403
    } else {
10664
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4404
      // During an initial mark pause, objects that are pointed to
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4405
      // by the roots need to be marked - even in the event of an
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4406
      // evacuation failure. We pass the template parameter
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4407
      // do_mark_object (which is true for root scanning closures
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4408
      // during an initial mark pause) to copy_to_survivor_space
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4409
      // which will pass it on to the evacuation failure handling
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4410
      // code. The thread that successfully self-forwards a root
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4411
      // object to itself is responsible for marking the object.
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4412
      bool should_mark_root = do_mark_object;
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4413
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4414
      // We need to mark the copied object if we're a root scanning
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4415
      // closure during an initial mark pause (i.e. do_mark_object
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4416
      // will be true), or the object is already marked and we need
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4417
      // to propagate the mark to the evacuated copy.
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4418
      bool should_mark_copy = do_mark_object ||
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4419
                              _during_initial_mark ||
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4420
                              (_mark_in_progress && !_g1->is_obj_ill(obj));
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4421
10664
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4422
      oop copy_oop = copy_to_survivor_space(obj, should_mark_root,
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4423
                                                 should_mark_copy);
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4424
      oopDesc::encode_store_heap_oop(p, copy_oop);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4425
    }
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4426
    // When scanning the RS, we only care about objs in CS.
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4427
    if (barrier == G1BarrierRS) {
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4428
      _par_scan_state->update_rs(_from, p, _par_scan_state->queue_num());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4429
    }
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4430
  } else {
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4431
    // 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
  4432
    // 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
  4433
    // be true) then attempt to mark the object.
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4434
    if (do_mark_object) {
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4435
      mark_object(p);
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4436
    }
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4437
  }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4438
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4439
  if (barrier == G1BarrierEvac && obj != NULL) {
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4440
    _par_scan_state->update_rs(_from, p, _par_scan_state->queue_num());
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4441
  }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4442
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4443
  if (do_gen_barrier && obj != NULL) {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4444
    par_do_barrier(p);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4445
  }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4446
}
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4447
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4448
template void G1ParCopyClosure<false, G1BarrierEvac, false>::do_oop_work(oop* p);
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4449
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
  4450
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4451
template <class T> void G1ParScanPartialArrayClosure::do_oop_nv(T* p) {
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4452
  assert(has_partial_array_mask(p), "invariant");
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4453
  oop old = clear_partial_array_mask(p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4454
  assert(old->is_objArray(), "must be obj array");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4455
  assert(old->is_forwarded(), "must be forwarded");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4456
  assert(Universe::heap()->is_in_reserved(old), "must be in heap.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4457
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4458
  objArrayOop obj = objArrayOop(old->forwardee());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4459
  assert((void*)old != (void*)old->forwardee(), "self forwarding here?");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4460
  // Process ParGCArrayScanChunk elements now
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4461
  // and push the remainder back onto queue
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4462
  int start     = arrayOop(old)->length();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4463
  int end       = obj->length();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4464
  int remainder = end - start;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4465
  assert(start <= end, "just checking");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4466
  if (remainder > 2 * ParGCArrayScanChunk) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4467
    // Test above combines last partial chunk with a full chunk
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4468
    end = start + ParGCArrayScanChunk;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4469
    arrayOop(old)->set_length(end);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4470
    // Push remainder.
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4471
    oop* old_p = set_partial_array_mask(old);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4472
    assert(arrayOop(old)->length() < obj->length(), "Empty push?");
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4473
    _par_scan_state->push_on_queue(old_p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4474
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4475
    // Restore length so that the heap remains parsable in
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4476
    // case of evacuation failure.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4477
    arrayOop(old)->set_length(end);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4478
  }
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4479
  _scanner.set_region(_g1->heap_region_containing_raw(obj));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4480
  // process our set of indices (include header in first chunk)
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4481
  obj->oop_iterate_range(&_scanner, start, end);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4482
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4483
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4484
class G1ParEvacuateFollowersClosure : public VoidClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4485
protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4486
  G1CollectedHeap*              _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4487
  G1ParScanThreadState*         _par_scan_state;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4488
  RefToScanQueueSet*            _queues;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4489
  ParallelTaskTerminator*       _terminator;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4490
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4491
  G1ParScanThreadState*   par_scan_state() { return _par_scan_state; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4492
  RefToScanQueueSet*      queues()         { return _queues; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4493
  ParallelTaskTerminator* terminator()     { return _terminator; }
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
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4496
  G1ParEvacuateFollowersClosure(G1CollectedHeap* g1h,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4497
                                G1ParScanThreadState* par_scan_state,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4498
                                RefToScanQueueSet* queues,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4499
                                ParallelTaskTerminator* terminator)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4500
    : _g1h(g1h), _par_scan_state(par_scan_state),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4501
      _queues(queues), _terminator(terminator) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4502
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4503
  void do_void();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4504
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4505
private:
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4506
  inline bool offer_termination();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4507
};
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4508
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4509
bool G1ParEvacuateFollowersClosure::offer_termination() {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4510
  G1ParScanThreadState* const pss = par_scan_state();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4511
  pss->start_term_time();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4512
  const bool res = terminator()->offer_termination();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4513
  pss->end_term_time();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4514
  return res;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4515
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4516
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4517
void G1ParEvacuateFollowersClosure::do_void() {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4518
  StarTask stolen_task;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4519
  G1ParScanThreadState* const pss = par_scan_state();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4520
  pss->trim_queue();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4521
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4522
  do {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4523
    while (queues()->steal(pss->queue_num(), pss->hash_seed(), stolen_task)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4524
      assert(pss->verify_task(stolen_task), "sanity");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4525
      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
  4526
        pss->deal_with_reference((narrowOop*) stolen_task);
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4527
      } else {
6980
d19831e79825 6990359: G1: don't push a stolen entry on the taskqueue, deal with it directly
tonyp
parents: 6959
diff changeset
  4528
        pss->deal_with_reference((oop*) stolen_task);
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4529
      }
6980
d19831e79825 6990359: G1: don't push a stolen entry on the taskqueue, deal with it directly
tonyp
parents: 6959
diff changeset
  4530
d19831e79825 6990359: G1: don't push a stolen entry on the taskqueue, deal with it directly
tonyp
parents: 6959
diff changeset
  4531
      // 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
  4532
      // 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
  4533
      // we drain the queues as necessary.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4534
      pss->trim_queue();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4535
    }
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4536
  } while (!offer_termination());
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4537
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4538
  pss->retire_alloc_buffers();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4539
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4540
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4541
class G1ParTask : public AbstractGangTask {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4542
protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4543
  G1CollectedHeap*       _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4544
  RefToScanQueueSet      *_queues;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4545
  ParallelTaskTerminator _terminator;
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4546
  int _n_workers;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4547
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4548
  Mutex _stats_lock;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4549
  Mutex* stats_lock() { return &_stats_lock; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4550
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4551
  size_t getNCards() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4552
    return (_g1h->capacity() + G1BlockOffsetSharedArray::N_bytes - 1)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4553
      / G1BlockOffsetSharedArray::N_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4554
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4555
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4556
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4557
  G1ParTask(G1CollectedHeap* g1h, int workers, RefToScanQueueSet *task_queues)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4558
    : AbstractGangTask("G1 collection"),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4559
      _g1h(g1h),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4560
      _queues(task_queues),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4561
      _terminator(workers, _queues),
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4562
      _stats_lock(Mutex::leaf, "parallel G1 stats lock", true),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4563
      _n_workers(workers)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4564
  {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4565
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4566
  RefToScanQueueSet* queues() { return _queues; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4567
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4568
  RefToScanQueue *work_queue(int i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4569
    return queues()->queue(i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4570
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4571
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4572
  void work(int i) {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4573
    if (i >= _n_workers) return;  // no work needed this round
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4574
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4575
    double start_time_ms = os::elapsedTime() * 1000.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4576
    _g1h->g1_policy()->record_gc_worker_start_time(i, start_time_ms);
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4577
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4578
    ResourceMark rm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4579
    HandleMark   hm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4580
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4581
    ReferenceProcessor*             rp = _g1h->ref_processor_stw();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4582
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4583
    G1ParScanThreadState            pss(_g1h, i);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4584
    G1ParScanHeapEvacClosure        scan_evac_cl(_g1h, &pss, rp);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4585
    G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, rp);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4586
    G1ParScanPartialArrayClosure    partial_scan_cl(_g1h, &pss, rp);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4587
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4588
    pss.set_evac_closure(&scan_evac_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4589
    pss.set_evac_failure_closure(&evac_failure_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4590
    pss.set_partial_scan_closure(&partial_scan_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4591
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4592
    G1ParScanExtRootClosure        only_scan_root_cl(_g1h, &pss, rp);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4593
    G1ParScanPermClosure           only_scan_perm_cl(_g1h, &pss, rp);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4594
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4595
    G1ParScanAndMarkExtRootClosure scan_mark_root_cl(_g1h, &pss, rp);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4596
    G1ParScanAndMarkPermClosure    scan_mark_perm_cl(_g1h, &pss, rp);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4597
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4598
    OopClosure*                    scan_root_cl = &only_scan_root_cl;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4599
    OopsInHeapRegionClosure*       scan_perm_cl = &only_scan_perm_cl;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4600
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  4601
    if (_g1h->g1_policy()->during_initial_mark_pause()) {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4602
      // We also need to mark copied objects.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4603
      scan_root_cl = &scan_mark_root_cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4604
      scan_perm_cl = &scan_mark_perm_cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4605
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4606
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4607
    // The following closure is used to scan RSets looking for reference
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4608
    // fields that point into the collection set. The actual field iteration
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4609
    // is performed by a FilterIntoCSClosure, whose do_oop method calls the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4610
    // do_oop method of the following closure.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4611
    // Therefore we want to record the reference processor in the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4612
    // FilterIntoCSClosure. To do so we record the STW reference
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4613
    // processor into the following closure and pass it to the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4614
    // FilterIntoCSClosure in HeapRegionDCTOC::walk_mem_region_with_cl.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4615
    G1ParPushHeapRSClosure          push_heap_rs_cl(_g1h, &pss, rp);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4616
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4617
    pss.start_strong_roots();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4618
    _g1h->g1_process_strong_roots(/* not collecting perm */ false,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4619
                                  SharedHeap::SO_AllClasses,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4620
                                  scan_root_cl,
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4621
                                  &push_heap_rs_cl,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4622
                                  scan_perm_cl,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4623
                                  i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4624
    pss.end_strong_roots();
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  4625
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4626
    {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4627
      double start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4628
      G1ParEvacuateFollowersClosure evac(_g1h, &pss, _queues, &_terminator);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4629
      evac.do_void();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4630
      double elapsed_ms = (os::elapsedTime()-start)*1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4631
      double term_ms = pss.term_time()*1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4632
      _g1h->g1_policy()->record_obj_copy_time(i, elapsed_ms-term_ms);
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4633
      _g1h->g1_policy()->record_termination(i, term_ms, pss.term_attempts());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4634
    }
5033
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
  4635
    _g1h->g1_policy()->record_thread_age_table(pss.age_table());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4636
    _g1h->update_surviving_young_words(pss.surviving_young_words()+1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4637
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4638
    // Clean up any par-expanded rem sets.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4639
    HeapRegionRemSet::par_cleanup();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4640
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4641
    if (ParallelGCVerbose) {
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4642
      MutexLocker x(stats_lock());
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4643
      pss.print_termination_stats(i);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4644
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4645
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4646
    assert(pss.refs()->is_empty(), "should be empty");
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4647
    double end_time_ms = os::elapsedTime() * 1000.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4648
    _g1h->g1_policy()->record_gc_worker_end_time(i, end_time_ms);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4649
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4650
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4651
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4652
// *** Common G1 Evacuation Stuff
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4653
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  4654
// This method is run in a GC worker.
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  4655
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4656
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4657
G1CollectedHeap::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4658
g1_process_strong_roots(bool collecting_perm_gen,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4659
                        SharedHeap::ScanningOption so,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4660
                        OopClosure* scan_non_heap_roots,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4661
                        OopsInHeapRegionClosure* scan_rs,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4662
                        OopsInGenClosure* scan_perm,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4663
                        int worker_i) {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4664
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4665
  // First scan the strong roots, including the perm gen.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4666
  double ext_roots_start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4667
  double closure_app_time_sec = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4668
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4669
  BufferingOopClosure buf_scan_non_heap_roots(scan_non_heap_roots);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4670
  BufferingOopsInGenClosure buf_scan_perm(scan_perm);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4671
  buf_scan_perm.set_generation(perm_gen());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4672
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4673
  // Walk the code cache w/o buffering, because StarTask cannot handle
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4674
  // unaligned oop locations.
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4675
  CodeBlobToOopClosure eager_scan_code_roots(scan_non_heap_roots, /*do_marking=*/ true);
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4676
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4677
  process_strong_roots(false, // no scoping; this is parallel code
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4678
                       collecting_perm_gen, so,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4679
                       &buf_scan_non_heap_roots,
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4680
                       &eager_scan_code_roots,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4681
                       &buf_scan_perm);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4682
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4683
  // 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
  4684
  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
  4685
    // We need to treat the discovered reference lists of the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4686
    // concurrent mark ref processor as roots and keep entries
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4687
    // (which are added by the marking threads) on them live
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4688
    // until they can be processed at the end of marking.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4689
    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
  4690
  }
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  4691
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  4692
  // 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
  4693
  buf_scan_non_heap_roots.done();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4694
  buf_scan_perm.done();
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  4695
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4696
  double ext_roots_end = os::elapsedTime();
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  4697
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4698
  g1_policy()->reset_obj_copy_time(worker_i);
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  4699
  double obj_copy_time_sec = buf_scan_perm.closure_app_seconds() +
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  4700
                                buf_scan_non_heap_roots.closure_app_seconds();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4701
  g1_policy()->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
  4702
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4703
  double ext_root_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4704
    ((ext_roots_end - 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
  4705
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4706
  g1_policy()->record_ext_root_scan_time(worker_i, ext_root_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4707
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4708
  // Scan strong roots in mark stack.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4709
  if (!_process_strong_tasks->is_task_claimed(G1H_PS_mark_stack_oops_do)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4710
    concurrent_mark()->oops_do(scan_non_heap_roots);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4711
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4712
  double mark_stack_scan_ms = (os::elapsedTime() - ext_roots_end) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4713
  g1_policy()->record_mark_stack_scan_time(worker_i, mark_stack_scan_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4714
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4715
  // Now scan the complement of the collection set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4716
  if (scan_rs != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4717
    g1_rem_set()->oops_into_collection_set_do(scan_rs, worker_i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4718
  }
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  4719
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4720
  _process_strong_tasks->all_tasks_completed();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4721
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4722
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4723
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4724
G1CollectedHeap::g1_process_weak_roots(OopClosure* root_closure,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4725
                                       OopClosure* non_root_closure) {
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4726
  CodeBlobToOopClosure roots_in_blobs(root_closure, /*do_marking=*/ false);
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4727
  SharedHeap::process_weak_roots(root_closure, &roots_in_blobs, non_root_closure);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4728
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4729
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4730
// Weak Reference Processing support
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4731
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4732
// An always "is_alive" closure that is used to preserve referents.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4733
// 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
  4734
// of referent objects that are pointed to by reference objects
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4735
// discovered by the CM ref processor.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4736
class G1AlwaysAliveClosure: public BoolObjectClosure {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4737
  G1CollectedHeap* _g1;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4738
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4739
  G1AlwaysAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4740
  void do_object(oop p) { assert(false, "Do not call."); }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4741
  bool do_object_b(oop p) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4742
    if (p != NULL) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4743
      return true;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4744
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4745
    return false;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4746
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4747
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4748
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4749
bool G1STWIsAliveClosure::do_object_b(oop p) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4750
  // An object is reachable if it is outside the collection set,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4751
  // or is inside and copied.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4752
  return !_g1->obj_in_cs(p) || p->is_forwarded();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4753
}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4754
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4755
// Non Copying Keep Alive closure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4756
class G1KeepAliveClosure: public OopClosure {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4757
  G1CollectedHeap* _g1;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4758
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4759
  G1KeepAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4760
  void do_oop(narrowOop* p) { guarantee(false, "Not needed"); }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4761
  void do_oop(      oop* p) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4762
    oop obj = *p;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4763
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4764
    if (_g1->obj_in_cs(obj)) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4765
      assert( obj->is_forwarded(), "invariant" );
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4766
      *p = obj->forwardee();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4767
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4768
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4769
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4770
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4771
// Copying Keep Alive closure - can be called from both
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4772
// serial and parallel code as long as different worker
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4773
// threads utilize different G1ParScanThreadState instances
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4774
// and different queues.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4775
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4776
class G1CopyingKeepAliveClosure: public OopClosure {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4777
  G1CollectedHeap*         _g1h;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4778
  OopClosure*              _copy_non_heap_obj_cl;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4779
  OopsInHeapRegionClosure* _copy_perm_obj_cl;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4780
  G1ParScanThreadState*    _par_scan_state;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4781
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4782
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4783
  G1CopyingKeepAliveClosure(G1CollectedHeap* g1h,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4784
                            OopClosure* non_heap_obj_cl,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4785
                            OopsInHeapRegionClosure* perm_obj_cl,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4786
                            G1ParScanThreadState* pss):
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4787
    _g1h(g1h),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4788
    _copy_non_heap_obj_cl(non_heap_obj_cl),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4789
    _copy_perm_obj_cl(perm_obj_cl),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4790
    _par_scan_state(pss)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4791
  {}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4792
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4793
  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4794
  virtual void do_oop(      oop* p) { do_oop_work(p); }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4795
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4796
  template <class T> void do_oop_work(T* p) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4797
    oop obj = oopDesc::load_decode_heap_oop(p);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4798
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4799
    if (_g1h->obj_in_cs(obj)) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4800
      // If the referent object has been forwarded (either copied
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4801
      // 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
  4802
      // evacuation failure) then we need to update the reference
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4803
      // field and, if both reference and referent are in the G1
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4804
      // heap, update the RSet for the referent.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4805
      //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4806
      // 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
  4807
      // it alive by policy. Therefore we have copy the referent.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4808
      //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4809
      // 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
  4810
      // on the PSS queue. When the queue is drained (after each
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4811
      // phase of reference processing) the object and it's followers
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4812
      // will be copied, the reference field set to point to the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4813
      // new location, and the RSet updated. Otherwise we need to
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4814
      // use the the non-heap or perm closures directly to copy
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4815
      // the refernt object and update the pointer, while avoiding
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4816
      // updating the RSet.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4817
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4818
      if (_g1h->is_in_g1_reserved(p)) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4819
        _par_scan_state->push_on_queue(p);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4820
      } else {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4821
        // The reference field is not in the G1 heap.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4822
        if (_g1h->perm_gen()->is_in(p)) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4823
          _copy_perm_obj_cl->do_oop(p);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4824
        } else {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4825
          _copy_non_heap_obj_cl->do_oop(p);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4826
        }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4827
      }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4828
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4829
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4830
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4831
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4832
// Serial drain queue closure. Called as the 'complete_gc'
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4833
// closure for each discovered list in some of the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4834
// reference processing phases.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4835
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4836
class G1STWDrainQueueClosure: public VoidClosure {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4837
protected:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4838
  G1CollectedHeap* _g1h;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4839
  G1ParScanThreadState* _par_scan_state;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4840
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4841
  G1ParScanThreadState*   par_scan_state() { return _par_scan_state; }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4842
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4843
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4844
  G1STWDrainQueueClosure(G1CollectedHeap* g1h, G1ParScanThreadState* pss) :
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4845
    _g1h(g1h),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4846
    _par_scan_state(pss)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4847
  { }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4848
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4849
  void do_void() {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4850
    G1ParScanThreadState* const pss = par_scan_state();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4851
    pss->trim_queue();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4852
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4853
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4854
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4855
// Parallel Reference Processing closures
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4856
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4857
// Implementation of AbstractRefProcTaskExecutor for parallel reference
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4858
// processing during G1 evacuation pauses.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4859
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4860
class G1STWRefProcTaskExecutor: public AbstractRefProcTaskExecutor {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4861
private:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4862
  G1CollectedHeap*   _g1h;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4863
  RefToScanQueueSet* _queues;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4864
  WorkGang*          _workers;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4865
  int                _active_workers;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4866
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4867
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4868
  G1STWRefProcTaskExecutor(G1CollectedHeap* g1h,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4869
                        WorkGang* workers,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4870
                        RefToScanQueueSet *task_queues,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4871
                        int n_workers) :
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4872
    _g1h(g1h),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4873
    _queues(task_queues),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4874
    _workers(workers),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4875
    _active_workers(n_workers)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4876
  {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4877
    assert(n_workers > 0, "shouldn't call this otherwise");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4878
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4879
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4880
  // Executes the given task using concurrent marking worker threads.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4881
  virtual void execute(ProcessTask& task);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4882
  virtual void execute(EnqueueTask& task);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4883
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4884
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4885
// Gang task for possibly parallel reference processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4886
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4887
class G1STWRefProcTaskProxy: public AbstractGangTask {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4888
  typedef AbstractRefProcTaskExecutor::ProcessTask ProcessTask;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4889
  ProcessTask&     _proc_task;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4890
  G1CollectedHeap* _g1h;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4891
  RefToScanQueueSet *_task_queues;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4892
  ParallelTaskTerminator* _terminator;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4893
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4894
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4895
  G1STWRefProcTaskProxy(ProcessTask& proc_task,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4896
                     G1CollectedHeap* g1h,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4897
                     RefToScanQueueSet *task_queues,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4898
                     ParallelTaskTerminator* terminator) :
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4899
    AbstractGangTask("Process reference objects in parallel"),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4900
    _proc_task(proc_task),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4901
    _g1h(g1h),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4902
    _task_queues(task_queues),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4903
    _terminator(terminator)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4904
  {}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4905
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4906
  virtual void work(int i) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4907
    // The reference processing task executed by a single worker.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4908
    ResourceMark rm;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4909
    HandleMark   hm;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4910
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4911
    G1STWIsAliveClosure is_alive(_g1h);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4912
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4913
    G1ParScanThreadState pss(_g1h, i);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4914
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4915
    G1ParScanHeapEvacClosure        scan_evac_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4916
    G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4917
    G1ParScanPartialArrayClosure    partial_scan_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4918
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4919
    pss.set_evac_closure(&scan_evac_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4920
    pss.set_evac_failure_closure(&evac_failure_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4921
    pss.set_partial_scan_closure(&partial_scan_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4922
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4923
    G1ParScanExtRootClosure        only_copy_non_heap_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4924
    G1ParScanPermClosure           only_copy_perm_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4925
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4926
    G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4927
    G1ParScanAndMarkPermClosure    copy_mark_perm_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4928
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4929
    OopClosure*                    copy_non_heap_cl = &only_copy_non_heap_cl;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4930
    OopsInHeapRegionClosure*       copy_perm_cl = &only_copy_perm_cl;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4931
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4932
    if (_g1h->g1_policy()->during_initial_mark_pause()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4933
      // We also need to mark copied objects.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4934
      copy_non_heap_cl = &copy_mark_non_heap_cl;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4935
      copy_perm_cl = &copy_mark_perm_cl;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4936
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4937
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4938
    // Keep alive closure.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4939
    G1CopyingKeepAliveClosure keep_alive(_g1h, copy_non_heap_cl, copy_perm_cl, &pss);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4940
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4941
    // Complete GC closure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4942
    G1ParEvacuateFollowersClosure drain_queue(_g1h, &pss, _task_queues, _terminator);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4943
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4944
    // Call the reference processing task's work routine.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4945
    _proc_task.work(i, is_alive, keep_alive, drain_queue);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4946
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4947
    // 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
  4948
    // of the processing tasks (specifically phase2 - pp2_work) execute
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4949
    // the complete_gc closure (which ordinarily would drain the queue) so
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4950
    // the queue may not be empty.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4951
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4952
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4953
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4954
// Driver routine for parallel reference processing.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4955
// Creates an instance of the ref processing gang
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4956
// task and has the worker threads execute it.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4957
void G1STWRefProcTaskExecutor::execute(ProcessTask& proc_task) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4958
  assert(_workers != NULL, "Need parallel worker threads.");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4959
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4960
  ParallelTaskTerminator terminator(_active_workers, _queues);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4961
  G1STWRefProcTaskProxy proc_task_proxy(proc_task, _g1h, _queues, &terminator);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4962
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4963
  _g1h->set_par_threads(_active_workers);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4964
  _workers->run_task(&proc_task_proxy);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4965
  _g1h->set_par_threads(0);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4966
}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4967
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4968
// Gang task for parallel reference enqueueing.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4969
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4970
class G1STWRefEnqueueTaskProxy: public AbstractGangTask {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4971
  typedef AbstractRefProcTaskExecutor::EnqueueTask EnqueueTask;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4972
  EnqueueTask& _enq_task;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4973
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4974
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4975
  G1STWRefEnqueueTaskProxy(EnqueueTask& enq_task) :
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4976
    AbstractGangTask("Enqueue reference objects in parallel"),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4977
    _enq_task(enq_task)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4978
  { }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4979
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4980
  virtual void work(int i) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4981
    _enq_task.work(i);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4982
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4983
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4984
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4985
// Driver routine for parallel reference enqueing.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4986
// Creates an instance of the ref enqueueing gang
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4987
// task and has the worker threads execute it.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4988
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4989
void G1STWRefProcTaskExecutor::execute(EnqueueTask& enq_task) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4990
  assert(_workers != NULL, "Need parallel worker threads.");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4991
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4992
  G1STWRefEnqueueTaskProxy enq_task_proxy(enq_task);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4993
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4994
  _g1h->set_par_threads(_active_workers);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4995
  _workers->run_task(&enq_task_proxy);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4996
  _g1h->set_par_threads(0);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4997
}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4998
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4999
// End of weak reference support closures
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5000
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5001
// Abstract task used to preserve (i.e. copy) any referent objects
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5002
// 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
  5003
// objects discovered by the CM ref processor.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5004
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5005
class G1ParPreserveCMReferentsTask: public AbstractGangTask {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5006
protected:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5007
  G1CollectedHeap* _g1h;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5008
  RefToScanQueueSet      *_queues;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5009
  ParallelTaskTerminator _terminator;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5010
  int _n_workers;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5011
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5012
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5013
  G1ParPreserveCMReferentsTask(G1CollectedHeap* g1h,int workers, RefToScanQueueSet *task_queues) :
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5014
    AbstractGangTask("ParPreserveCMReferents"),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5015
    _g1h(g1h),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5016
    _queues(task_queues),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5017
    _terminator(workers, _queues),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5018
    _n_workers(workers)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5019
  { }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5020
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5021
  void work(int i) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5022
    ResourceMark rm;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5023
    HandleMark   hm;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5024
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5025
    G1ParScanThreadState            pss(_g1h, i);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5026
    G1ParScanHeapEvacClosure        scan_evac_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5027
    G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5028
    G1ParScanPartialArrayClosure    partial_scan_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5029
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5030
    pss.set_evac_closure(&scan_evac_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5031
    pss.set_evac_failure_closure(&evac_failure_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5032
    pss.set_partial_scan_closure(&partial_scan_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5033
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5034
    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
  5035
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5036
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5037
    G1ParScanExtRootClosure        only_copy_non_heap_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5038
    G1ParScanPermClosure           only_copy_perm_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5039
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5040
    G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5041
    G1ParScanAndMarkPermClosure    copy_mark_perm_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5042
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5043
    OopClosure*                    copy_non_heap_cl = &only_copy_non_heap_cl;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5044
    OopsInHeapRegionClosure*       copy_perm_cl = &only_copy_perm_cl;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5045
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5046
    if (_g1h->g1_policy()->during_initial_mark_pause()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5047
      // We also need to mark copied objects.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5048
      copy_non_heap_cl = &copy_mark_non_heap_cl;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5049
      copy_perm_cl = &copy_mark_perm_cl;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5050
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5051
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5052
    // Is alive closure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5053
    G1AlwaysAliveClosure always_alive(_g1h);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5054
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5055
    // Copying keep alive closure. Applied to referent objects that need
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5056
    // to be copied.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5057
    G1CopyingKeepAliveClosure keep_alive(_g1h, copy_non_heap_cl, copy_perm_cl, &pss);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5058
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5059
    ReferenceProcessor* rp = _g1h->ref_processor_cm();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5060
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5061
    int limit = ReferenceProcessor::number_of_subclasses_of_ref() * rp->max_num_q();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5062
    int stride = MIN2(MAX2(_n_workers, 1), limit);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5063
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5064
    // 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
  5065
    // 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
  5066
    // change the worker ids.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5067
    assert(0 <= i && i < limit, "sanity");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5068
    assert(!rp->discovery_is_atomic(), "check this code");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5069
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5070
    // Select discovered lists [i, i+stride, i+2*stride,...,limit)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5071
    for (int idx = i; idx < limit; idx += stride) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5072
      DiscoveredList& ref_list = rp->discovered_soft_refs()[idx];
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5073
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5074
      DiscoveredListIterator iter(ref_list, &keep_alive, &always_alive);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5075
      while (iter.has_next()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5076
        // Since discovery is not atomic for the CM ref processor, we
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5077
        // can see some null referent objects.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5078
        iter.load_ptrs(DEBUG_ONLY(true));
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5079
        oop ref = iter.obj();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5080
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5081
        // This will filter nulls.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5082
        if (iter.is_referent_alive()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5083
          iter.make_referent_alive();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5084
        }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5085
        iter.move_to_next();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5086
      }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5087
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5088
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5089
    // Drain the queue - which may cause stealing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5090
    G1ParEvacuateFollowersClosure drain_queue(_g1h, &pss, _queues, &_terminator);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5091
    drain_queue.do_void();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5092
    // Allocation buffers were retired at the end of G1ParEvacuateFollowersClosure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5093
    assert(pss.refs()->is_empty(), "should be");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5094
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5095
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5096
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5097
// Weak Reference processing during an evacuation pause (part 1).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5098
void G1CollectedHeap::process_discovered_references() {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5099
  double ref_proc_start = os::elapsedTime();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5100
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5101
  ReferenceProcessor* rp = _ref_processor_stw;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5102
  assert(rp->discovery_enabled(), "should have been enabled");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5103
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5104
  // Any reference objects, in the collection set, that were 'discovered'
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5105
  // 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
  5106
  // applying the external root copy closure to the discovered lists, or
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5107
  // by following an RSet entry).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5108
  //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5109
  // 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
  5110
  // 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
  5111
  // processor would have seen that the reference object had already
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5112
  // been 'discovered' and would have skipped discovering the reference,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5113
  // but would not have treated the reference object as a regular oop.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5114
  // As a reult the copy closure would not have been applied to the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5115
  // referent object.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5116
  //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5117
  // We need to explicitly copy these referent objects - the references
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5118
  // will be processed at the end of remarking.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5119
  //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5120
  // 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
  5121
  // 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
  5122
  // referents points to another object which is also referenced by an
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5123
  // object discovered by the STW ref processor.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5124
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5125
  int n_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5126
                        workers()->total_workers() : 1);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5127
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5128
  set_par_threads(n_workers);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5129
  G1ParPreserveCMReferentsTask keep_cm_referents(this, n_workers, _task_queues);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5130
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5131
  if (G1CollectedHeap::use_parallel_gc_threads()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5132
    workers()->run_task(&keep_cm_referents);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5133
  } else {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5134
    keep_cm_referents.work(0);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5135
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5136
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5137
  set_par_threads(0);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5138
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5139
  // Closure to test whether a referent is alive.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5140
  G1STWIsAliveClosure is_alive(this);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5141
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5142
  // Even when parallel reference processing is enabled, the processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5143
  // 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
  5144
  // 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
  5145
  // JNI refs.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5146
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5147
  // Use only a single queue for this PSS.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5148
  G1ParScanThreadState pss(this, 0);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5149
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5150
  // We do not embed a reference processor in the copying/scanning
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5151
  // closures while we're actually processing the discovered
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5152
  // reference objects.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5153
  G1ParScanHeapEvacClosure        scan_evac_cl(this, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5154
  G1ParScanHeapEvacFailureClosure evac_failure_cl(this, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5155
  G1ParScanPartialArrayClosure    partial_scan_cl(this, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5156
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5157
  pss.set_evac_closure(&scan_evac_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5158
  pss.set_evac_failure_closure(&evac_failure_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5159
  pss.set_partial_scan_closure(&partial_scan_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5160
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5161
  assert(pss.refs()->is_empty(), "pre-condition");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5162
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5163
  G1ParScanExtRootClosure        only_copy_non_heap_cl(this, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5164
  G1ParScanPermClosure           only_copy_perm_cl(this, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5165
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5166
  G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(this, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5167
  G1ParScanAndMarkPermClosure    copy_mark_perm_cl(this, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5168
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5169
  OopClosure*                    copy_non_heap_cl = &only_copy_non_heap_cl;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5170
  OopsInHeapRegionClosure*       copy_perm_cl = &only_copy_perm_cl;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5171
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5172
  if (_g1h->g1_policy()->during_initial_mark_pause()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5173
    // We also need to mark copied objects.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5174
    copy_non_heap_cl = &copy_mark_non_heap_cl;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5175
    copy_perm_cl = &copy_mark_perm_cl;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5176
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5177
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5178
  // Keep alive closure.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5179
  G1CopyingKeepAliveClosure keep_alive(this, copy_non_heap_cl, copy_perm_cl, &pss);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5180
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5181
  // Serial Complete GC closure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5182
  G1STWDrainQueueClosure drain_queue(this, &pss);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5183
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5184
  // Setup the soft refs policy...
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5185
  rp->setup_policy(false);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5186
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5187
  if (!rp->processing_is_mt()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5188
    // Serial reference processing...
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5189
    rp->process_discovered_references(&is_alive,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5190
                                      &keep_alive,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5191
                                      &drain_queue,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5192
                                      NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5193
  } else {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5194
    // Parallel reference processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5195
    int active_workers = (ParallelGCThreads > 0 ? workers()->total_workers() : 1);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5196
    assert(rp->num_q() == active_workers, "sanity");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5197
    assert(active_workers <= rp->max_num_q(), "sanity");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5198
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5199
    G1STWRefProcTaskExecutor par_task_executor(this, workers(), _task_queues, active_workers);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5200
    rp->process_discovered_references(&is_alive, &keep_alive, &drain_queue, &par_task_executor);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5201
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5202
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5203
  // We have completed copying any necessary live referent objects
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5204
  // (that were not copied during the actual pause) so we can
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5205
  // retire any active alloc buffers
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5206
  pss.retire_alloc_buffers();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5207
  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
  5208
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5209
  double ref_proc_time = os::elapsedTime() - ref_proc_start;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5210
  g1_policy()->record_ref_proc_time(ref_proc_time * 1000.0);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5211
}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5212
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5213
// Weak Reference processing during an evacuation pause (part 2).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5214
void G1CollectedHeap::enqueue_discovered_references() {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5215
  double ref_enq_start = os::elapsedTime();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5216
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5217
  ReferenceProcessor* rp = _ref_processor_stw;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5218
  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
  5219
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5220
  // Now enqueue any remaining on the discovered lists on to
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5221
  // the pending list.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5222
  if (!rp->processing_is_mt()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5223
    // Serial reference processing...
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5224
    rp->enqueue_discovered_references();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5225
  } else {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5226
    // Parallel reference enqueuing
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
    int active_workers = (ParallelGCThreads > 0 ? workers()->total_workers() : 1);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5229
    assert(rp->num_q() == active_workers, "sanity");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5230
    assert(active_workers <= rp->max_num_q(), "sanity");
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
    G1STWRefProcTaskExecutor par_task_executor(this, workers(), _task_queues, active_workers);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5233
    rp->enqueue_discovered_references(&par_task_executor);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5234
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5235
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5236
  rp->verify_no_references_recorded();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5237
  assert(!rp->discovery_enabled(), "should have been disabled");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5238
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5239
  // FIXME
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5240
  // 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
  5241
  // Should we do that here also? We could, but it is a serial operation
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5242
  // and could signicantly increase the pause time.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5243
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5244
  double ref_enq_time = os::elapsedTime() - ref_enq_start;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5245
  g1_policy()->record_ref_enq_time(ref_enq_time * 1000.0);
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
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5248
void G1CollectedHeap::evacuate_collection_set() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5249
  set_evacuation_failed(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5250
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5251
  g1_rem_set()->prepare_for_oops_into_collection_set_do();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5252
  concurrent_g1_refine()->set_use_cache(false);
3589
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  5253
  concurrent_g1_refine()->clear_hot_cache_claimed_index();
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  5254
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5255
  int n_workers = (ParallelGCThreads > 0 ? workers()->total_workers() : 1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5256
  set_par_threads(n_workers);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5257
  G1ParTask g1_par_task(this, n_workers, _task_queues);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5258
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5259
  init_for_evac_failure(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5260
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5261
  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
  5262
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5263
  assert(dirty_card_queue_set().completed_buffers_num() == 0, "Should be empty");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5264
  double start_par = os::elapsedTime();
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5265
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  5266
  if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5267
    // The individual threads will set their evac-failure closures.
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  5268
    StrongRootsScope srs(this);
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  5269
    if (ParallelGCVerbose) G1ParScanThreadState::print_termination_stats_hdr();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5270
    workers()->run_task(&g1_par_task);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5271
  } else {
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  5272
    StrongRootsScope srs(this);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5273
    g1_par_task.work(0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5274
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5275
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5276
  double par_time = (os::elapsedTime() - start_par) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5277
  g1_policy()->record_par_time(par_time);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5278
  set_par_threads(0);
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  5279
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5280
  // Process any discovered reference objects - we have
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5281
  // to do this _before_ we retire the GC alloc regions
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5282
  // as we may have to copy some 'reachable' referent
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5283
  // objects (and their reachable sub-graphs) that were
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5284
  // not copied during the pause.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5285
  process_discovered_references();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5286
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  5287
  // Weak root processing.
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  5288
  // Note: when JSR 292 is enabled and code blobs can contain
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  5289
  // non-perm oops then we will need to process the code blobs
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  5290
  // here too.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5291
  {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5292
    G1STWIsAliveClosure is_alive(this);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5293
    G1KeepAliveClosure keep_alive(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5294
    JNIHandles::weak_oops_do(&is_alive, &keep_alive);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5295
  }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5296
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5297
  release_gc_alloc_regions();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5298
  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
  5299
3589
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  5300
  concurrent_g1_refine()->clear_hot_cache();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5301
  concurrent_g1_refine()->set_use_cache(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5302
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5303
  finalize_for_evac_failure();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5304
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5305
  // Must do this before removing self-forwarding pointers, which clears
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5306
  // the per-region evac-failure flags.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5307
  concurrent_mark()->complete_marking_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5308
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5309
  if (evacuation_failed()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5310
    remove_self_forwarding_pointers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5311
    if (PrintGCDetails) {
6261
1fe3e07abdb4 6975964: G1: print out a more descriptive message for evacuation failure when +PrintGCDetails is set
tonyp
parents: 6260
diff changeset
  5312
      gclog_or_tty->print(" (to-space overflow)");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5313
    } else if (PrintGC) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5314
      gclog_or_tty->print("--");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5315
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5316
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5317
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5318
  // Enqueue any remaining references remaining on the STW
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5319
  // reference processor's discovered lists. We need to do
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5320
  // this after the card table is cleaned (and verified) as
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5321
  // the act of enqueuing entries on to the pending list
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5322
  // will log these updates (and dirty their associated
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5323
  // cards). We need these updates logged to update any
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5324
  // RSets.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5325
  enqueue_discovered_references();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5326
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5327
  if (G1DeferredRSUpdate) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5328
    RedirtyLoggedCardTableEntryFastClosure redirty;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5329
    dirty_card_queue_set().set_closure(&redirty);
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5330
    dirty_card_queue_set().apply_closure_to_all_completed_buffers();
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  5331
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  5332
    DirtyCardQueueSet& dcq = JavaThread::dirty_card_queue_set();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  5333
    dcq.merge_bufferlists(&dirty_card_queue_set());
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5334
    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
  5335
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5336
  COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5337
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5338
8072
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7923
diff changeset
  5339
void G1CollectedHeap::free_region_if_empty(HeapRegion* hr,
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5340
                                     size_t* pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5341
                                     FreeRegionList* free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5342
                                     HumongousRegionSet* humongous_proxy_set,
8072
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7923
diff changeset
  5343
                                     HRRSCleanupTask* hrrs_cleanup_task,
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5344
                                     bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5345
  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
  5346
    if (hr->isHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5347
      assert(hr->startsHumongous(), "we should only see starts humongous");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5348
      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
  5349
    } else {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5350
      free_region(hr, pre_used, free_list, par);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5351
    }
8072
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7923
diff changeset
  5352
  } else {
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7923
diff changeset
  5353
    hr->rem_set()->do_cleanup_work(hrrs_cleanup_task);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5354
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5355
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5356
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5357
void G1CollectedHeap::free_region(HeapRegion* hr,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5358
                                  size_t* pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5359
                                  FreeRegionList* free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5360
                                  bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5361
  assert(!hr->isHumongous(), "this is only for non-humongous regions");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5362
  assert(!hr->is_empty(), "the region should not be empty");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5363
  assert(free_list != NULL, "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5364
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5365
  *pre_used += hr->used();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5366
  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
  5367
  free_list->add_as_head(hr);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5368
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5369
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5370
void G1CollectedHeap::free_humongous_region(HeapRegion* hr,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5371
                                     size_t* pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5372
                                     FreeRegionList* free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5373
                                     HumongousRegionSet* humongous_proxy_set,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5374
                                     bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5375
  assert(hr->startsHumongous(), "this is only for starts humongous regions");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5376
  assert(free_list != NULL, "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5377
  assert(humongous_proxy_set != NULL, "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5378
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5379
  size_t hr_used = hr->used();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5380
  size_t hr_capacity = hr->capacity();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5381
  size_t hr_pre_used = 0;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5382
  _humongous_set.remove_with_proxy(hr, humongous_proxy_set);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5383
  hr->set_notHumongous();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5384
  free_region(hr, &hr_pre_used, free_list, par);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5385
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  5386
  size_t i = hr->hrs_index() + 1;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5387
  size_t num = 1;
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  5388
  while (i < n_regions()) {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  5389
    HeapRegion* curr_hr = region_at(i);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5390
    if (!curr_hr->continuesHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5391
      break;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5392
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5393
    curr_hr->set_notHumongous();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5394
    free_region(curr_hr, &hr_pre_used, free_list, par);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5395
    num += 1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5396
    i += 1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5397
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5398
  assert(hr_pre_used == hr_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5399
         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
  5400
                 "should be the same", hr_pre_used, hr_used));
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5401
  *pre_used += hr_pre_used;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5402
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5403
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5404
void G1CollectedHeap::update_sets_after_freeing_regions(size_t pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5405
                                       FreeRegionList* free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5406
                                       HumongousRegionSet* humongous_proxy_set,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5407
                                       bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5408
  if (pre_used > 0) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5409
    Mutex* lock = (par) ? ParGCRareEvent_lock : NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5410
    MutexLockerEx x(lock, Mutex::_no_safepoint_check_flag);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5411
    assert(_summary_bytes_used >= pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5412
           err_msg("invariant: _summary_bytes_used: "SIZE_FORMAT" "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5413
                   "should be >= pre_used: "SIZE_FORMAT,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5414
                   _summary_bytes_used, pre_used));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5415
    _summary_bytes_used -= pre_used;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5416
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5417
  if (free_list != NULL && !free_list->is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5418
    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
  5419
    _free_list.add_as_head(free_list);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5420
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5421
  if (humongous_proxy_set != NULL && !humongous_proxy_set->is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5422
    MutexLockerEx x(OldSets_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5423
    _humongous_set.update_from_proxy(humongous_proxy_set);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5424
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5425
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5426
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5427
class G1ParCleanupCTTask : public AbstractGangTask {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5428
  CardTableModRefBS* _ct_bs;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5429
  G1CollectedHeap* _g1h;
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5430
  HeapRegion* volatile _su_head;
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5431
public:
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5432
  G1ParCleanupCTTask(CardTableModRefBS* ct_bs,
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5433
                     G1CollectedHeap* g1h) :
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5434
    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
  5435
    _ct_bs(ct_bs), _g1h(g1h) { }
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5436
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5437
  void work(int i) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5438
    HeapRegion* r;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5439
    while (r = _g1h->pop_dirty_cards_region()) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5440
      clear_cards(r);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5441
    }
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5442
  }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5443
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5444
  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
  5445
    // 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
  5446
    if (!r->is_survivor()) {
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5447
      _ct_bs->clear(MemRegion(r->bottom(), r->end()));
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5448
    }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5449
  }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5450
};
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5451
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5452
#ifndef PRODUCT
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5453
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
  5454
  G1CollectedHeap* _g1h;
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5455
  CardTableModRefBS* _ct_bs;
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5456
public:
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5457
  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
  5458
    : _g1h(g1h), _ct_bs(ct_bs) { }
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5459
  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
  5460
    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
  5461
      _g1h->verify_dirty_region(r);
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5462
    } else {
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5463
      _g1h->verify_not_dirty_region(r);
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5464
    }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5465
    return false;
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5466
  }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5467
};
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5468
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5469
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
  5470
  // 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
  5471
  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
  5472
  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
  5473
  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
  5474
}
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5475
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5476
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
  5477
  // 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
  5478
  // 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
  5479
  // 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
  5480
  // 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
  5481
  // 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
  5482
  // 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
  5483
  // is dirty.
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5484
  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
  5485
  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
  5486
  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
  5487
}
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5488
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5489
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
  5490
  CardTableModRefBS* ct_bs = (CardTableModRefBS*) barrier_set();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5491
  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
  5492
    verify_dirty_region(hr);
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5493
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5494
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5495
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5496
void G1CollectedHeap::verify_dirty_young_regions() {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5497
  verify_dirty_young_list(_young_list->first_region());
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5498
  verify_dirty_young_list(_young_list->first_survivor_region());
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5499
}
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5500
#endif
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5501
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5502
void G1CollectedHeap::cleanUpCardTable() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5503
  CardTableModRefBS* ct_bs = (CardTableModRefBS*) (barrier_set());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5504
  double start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5505
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5506
  // Iterate over the dirty cards region list.
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5507
  G1ParCleanupCTTask cleanup_task(ct_bs, this);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5508
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5509
  if (ParallelGCThreads > 0) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5510
    set_par_threads(workers()->total_workers());
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5511
    workers()->run_task(&cleanup_task);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5512
    set_par_threads(0);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5513
  } else {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5514
    while (_dirty_cards_region_list) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5515
      HeapRegion* r = _dirty_cards_region_list;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5516
      cleanup_task.clear_cards(r);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5517
      _dirty_cards_region_list = r->get_next_dirty_cards_region();
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5518
      if (_dirty_cards_region_list == r) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5519
        // The last region.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5520
        _dirty_cards_region_list = NULL;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5521
      }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5522
      r->set_next_dirty_cards_region(NULL);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5523
    }
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5524
  }
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5525
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5526
  double elapsed = os::elapsedTime() - start;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5527
  g1_policy()->record_clear_ct_time(elapsed * 1000.0);
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5528
#ifndef PRODUCT
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5529
  if (G1VerifyCTCleanup || VerifyAfterGC) {
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5530
    G1VerifyCardTableCleanup cleanup_verifier(this, ct_bs);
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5531
    heap_region_iterate(&cleanup_verifier);
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5532
  }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5533
#endif
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5534
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5535
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5536
void G1CollectedHeap::free_collection_set(HeapRegion* cs_head) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5537
  size_t pre_used = 0;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5538
  FreeRegionList local_free_list("Local List for CSet Freeing");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5539
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5540
  double young_time_ms     = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5541
  double non_young_time_ms = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5542
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5543
  // 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
  5544
  // 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
  5545
  // 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
  5546
  _young_list->clear();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5547
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5548
  G1CollectorPolicy* policy = g1_policy();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5549
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5550
  double start_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5551
  bool non_young = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5552
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5553
  HeapRegion* cur = cs_head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5554
  int age_bound = -1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5555
  size_t rs_lengths = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5556
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5557
  while (cur != NULL) {
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  5558
    assert(!is_on_master_free_list(cur), "sanity");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5559
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5560
    if (non_young) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5561
      if (cur->is_young()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5562
        double end_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5563
        double elapsed_ms = (end_sec - start_sec) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5564
        non_young_time_ms += elapsed_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5565
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5566
        start_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5567
        non_young = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5568
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5569
    } else {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5570
      double end_sec = os::elapsedTime();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5571
      double elapsed_ms = (end_sec - start_sec) * 1000.0;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5572
      young_time_ms += elapsed_ms;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5573
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5574
      start_sec = os::elapsedTime();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5575
      non_young = true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5576
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5577
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5578
    rs_lengths += cur->rem_set()->occupied();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5579
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5580
    HeapRegion* next = cur->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5581
    assert(cur->in_collection_set(), "bad CS");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5582
    cur->set_next_in_collection_set(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5583
    cur->set_in_collection_set(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5584
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5585
    if (cur->is_young()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5586
      int index = cur->young_index_in_cset();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5587
      guarantee( index != -1, "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5588
      guarantee( (size_t)index < policy->young_cset_length(), "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5589
      size_t words_survived = _surviving_young_words[index];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5590
      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
  5591
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5592
      // 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
  5593
      // (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
  5594
      // 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
  5595
      // _next_young_region field.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5596
      cur->set_next_young_region(NULL);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5597
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5598
      int index = cur->young_index_in_cset();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5599
      guarantee( index == -1, "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5600
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5601
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5602
    assert( (cur->is_young() && cur->young_index_in_cset() > -1) ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5603
            (!cur->is_young() && cur->young_index_in_cset() == -1),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5604
            "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5605
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5606
    if (!cur->evacuation_failed()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5607
      // And the region is empty.
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5608
      assert(!cur->is_empty(), "Should not have empty regions in a CS.");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5609
      free_region(cur, &pre_used, &local_free_list, false /* par */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5610
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5611
      cur->uninstall_surv_rate_group();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5612
      if (cur->is_young())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5613
        cur->set_young_index_in_cset(-1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5614
      cur->set_not_young();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5615
      cur->set_evacuation_failed(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5616
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5617
    cur = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5618
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5619
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5620
  policy->record_max_rs_lengths(rs_lengths);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5621
  policy->cset_regions_freed();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5622
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5623
  double end_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5624
  double elapsed_ms = (end_sec - start_sec) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5625
  if (non_young)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5626
    non_young_time_ms += elapsed_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5627
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5628
    young_time_ms += elapsed_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5629
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5630
  update_sets_after_freeing_regions(pre_used, &local_free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5631
                                    NULL /* humongous_proxy_set */,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5632
                                    false /* par */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5633
  policy->record_young_free_cset_time_ms(young_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5634
  policy->record_non_young_free_cset_time_ms(non_young_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5635
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5636
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5637
// 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
  5638
// 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
  5639
// 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
  5640
// 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
  5641
// 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
  5642
// 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
  5643
// 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
  5644
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5645
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
  5646
  HeapRegion* cur = cs_head;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5647
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5648
  while (cur != NULL) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5649
    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
  5650
    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
  5651
    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
  5652
    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
  5653
    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
  5654
    cur = next;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5655
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5656
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5657
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5658
void G1CollectedHeap::set_free_regions_coming() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5659
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5660
    gclog_or_tty->print_cr("G1ConcRegionFreeing [cm thread] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5661
                           "setting free regions coming");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5662
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5663
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5664
  assert(!free_regions_coming(), "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5665
  _free_regions_coming = true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5666
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5667
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5668
void G1CollectedHeap::reset_free_regions_coming() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5669
  {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5670
    assert(free_regions_coming(), "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5671
    MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5672
    _free_regions_coming = false;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5673
    SecondaryFreeList_lock->notify_all();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5674
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5675
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5676
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5677
    gclog_or_tty->print_cr("G1ConcRegionFreeing [cm thread] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5678
                           "reset free regions coming");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5679
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5680
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5681
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5682
void G1CollectedHeap::wait_while_free_regions_coming() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5683
  // 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
  5684
  // first before we take the lock.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5685
  if (!free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5686
    return;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5687
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5688
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5689
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5690
    gclog_or_tty->print_cr("G1ConcRegionFreeing [other] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5691
                           "waiting for free regions");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5692
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5693
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5694
  {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5695
    MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5696
    while (free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5697
      SecondaryFreeList_lock->wait(Mutex::_no_safepoint_check_flag);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5698
    }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5699
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5700
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5701
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5702
    gclog_or_tty->print_cr("G1ConcRegionFreeing [other] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5703
                           "done waiting for free regions");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5704
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5705
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5706
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5707
void G1CollectedHeap::set_region_short_lived_locked(HeapRegion* hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5708
  assert(heap_lock_held_for_gc(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5709
              "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
  5710
  _young_list->push_region(hr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5711
  g1_policy()->set_region_short_lived(hr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5712
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5713
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5714
class NoYoungRegionsClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5715
private:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5716
  bool _success;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5717
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5718
  NoYoungRegionsClosure() : _success(true) { }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5719
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5720
    if (r->is_young()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5721
      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
  5722
                             r->bottom(), r->end());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5723
      _success = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5724
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5725
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5726
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5727
  bool success() { return _success; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5728
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5729
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5730
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
  5731
  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
  5732
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5733
  if (check_heap) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5734
    NoYoungRegionsClosure closure;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5735
    heap_region_iterate(&closure);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5736
    ret = ret && closure.success();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5737
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5738
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5739
  return ret;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5740
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5741
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5742
void G1CollectedHeap::empty_young_list() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5743
  assert(heap_lock_held_for_gc(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5744
              "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
  5745
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5746
  _young_list->empty_list();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5747
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5748
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5749
// Done at the start of full GC.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5750
void G1CollectedHeap::tear_down_region_lists() {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5751
  _free_list.remove_all();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5752
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5753
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5754
class RegionResetter: public HeapRegionClosure {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5755
  G1CollectedHeap* _g1h;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5756
  FreeRegionList _local_free_list;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5757
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5758
public:
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5759
  RegionResetter() : _g1h(G1CollectedHeap::heap()),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5760
                     _local_free_list("Local Free List for RegionResetter") { }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5761
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5762
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5763
    if (r->continuesHumongous()) return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5764
    if (r->top() > r->bottom()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5765
      if (r->top() < r->end()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5766
        Copy::fill_to_words(r->top(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5767
                          pointer_delta(r->end(), r->top()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5768
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5769
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5770
      assert(r->is_empty(), "tautology");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5771
      _local_free_list.add_as_tail(r);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5772
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5773
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5774
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5775
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5776
  void update_free_lists() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5777
    _g1h->update_sets_after_freeing_regions(0, &_local_free_list, NULL,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5778
                                            false /* par */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5779
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5780
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5781
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5782
// Done at the end of full GC.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5783
void G1CollectedHeap::rebuild_region_lists() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5784
  // This needs to go at the end of the full GC.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5785
  RegionResetter rs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5786
  heap_region_iterate(&rs);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5787
  rs.update_free_lists();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5788
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5789
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5790
void G1CollectedHeap::set_refine_cte_cl_concurrency(bool concurrent) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5791
  _refine_cte_cl->set_concurrent(concurrent);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5792
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5793
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5794
bool G1CollectedHeap::is_in_closed_subset(const void* p) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5795
  HeapRegion* hr = heap_region_containing(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5796
  if (hr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5797
    return is_in_permanent(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5798
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5799
    return hr->is_in(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5800
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5801
}
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5802
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5803
// 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
  5804
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5805
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
  5806
                                                      bool force) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5807
  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
  5808
  assert(!force || g1_policy()->can_expand_young_list(),
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5809
         "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
  5810
  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
  5811
  if (force || !young_list_full) {
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5812
    HeapRegion* new_alloc_region = new_region(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5813
                                              false /* do_expand */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5814
    if (new_alloc_region != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5815
      g1_policy()->update_region_num(true /* next_is_young */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5816
      set_region_short_lived_locked(new_alloc_region);
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  5817
      _hr_printer.alloc(new_alloc_region, G1HRPrinter::Eden, young_list_full);
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  5818
      g1mm()->update_eden_counters();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5819
      return new_alloc_region;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5820
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5821
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5822
  return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5823
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5824
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5825
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
  5826
                                                  size_t allocated_bytes) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5827
  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
  5828
  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
  5829
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5830
  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
  5831
  _summary_bytes_used += allocated_bytes;
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  5832
  _hr_printer.retire(alloc_region);
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5833
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5834
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5835
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
  5836
                                                    bool force) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5837
  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
  5838
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5839
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5840
void MutatorAllocRegion::retire_region(HeapRegion* alloc_region,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5841
                                       size_t allocated_bytes) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5842
  _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
  5843
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5844
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5845
// 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
  5846
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5847
HeapRegion* G1CollectedHeap::new_gc_alloc_region(size_t word_size,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5848
                                                 size_t count,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5849
                                                 GCAllocPurpose ap) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5850
  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
  5851
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5852
  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
  5853
    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
  5854
                                              true /* do_expand */);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5855
    if (new_alloc_region != NULL) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5856
      // 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
  5857
      // 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
  5858
      // for survivors too.
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5859
      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
  5860
      if (ap == GCAllocForSurvived) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5861
        new_alloc_region->set_survivor();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5862
        _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
  5863
      } else {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5864
        _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
  5865
      }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5866
      return new_alloc_region;
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5867
    } else {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5868
      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
  5869
    }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5870
  }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5871
  return NULL;
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5872
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5873
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5874
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
  5875
                                             size_t allocated_bytes,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5876
                                             GCAllocPurpose ap) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5877
  alloc_region->note_end_of_copying();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5878
  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
  5879
  if (ap == GCAllocForSurvived) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5880
    young_list()->add_survivor_region(alloc_region);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5881
  }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5882
  _hr_printer.retire(alloc_region);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5883
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5884
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5885
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
  5886
                                                       bool force) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5887
  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
  5888
  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
  5889
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5890
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5891
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
  5892
                                          size_t allocated_bytes) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5893
  _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
  5894
                               GCAllocForSurvived);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5895
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5896
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5897
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
  5898
                                                  bool force) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5899
  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
  5900
  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
  5901
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5902
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5903
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
  5904
                                     size_t allocated_bytes) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5905
  _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
  5906
                               GCAllocForTenured);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5907
}
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5908
// Heap region set verification
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5909
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5910
class VerifyRegionListsClosure : public HeapRegionClosure {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5911
private:
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5912
  HumongousRegionSet* _humongous_set;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5913
  FreeRegionList*     _free_list;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5914
  size_t              _region_count;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5915
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5916
public:
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5917
  VerifyRegionListsClosure(HumongousRegionSet* humongous_set,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5918
                           FreeRegionList* free_list) :
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5919
    _humongous_set(humongous_set), _free_list(free_list),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5920
    _region_count(0) { }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5921
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5922
  size_t region_count()      { return _region_count;      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5924
  bool doHeapRegion(HeapRegion* hr) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5925
    _region_count += 1;
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
    if (hr->continuesHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5928
      return false;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5929
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5930
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5931
    if (hr->is_young()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5932
      // TODO
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5933
    } else if (hr->startsHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5934
      _humongous_set->verify_next_region(hr);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5935
    } else if (hr->is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5936
      _free_list->verify_next_region(hr);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5937
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5938
    return false;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5939
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5940
};
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5941
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  5942
HeapRegion* G1CollectedHeap::new_heap_region(size_t hrs_index,
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  5943
                                             HeapWord* bottom) {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  5944
  HeapWord* end = bottom + HeapRegion::GrainWords;
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  5945
  MemRegion mr(bottom, end);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  5946
  assert(_g1_reserved.contains(mr), "invariant");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  5947
  // This might return NULL if the allocation fails
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  5948
  return new HeapRegion(hrs_index, _bot_shared, mr, true /* is_zeroed */);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  5949
}
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  5950
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5951
void G1CollectedHeap::verify_region_sets() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5952
  assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5953
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5954
  // First, check the explicit lists.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5955
  _free_list.verify();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5956
  {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5957
    // Given that a concurrent operation might be adding regions to
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5958
    // the secondary free list we have to take the lock before
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5959
    // verifying it.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5960
    MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5961
    _secondary_free_list.verify();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5962
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5963
  _humongous_set.verify();
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 a concurrent region freeing operation is in progress it will
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5966
  // be difficult to correctly attributed any free regions we come
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5967
  // 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
  5968
  // one of several (free_list, secondary_free_list, any local lists,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5969
  // 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
  5970
  // verification operation. Alternatively, waiting for the concurrent
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5971
  // 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
  5972
  // operation (no concurrent operation will last longer than the
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5973
  // interval between two calls to verification) and it might hide
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5974
  // any issues that we would like to catch during testing.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5975
  if (free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5976
    return;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5977
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5978
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  5979
  // Make sure we append the secondary_free_list on the free_list so
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  5980
  // that all free regions we will come across can be safely
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  5981
  // attributed to the free_list.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  5982
  append_secondary_free_list_if_not_empty_with_lock();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5983
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5984
  // Finally, make sure that the region accounting in the lists is
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5985
  // consistent with what we see in the heap.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5986
  _humongous_set.verify_start();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5987
  _free_list.verify_start();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5988
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5989
  VerifyRegionListsClosure cl(&_humongous_set, &_free_list);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5990
  heap_region_iterate(&cl);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5991
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5992
  _humongous_set.verify_end();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5993
  _free_list.verify_end();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5994
}