hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
author johnc
Tue, 17 May 2011 00:56:01 -0700
changeset 9936 59dac2950cc7
parent 9935 51267b5e1a3d
child 9987 6e2b9796996f
permissions -rw-r--r--
7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error # Summary: During an evacuation pause clear the region fields of any concurrent marking task whose local finger points into the collection set as the values in the region fields will become stale. Clearing these fields causes the concurrent mark task to claim a new region when marking restarts after the pause. Reviewed-by: tonyp, iveresov
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"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    34
#include "gc_implementation/g1/g1MarkSweep.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    35
#include "gc_implementation/g1/g1OopClosures.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    36
#include "gc_implementation/g1/g1RemSet.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    37
#include "gc_implementation/g1/heapRegionRemSet.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    38
#include "gc_implementation/g1/heapRegionSeq.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    39
#include "gc_implementation/g1/vm_operations_g1.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    40
#include "gc_implementation/shared/isGCActiveMark.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    41
#include "memory/gcLocker.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    42
#include "memory/genOopClosures.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    43
#include "memory/generationSpec.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    44
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    45
#include "oops/oop.pcgc.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    46
#include "runtime/aprofiler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    47
#include "runtime/vmThread.hpp"
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    48
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
    49
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
    50
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    51
// 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
    52
// to-be-collected) are printed at "strategic" points before / during
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    53
// / 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
    54
#define YOUNG_LIST_VERBOSE 0
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    55
// CURRENT STATUS
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    56
// This file is under construction.  Search for "FIXME".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    57
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    58
// INVARIANTS/NOTES
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
// All allocation activity covered by the G1CollectedHeap interface is
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    61
// serialized by acquiring the HeapLock.  This happens in mem_allocate
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    62
// and allocate_new_tlab, which are the "entry" points to the
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    63
// 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
    64
// 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
    65
// is done by clients of this interface.)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    66
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    67
// Local to this file.
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
class RefineCardTableEntryClosure: public CardTableEntryClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    70
  SuspendibleThreadSet* _sts;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    71
  G1RemSet* _g1rs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    72
  ConcurrentG1Refine* _cg1r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    73
  bool _concurrent;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    74
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    75
  RefineCardTableEntryClosure(SuspendibleThreadSet* sts,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    76
                              G1RemSet* g1rs,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    77
                              ConcurrentG1Refine* cg1r) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    78
    _sts(sts), _g1rs(g1rs), _cg1r(cg1r), _concurrent(true)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    79
  {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    80
  bool do_card_ptr(jbyte* card_ptr, int worker_i) {
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
    81
    bool oops_into_cset = _g1rs->concurrentRefineOneCard(card_ptr, worker_i, false);
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
    82
    // This path is executed by the concurrent refine or mutator threads,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
    83
    // 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
    84
    // that point into the collection set.
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
    85
    assert(!oops_into_cset, "should be");
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
    86
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    87
    if (_concurrent && _sts->should_yield()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    88
      // Caller will actually yield.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    89
      return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    90
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    91
    // Otherwise, we finished successfully; return true.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    92
    return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    93
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    94
  void set_concurrent(bool b) { _concurrent = b; }
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
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
class ClearLoggedCardTableEntryClosure: public CardTableEntryClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    99
  int _calls;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   100
  G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   101
  CardTableModRefBS* _ctbs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   102
  int _histo[256];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   103
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   104
  ClearLoggedCardTableEntryClosure() :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   105
    _calls(0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   106
  {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   107
    _g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   108
    _ctbs = (CardTableModRefBS*)_g1h->barrier_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   109
    for (int i = 0; i < 256; i++) _histo[i] = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   110
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   111
  bool do_card_ptr(jbyte* card_ptr, int worker_i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   112
    if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   113
      _calls++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   114
      unsigned char* ujb = (unsigned char*)card_ptr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   115
      int ind = (int)(*ujb);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   116
      _histo[ind]++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   117
      *card_ptr = -1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   118
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   119
    return true;
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
  int calls() { return _calls; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   122
  void print_histo() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   123
    gclog_or_tty->print_cr("Card table value histogram:");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   124
    for (int i = 0; i < 256; i++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   125
      if (_histo[i] != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   126
        gclog_or_tty->print_cr("  %d: %d", i, _histo[i]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   127
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   128
    }
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
class RedirtyLoggedCardTableEntryClosure: public CardTableEntryClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   133
  int _calls;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   134
  G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   135
  CardTableModRefBS* _ctbs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   136
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   137
  RedirtyLoggedCardTableEntryClosure() :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   138
    _calls(0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   139
  {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   140
    _g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   141
    _ctbs = (CardTableModRefBS*)_g1h->barrier_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   142
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   143
  bool do_card_ptr(jbyte* card_ptr, int worker_i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   144
    if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   145
      _calls++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   146
      *card_ptr = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   147
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   148
    return true;
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
  int calls() { return _calls; }
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
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   153
class RedirtyLoggedCardTableEntryFastClosure : public CardTableEntryClosure {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   154
public:
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   155
  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
   156
    *card_ptr = CardTableModRefBS::dirty_card_val();
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   157
    return true;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   158
  }
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   159
};
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   160
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   161
YoungList::YoungList(G1CollectedHeap* g1h)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   162
  : _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
   163
    _length(0),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   164
    _last_sampled_rs_lengths(0),
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   165
    _survivor_head(NULL), _survivor_tail(NULL), _survivor_length(0)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   166
{
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   167
  guarantee( check_list_empty(false), "just making sure..." );
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   170
void YoungList::push_region(HeapRegion *hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   171
  assert(!hr->is_young(), "should not already be young");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   172
  assert(hr->get_next_young_region() == NULL, "cause it should!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   173
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   174
  hr->set_next_young_region(_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   175
  _head = hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   176
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   177
  hr->set_young();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   178
  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
   179
  ++_length;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   180
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   181
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   182
void YoungList::add_survivor_region(HeapRegion* hr) {
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   183
  assert(hr->is_survivor(), "should be flagged as survivor region");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   184
  assert(hr->get_next_young_region() == NULL, "cause it should!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   185
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   186
  hr->set_next_young_region(_survivor_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   187
  if (_survivor_head == NULL) {
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   188
    _survivor_tail = hr;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   189
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   190
  _survivor_head = hr;
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_length;
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   195
void YoungList::empty_list(HeapRegion* list) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   196
  while (list != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   197
    HeapRegion* next = list->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   198
    list->set_next_young_region(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   199
    list->uninstall_surv_rate_group();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   200
    list->set_not_young();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   201
    list = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   202
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   203
}
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
void YoungList::empty_list() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   206
  assert(check_list_well_formed(), "young list should be well formed");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   207
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   208
  empty_list(_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   209
  _head = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   210
  _length = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   211
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   212
  empty_list(_survivor_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   213
  _survivor_head = NULL;
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   214
  _survivor_tail = NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   215
  _survivor_length = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   216
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   217
  _last_sampled_rs_lengths = 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
  assert(check_list_empty(false), "just making sure...");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   220
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   221
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   222
bool YoungList::check_list_well_formed() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   223
  bool ret = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   224
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   225
  size_t length = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   226
  HeapRegion* curr = _head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   227
  HeapRegion* last = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   228
  while (curr != NULL) {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   229
    if (!curr->is_young()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   230
      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
   231
                             "incorrectly tagged (y: %d, surv: %d)",
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   232
                             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
   233
                             curr->is_young(), curr->is_survivor());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   234
      ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   235
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   236
    ++length;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   237
    last = curr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   238
    curr = curr->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   239
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   240
  ret = ret && (length == _length);
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
  if (!ret) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   243
    gclog_or_tty->print_cr("### YOUNG LIST seems not well formed!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   244
    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
   245
                           length, _length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   246
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   247
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   248
  return ret;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   249
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   250
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   251
bool YoungList::check_list_empty(bool check_sample) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   252
  bool ret = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   253
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   254
  if (_length != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   255
    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
   256
                  _length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   257
    ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   258
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   259
  if (check_sample && _last_sampled_rs_lengths != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   260
    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
   261
    ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   262
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   263
  if (_head != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   264
    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
   265
    ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   266
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   267
  if (!ret) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   268
    gclog_or_tty->print_cr("### YOUNG LIST does not seem empty");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   269
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   270
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   271
  return ret;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   272
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   273
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   274
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   275
YoungList::rs_length_sampling_init() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   276
  _sampled_rs_lengths = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   277
  _curr               = _head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   278
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   279
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   280
bool
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   281
YoungList::rs_length_sampling_more() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   282
  return _curr != NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   283
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   284
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   285
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   286
YoungList::rs_length_sampling_next() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   287
  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
   288
  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
   289
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   290
  _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
   291
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   292
  // 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
   293
  // 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
   294
  // 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
   295
  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
   296
    // 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
   297
    _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
   298
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   299
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   300
  _curr = _curr->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   301
  if (_curr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   302
    _last_sampled_rs_lengths = _sampled_rs_lengths;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   303
    // 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
   304
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   305
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   306
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   307
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   308
YoungList::reset_auxilary_lists() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   309
  guarantee( is_empty(), "young list should be empty" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   310
  assert(check_list_well_formed(), "young list should be well formed");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   311
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   312
  // Add survivor regions to SurvRateGroup.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   313
  _g1h->g1_policy()->note_start_adding_survivor_regions();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   314
  _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
   315
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   316
  for (HeapRegion* curr = _survivor_head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   317
       curr != NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   318
       curr = curr->get_next_young_region()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   319
    _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
   320
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   321
    // 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
   322
    // 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
   323
    // pause.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   324
    _g1h->g1_policy()->add_region_to_incremental_cset_rhs(curr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   325
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   326
  _g1h->g1_policy()->note_stop_adding_survivor_regions();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   327
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   328
  _head   = _survivor_head;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   329
  _length = _survivor_length;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   330
  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
   331
    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
   332
    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
   333
    _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
   334
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   335
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   336
  // 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
   337
  // 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
   338
  // 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
   339
  // 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
   340
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   341
  _g1h->g1_policy()->finished_recalculating_age_indexes(false /* is_survivors */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   342
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   343
  assert(check_list_well_formed(), "young list should be well formed");
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   346
void YoungList::print() {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   347
  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
   348
  const char* names[] = {"YOUNG", "SURVIVOR"};
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   349
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   350
  for (unsigned int list = 0; list < ARRAY_SIZE(lists); ++list) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   351
    gclog_or_tty->print_cr("%s LIST CONTENTS", names[list]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   352
    HeapRegion *curr = lists[list];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   353
    if (curr == NULL)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   354
      gclog_or_tty->print_cr("  empty");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   355
    while (curr != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   356
      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
   357
                             "age: %4d, y: %d, surv: %d",
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   358
                             curr->bottom(), curr->end(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   359
                             curr->top(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   360
                             curr->prev_top_at_mark_start(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   361
                             curr->next_top_at_mark_start(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   362
                             curr->top_at_conc_mark_count(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   363
                             curr->age_in_surv_rate_group_cond(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   364
                             curr->is_young(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   365
                             curr->is_survivor());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   366
      curr = curr->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   367
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   368
  }
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
  gclog_or_tty->print_cr("");
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
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   373
void G1CollectedHeap::push_dirty_cards_region(HeapRegion* hr)
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   374
{
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   375
  // 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
   376
  // by installing a self pointer.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   377
  HeapRegion* next = hr->get_next_dirty_cards_region();
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   378
  if (next == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   379
    HeapRegion* res = (HeapRegion*)
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   380
      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
   381
                          NULL);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   382
    if (res == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   383
      HeapRegion* head;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   384
      do {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   385
        // Put the region to the dirty cards region list.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   386
        head = _dirty_cards_region_list;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   387
        next = (HeapRegion*)
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   388
          Atomic::cmpxchg_ptr(hr, &_dirty_cards_region_list, head);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   389
        if (next == head) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   390
          assert(hr->get_next_dirty_cards_region() == hr,
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   391
                 "hr->get_next_dirty_cards_region() != hr");
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   392
          if (next == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   393
            // The last region in the list points to itself.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   394
            hr->set_next_dirty_cards_region(hr);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   395
          } else {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   396
            hr->set_next_dirty_cards_region(next);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   397
          }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   398
        }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   399
      } while (next != head);
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
  }
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
HeapRegion* G1CollectedHeap::pop_dirty_cards_region()
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* head;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   407
  HeapRegion* hr;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   408
  do {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   409
    head = _dirty_cards_region_list;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   410
    if (head == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   411
      return NULL;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   412
    }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   413
    HeapRegion* new_head = head->get_next_dirty_cards_region();
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   414
    if (head == new_head) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   415
      // The last region.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   416
      new_head = NULL;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   417
    }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   418
    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
   419
                                          head);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   420
  } while (hr != head);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   421
  assert(hr != NULL, "invariant");
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   422
  hr->set_next_dirty_cards_region(NULL);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   423
  return hr;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   424
}
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   425
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   426
void G1CollectedHeap::stop_conc_gc_threads() {
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
   427
  _cg1r->stop();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   428
  _cmThread->stop();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   429
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   430
9935
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   431
#ifdef ASSERT
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   432
// 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
   433
// 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
   434
// 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
   435
// 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
   436
// regions have been retired.  It is used for debugging
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   437
// 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
   438
// 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
   439
// inaccurate, it is sufficient for G1 because the conservative
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   440
// implementation of is_scavengable() for G1 will indicate that
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   441
// all nmethods must be scanned during a partial collection.
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   442
bool G1CollectedHeap::is_in_partial_collection(const void* p) {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   443
  HeapRegion* hr = heap_region_containing(p);
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   444
  return hr != NULL && hr->in_collection_set();
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   445
}
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   446
#endif
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
// 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
   449
// can move in an incremental collecction.
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   450
bool G1CollectedHeap::is_scavengable(const void* p) {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   451
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   452
  G1CollectorPolicy* g1p = g1h->g1_policy();
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   453
  HeapRegion* hr = heap_region_containing(p);
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   454
  if (hr == NULL) {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   455
     // perm gen (or null)
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   456
     return false;
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   457
  } else {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   458
    return !hr->isHumongous();
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   459
  }
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   460
}
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   461
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   462
void G1CollectedHeap::check_ct_logs_at_safepoint() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   463
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   464
  CardTableModRefBS* ct_bs = (CardTableModRefBS*)barrier_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   465
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   466
  // Count the dirty cards at the start.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   467
  CountNonCleanMemRegionClosure count1(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   468
  ct_bs->mod_card_iterate(&count1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   469
  int orig_count = count1.n();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   470
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   471
  // First clear the logged cards.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   472
  ClearLoggedCardTableEntryClosure clear;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   473
  dcqs.set_closure(&clear);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   474
  dcqs.apply_closure_to_all_completed_buffers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   475
  dcqs.iterate_closure_all_threads(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   476
  clear.print_histo();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   477
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   478
  // Now ensure that there's no dirty cards.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   479
  CountNonCleanMemRegionClosure count2(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   480
  ct_bs->mod_card_iterate(&count2);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   481
  if (count2.n() != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   482
    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
   483
                           count2.n(), orig_count);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   484
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   485
  guarantee(count2.n() == 0, "Card table should be clean.");
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
  RedirtyLoggedCardTableEntryClosure redirty;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   488
  JavaThread::dirty_card_queue_set().set_closure(&redirty);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   489
  dcqs.apply_closure_to_all_completed_buffers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   490
  dcqs.iterate_closure_all_threads(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   491
  gclog_or_tty->print_cr("Log entries = %d, dirty cards = %d.",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   492
                         clear.calls(), orig_count);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   493
  guarantee(redirty.calls() == clear.calls(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   494
            "Or else mechanism is broken.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   495
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   496
  CountNonCleanMemRegionClosure count3(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   497
  ct_bs->mod_card_iterate(&count3);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   498
  if (count3.n() != orig_count) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   499
    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
   500
                           orig_count, count3.n());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   501
    guarantee(count3.n() >= orig_count, "Should have restored them all.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   502
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   503
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   504
  JavaThread::dirty_card_queue_set().set_closure(_refine_cte_cl);
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   507
// Private class members.
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
G1CollectedHeap* G1CollectedHeap::_g1h;
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
// Private methods.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   512
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   513
HeapRegion*
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   514
G1CollectedHeap::new_region_try_secondary_free_list() {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   515
  MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   516
  while (!_secondary_free_list.is_empty() || free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   517
    if (!_secondary_free_list.is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   518
      if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   519
        gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   520
                               "secondary_free_list has "SIZE_FORMAT" entries",
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   521
                               _secondary_free_list.length());
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   522
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   523
      // It looks as if there are free regions available on the
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   524
      // 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
   525
      // again to allocate from it.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   526
      append_secondary_free_list();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   527
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   528
      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
   529
             "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
   530
      HeapRegion* res = _free_list.remove_head();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   531
      if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   532
        gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   533
                               "allocated "HR_FORMAT" from secondary_free_list",
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   534
                               HR_FORMAT_PARAMS(res));
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   535
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   536
      return 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
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   539
    // 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
   540
    // 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
   541
    // the secondary_free_list.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   542
    SecondaryFreeList_lock->wait(Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   543
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   544
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   545
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   546
    gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   547
                           "could not allocate from secondary_free_list");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   548
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   549
  return NULL;
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
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   552
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
   553
  assert(!isHumongous(word_size) ||
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   554
                                  word_size <= (size_t) HeapRegion::GrainWords,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   555
         "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
   556
         "when we are allocating a single humongous region");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   557
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   558
  HeapRegion* res;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   559
  if (G1StressConcRegionFreeing) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   560
    if (!_secondary_free_list.is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   561
      if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   562
        gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   563
                               "forced to look at the secondary_free_list");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   564
      }
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   565
      res = new_region_try_secondary_free_list();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   566
      if (res != NULL) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   567
        return res;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   568
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   569
    }
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
  res = _free_list.remove_head_or_null();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   572
  if (res == NULL) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   573
    if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   574
      gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   575
                             "res == NULL, trying the secondary_free_list");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   576
    }
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   577
    res = new_region_try_secondary_free_list();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   578
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   579
  if (res == NULL && do_expand) {
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   580
    if (expand(word_size * HeapWordSize)) {
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   581
      // The expansion succeeded and so we should have at least one
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   582
      // region on the free list.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   583
      res = _free_list.remove_head();
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   584
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   585
  }
5540
e8a688e539aa 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 5402
diff changeset
   586
  if (res != NULL) {
e8a688e539aa 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to
apetrusenko
parents: 5402
diff changeset
   587
    if (G1PrintHeapRegions) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   588
      gclog_or_tty->print_cr("new alloc region %d:["PTR_FORMAT","PTR_FORMAT"], "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   589
                             "top "PTR_FORMAT, res->hrs_index(),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   590
                             res->bottom(), res->end(), res->top());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   591
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   592
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   593
  return res;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   594
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   595
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   596
HeapRegion* G1CollectedHeap::new_gc_alloc_region(int purpose,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   597
                                                 size_t word_size) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   598
  HeapRegion* alloc_region = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   599
  if (_gc_alloc_region_counts[purpose] < g1_policy()->max_regions(purpose)) {
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   600
    alloc_region = new_region(word_size, true /* do_expand */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   601
    if (purpose == GCAllocForSurvived && alloc_region != NULL) {
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   602
      alloc_region->set_survivor();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   603
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   604
    ++_gc_alloc_region_counts[purpose];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   605
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   606
    g1_policy()->note_alloc_region_limit_reached(purpose);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   607
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   608
  return alloc_region;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   609
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   610
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   611
int G1CollectedHeap::humongous_obj_allocate_find_first(size_t num_regions,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   612
                                                       size_t word_size) {
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   613
  assert(isHumongous(word_size), "word_size should be humongous");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   614
  assert(num_regions * HeapRegion::GrainWords >= word_size, "pre-condition");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   615
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   616
  int first = -1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   617
  if (num_regions == 1) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   618
    // 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
   619
    // path. The caller will attempt the expasion if this fails, so
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   620
    // 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
   621
    HeapRegion* hr = new_region(word_size, false /* do_expand */);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   622
    if (hr != NULL) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   623
      first = hr->hrs_index();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   624
    } else {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   625
      first = -1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   626
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   627
  } else {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   628
    // We can't allocate humongous regions while cleanupComplete() is
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   629
    // 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
   630
    // 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
   631
    // 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
   632
    // 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
   633
    // one region to satisfy the current humongous allocation
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   634
    // 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
   635
    // region allocation code (see above).
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   636
    wait_while_free_regions_coming();
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   637
    append_secondary_free_list_if_not_empty_with_lock();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   638
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   639
    if (free_regions() >= num_regions) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   640
      first = _hrs->find_contiguous(num_regions);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   641
      if (first != -1) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   642
        for (int i = first; i < first + (int) num_regions; ++i) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   643
          HeapRegion* hr = _hrs->at(i);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   644
          assert(hr->is_empty(), "sanity");
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   645
          assert(is_on_master_free_list(hr), "sanity");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   646
          hr->set_pending_removal(true);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   647
        }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   648
        _free_list.remove_all_pending(num_regions);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   649
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   650
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   651
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   652
  return first;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   653
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   654
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   655
HeapWord*
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   656
G1CollectedHeap::humongous_obj_allocate_initialize_regions(int first,
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   657
                                                           size_t num_regions,
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   658
                                                           size_t word_size) {
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   659
  assert(first != -1, "pre-condition");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   660
  assert(isHumongous(word_size), "word_size should be humongous");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   661
  assert(num_regions * HeapRegion::GrainWords >= word_size, "pre-condition");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   662
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   663
  // Index of last region in the series + 1.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   664
  int last = first + (int) num_regions;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   665
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   666
  // We need to initialize the region(s) we just discovered. This is
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   667
  // a bit tricky given that it can happen concurrently with
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   668
  // refinement threads refining cards on these regions and
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   669
  // potentially wanting to refine the BOT as they are scanning
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   670
  // those cards (this can happen shortly after a cleanup; see CR
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   671
  // 6991377). So we have to set up the region(s) carefully and in
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   672
  // a specific order.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   673
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   674
  // The word size sum of all the regions we will allocate.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   675
  size_t word_size_sum = num_regions * HeapRegion::GrainWords;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   676
  assert(word_size <= word_size_sum, "sanity");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   677
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   678
  // This will be the "starts humongous" region.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   679
  HeapRegion* first_hr = _hrs->at(first);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   680
  // The header of the new object will be placed at the bottom of
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   681
  // the first region.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   682
  HeapWord* new_obj = first_hr->bottom();
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   683
  // This will be the new end of the first region in the series that
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   684
  // should also match the end of the last region in the seriers.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   685
  HeapWord* new_end = new_obj + word_size_sum;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   686
  // This will be the new top of the first region that will reflect
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   687
  // this allocation.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   688
  HeapWord* new_top = new_obj + word_size;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   689
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   690
  // First, we need to zero the header of the space that we will be
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   691
  // allocating. When we update top further down, some refinement
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   692
  // threads might try to scan the region. By zeroing the header we
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   693
  // ensure that any thread that will try to scan the region will
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   694
  // come across the zero klass word and bail out.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   695
  //
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   696
  // NOTE: It would not have been correct to have used
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   697
  // CollectedHeap::fill_with_object() and make the space look like
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   698
  // an int array. The thread that is doing the allocation will
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   699
  // later update the object header to a potentially different array
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   700
  // type and, for a very short period of time, the klass and length
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   701
  // fields will be inconsistent. This could cause a refinement
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   702
  // thread to calculate the object size incorrectly.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   703
  Copy::fill_to_words(new_obj, oopDesc::header_size(), 0);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   704
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   705
  // We will set up the first region as "starts humongous". This
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   706
  // will also update the BOT covering all the regions to reflect
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   707
  // that there is a single object that starts at the bottom of the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   708
  // first region.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   709
  first_hr->set_startsHumongous(new_top, new_end);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   710
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   711
  // Then, if there are any, we will set up the "continues
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   712
  // humongous" regions.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   713
  HeapRegion* hr = NULL;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   714
  for (int i = first + 1; i < last; ++i) {
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   715
    hr = _hrs->at(i);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   716
    hr->set_continuesHumongous(first_hr);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   717
  }
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   718
  // If we have "continues humongous" regions (hr != NULL), then the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   719
  // end of the last one should match new_end.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   720
  assert(hr == NULL || hr->end() == new_end, "sanity");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   721
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   722
  // Up to this point no concurrent thread would have been able to
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   723
  // do any scanning on any region in this series. All the top
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   724
  // fields still point to bottom, so the intersection between
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   725
  // [bottom,top] and [card_start,card_end] will be empty. Before we
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   726
  // update the top fields, we'll do a storestore to make sure that
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   727
  // no thread sees the update to top before the zeroing of the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   728
  // object header and the BOT initialization.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   729
  OrderAccess::storestore();
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   730
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   731
  // Now that the BOT and the object header have been initialized,
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   732
  // we can update top of the "starts humongous" region.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   733
  assert(first_hr->bottom() < new_top && new_top <= first_hr->end(),
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   734
         "new_top should be in this region");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   735
  first_hr->set_top(new_top);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   736
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   737
  // Now, we will update the top fields of the "continues humongous"
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   738
  // regions. The reason we need to do this is that, otherwise,
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   739
  // these regions would look empty and this will confuse parts of
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   740
  // G1. For example, the code that looks for a consecutive number
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   741
  // of empty regions will consider them empty and try to
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   742
  // re-allocate them. We can extend is_empty() to also include
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   743
  // !continuesHumongous(), but it is easier to just update the top
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   744
  // fields here. The way we set top for all regions (i.e., top ==
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   745
  // end for all regions but the last one, top == new_top for the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   746
  // last one) is actually used when we will free up the humongous
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   747
  // region in free_humongous_region().
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   748
  hr = NULL;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   749
  for (int i = first + 1; i < last; ++i) {
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   750
    hr = _hrs->at(i);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   751
    if ((i + 1) == last) {
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   752
      // last continues humongous region
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   753
      assert(hr->bottom() < new_top && new_top <= hr->end(),
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   754
             "new_top should fall on this region");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   755
      hr->set_top(new_top);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   756
    } else {
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   757
      // not last one
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   758
      assert(new_top > hr->end(), "new_top should be above this region");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   759
      hr->set_top(hr->end());
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   760
    }
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   761
  }
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   762
  // If we have continues humongous regions (hr != NULL), then the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   763
  // end of the last one should match new_end and its top should
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   764
  // match new_top.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   765
  assert(hr == NULL ||
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   766
         (hr->end() == new_end && hr->top() == new_top), "sanity");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   767
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   768
  assert(first_hr->used() == word_size * HeapWordSize, "invariant");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   769
  _summary_bytes_used += first_hr->used();
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   770
  _humongous_set.add(first_hr);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   771
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   772
  return new_obj;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   773
}
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   774
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   775
// If could fit into free regions w/o expansion, try.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   776
// Otherwise, if can expand, do so.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   777
// 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
   778
HeapWord* G1CollectedHeap::humongous_obj_allocate(size_t word_size) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   779
  assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   780
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   781
  verify_region_sets_optional();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   782
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   783
  size_t num_regions =
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   784
         round_to(word_size, HeapRegion::GrainWords) / HeapRegion::GrainWords;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   785
  size_t x_size = expansion_regions();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   786
  size_t fs = _hrs->free_suffix();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   787
  int first = humongous_obj_allocate_find_first(num_regions, word_size);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   788
  if (first == -1) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   789
    // The only thing we can do now is attempt expansion.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   790
    if (fs + x_size >= num_regions) {
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   791
      // 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
   792
      // 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
   793
      // 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
   794
      // should have succeeded and we wouldn't be here.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   795
      //
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   796
      // 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
   797
      // 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
   798
      // room available.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   799
      assert(num_regions > fs, "earlier allocation should have succeeded");
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   800
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   801
      if (expand((num_regions - fs) * HeapRegion::GrainBytes)) {
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   802
        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
   803
        // If the expansion was successful then the allocation
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   804
        // should have been successful.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   805
        assert(first != -1, "this should have worked");
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   806
      }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   807
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   808
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   809
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   810
  HeapWord* result = NULL;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   811
  if (first != -1) {
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   812
    result =
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   813
      humongous_obj_allocate_initialize_regions(first, num_regions, word_size);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   814
    assert(result != NULL, "it should always return a valid result");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   815
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   816
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   817
  verify_region_sets_optional();
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   818
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   819
  return result;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   820
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   821
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   822
HeapWord* G1CollectedHeap::allocate_new_tlab(size_t word_size) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   823
  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
   824
  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
   825
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   826
  unsigned int dummy_gc_count_before;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   827
  return attempt_allocation(word_size, &dummy_gc_count_before);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   828
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   829
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   830
HeapWord*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   831
G1CollectedHeap::mem_allocate(size_t word_size,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   832
                              bool   is_noref,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   833
                              bool   is_tlab,
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   834
                              bool*  gc_overhead_limit_was_exceeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   835
  assert_heap_not_locked_and_not_at_safepoint();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   836
  assert(!is_tlab, "mem_allocate() this should not be called directly "
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   837
         "to allocate TLABs");
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()) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   921
          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
   922
                                                      false /* bot_updates */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   923
          if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   924
            return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   925
          }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   926
        }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   927
        should_try_gc = false;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   928
      } else {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   929
        // 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
   930
        gc_count_before = SharedHeap::heap()->total_collections();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   931
        should_try_gc = true;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   932
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   933
    }
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
    if (should_try_gc) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   936
      bool succeeded;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   937
      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
   938
      if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   939
        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
   940
        return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   941
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   942
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   943
      if (succeeded) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   944
        // 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
   945
        // 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
   946
        // further. We'll just return NULL.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   947
        MutexLockerEx x(Heap_lock);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   948
        *gc_count_before_ret = SharedHeap::heap()->total_collections();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   949
        return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   950
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   951
    } else {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   952
      GC_locker::stall_until_clear();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   953
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   954
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   955
    // 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
   956
    // 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
   957
    // 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
   958
    // allocation attempt in case another thread successfully
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   959
    // 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
   960
    // 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
   961
    // 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
   962
    // iteration (after taking the Heap_lock).
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   963
    result = _mutator_alloc_region.attempt_allocation(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   964
                                                      false /* bot_updates */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   965
    if (result != NULL ){
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   966
      return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   967
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   968
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   969
    // 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
   970
    if ((QueuedAllocationWarningCount > 0) &&
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   971
        (try_count % QueuedAllocationWarningCount == 0)) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   972
      warning("G1CollectedHeap::attempt_allocation_slow() "
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   973
              "retries %d times", try_count);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   974
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   975
  }
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
  ShouldNotReachHere();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   978
  return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   979
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   980
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   981
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
   982
                                          unsigned int * gc_count_before_ret) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   983
  // 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
   984
  // 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
   985
  // 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
   986
  // 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
   987
  // 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
   988
  // 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
   989
  // 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
   990
  // 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
   991
  // 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
   992
  // much as possible.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   993
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   994
  assert_heap_not_locked_and_not_at_safepoint();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   995
  assert(isHumongous(word_size), "attempt_allocation_humongous() "
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   996
         "should only be called for humongous allocations");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   997
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   998
  // 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
   999
  // 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
  1000
  // 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
  1001
  // return NULL.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1002
  HeapWord* result = NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1003
  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
  1004
    bool should_try_gc;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1005
    unsigned int gc_count_before;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1006
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1007
    {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1008
      MutexLockerEx x(Heap_lock);
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
      // 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
  1011
      // 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
  1012
      // 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
  1013
      result = humongous_obj_allocate(word_size);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1014
      if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1015
        return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1016
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1017
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1018
      if (GC_locker::is_active_and_needs_gc()) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1019
        should_try_gc = false;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1020
      } else {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1021
        // 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
  1022
        gc_count_before = SharedHeap::heap()->total_collections();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1023
        should_try_gc = true;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1024
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1025
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1026
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1027
    if (should_try_gc) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1028
      // 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
  1029
      // 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
  1030
      // 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
  1031
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1032
      bool succeeded;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1033
      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
  1034
      if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1035
        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
  1036
        return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1037
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1038
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1039
      if (succeeded) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1040
        // 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
  1041
        // 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
  1042
        // further. We'll just return NULL.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1043
        MutexLockerEx x(Heap_lock);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1044
        *gc_count_before_ret = SharedHeap::heap()->total_collections();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1045
        return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1046
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1047
    } else {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1048
      GC_locker::stall_until_clear();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1049
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1050
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1051
    // 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
  1052
    // 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
  1053
    // 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
  1054
    // allocation attempt in case another thread successfully
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1055
    // 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
  1056
    // warning if we seem to be looping forever.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1057
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1058
    if ((QueuedAllocationWarningCount > 0) &&
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1059
        (try_count % QueuedAllocationWarningCount == 0)) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1060
      warning("G1CollectedHeap::attempt_allocation_humongous() "
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1061
              "retries %d times", try_count);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1062
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1063
  }
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
  ShouldNotReachHere();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1066
  return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1067
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1068
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1069
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
  1070
                                       bool expect_null_mutator_alloc_region) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1071
  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
  1072
  assert(_mutator_alloc_region.get() == NULL ||
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1073
                                             !expect_null_mutator_alloc_region,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1074
         "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
  1075
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1076
  if (!isHumongous(word_size)) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1077
    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
  1078
                                                      false /* bot_updates */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1079
  } else {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1080
    return humongous_obj_allocate(word_size);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1081
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1082
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1083
  ShouldNotReachHere();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1084
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1085
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1086
void G1CollectedHeap::abandon_gc_alloc_regions() {
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1087
  // first, make sure that the GC alloc region list is empty (it should!)
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1088
  assert(_gc_alloc_region_list == NULL, "invariant");
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1089
  release_gc_alloc_regions(true /* totally */);
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1090
}
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1091
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1092
class PostMCRemSetClearClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1093
  ModRefBarrierSet* _mr_bs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1094
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1095
  PostMCRemSetClearClosure(ModRefBarrierSet* mr_bs) : _mr_bs(mr_bs) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1096
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1097
    r->reset_gc_time_stamp();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1098
    if (r->continuesHumongous())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1099
      return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1100
    HeapRegionRemSet* hrrs = r->rem_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1101
    if (hrrs != NULL) hrrs->clear();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1102
    // You might think here that we could clear just the cards
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1103
    // 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
  1104
    // 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
  1105
    // from being enqueued, and cause it to be missed.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1106
    // 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
  1107
    _mr_bs->clear(MemRegion(r->bottom(), r->end()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1108
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1109
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1110
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1111
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1112
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1113
class PostMCRemSetInvalidateClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1114
  ModRefBarrierSet* _mr_bs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1115
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1116
  PostMCRemSetInvalidateClosure(ModRefBarrierSet* mr_bs) : _mr_bs(mr_bs) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1117
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1118
    if (r->continuesHumongous()) return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1119
    if (r->used_region().word_size() != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1120
      _mr_bs->invalidate(r->used_region(), true /*whole heap*/);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1121
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1122
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1123
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1124
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1125
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1126
class RebuildRSOutOfRegionClosure: public HeapRegionClosure {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1127
  G1CollectedHeap*   _g1h;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1128
  UpdateRSOopClosure _cl;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1129
  int                _worker_i;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1130
public:
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1131
  RebuildRSOutOfRegionClosure(G1CollectedHeap* g1, int worker_i = 0) :
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  1132
    _cl(g1->g1_rem_set(), worker_i),
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1133
    _worker_i(worker_i),
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1134
    _g1h(g1)
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1135
  { }
7385
eaca4b61b374 6978187: G1: assert(ParallelGCThreads> 1 || n_yielded() == _hrrs->occupied()) strikes again
johnc
parents: 6980
diff changeset
  1136
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1137
  bool doHeapRegion(HeapRegion* r) {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1138
    if (!r->continuesHumongous()) {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1139
      _cl.set_from(r);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1140
      r->oop_iterate(&_cl);
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
    return false;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1143
  }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1144
};
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1145
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1146
class ParRebuildRSTask: public AbstractGangTask {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1147
  G1CollectedHeap* _g1;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1148
public:
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1149
  ParRebuildRSTask(G1CollectedHeap* g1)
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1150
    : AbstractGangTask("ParRebuildRSTask"),
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1151
      _g1(g1)
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1152
  { }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1153
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1154
  void work(int i) {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1155
    RebuildRSOutOfRegionClosure rebuild_rs(_g1, i);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1156
    _g1->heap_region_par_iterate_chunked(&rebuild_rs, i,
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1157
                                         HeapRegion::RebuildRSClaimValue);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1158
  }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1159
};
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1160
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1161
bool G1CollectedHeap::do_collection(bool explicit_gc,
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1162
                                    bool clear_all_soft_refs,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1163
                                    size_t word_size) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1164
  assert_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1165
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  1166
  if (GC_locker::check_active_before_gc()) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1167
    return false;
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  1168
  }
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  1169
7896
08aadd7aa3ee 6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents: 7659
diff changeset
  1170
  SvcGCMarker sgcm(SvcGCMarker::FULL);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1171
  ResourceMark rm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1172
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1173
  if (PrintHeapAtGC) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1174
    Universe::print_heap_before_gc();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1175
  }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1176
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1177
  verify_region_sets_optional();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1178
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1179
  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
  1180
                           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
  1181
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1182
  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
  1183
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1184
  {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1185
    IsGCActiveMark x;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1186
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1187
    // Timing
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1188
    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
  1189
    assert(!system_gc || explicit_gc, "invariant");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1190
    gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1191
    TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1192
    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
  1193
                PrintGC, true, gclog_or_tty);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1194
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  1195
    TraceCollectorStats tcs(g1mm()->full_collection_counters());
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents: 9424
diff changeset
  1196
    TraceMemoryManagerStats tms(true /* fullGC */, gc_cause());
4459
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  1197
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1198
    double start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1199
    g1_policy()->record_full_collection_start();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1200
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1201
    wait_while_free_regions_coming();
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  1202
    append_secondary_free_list_if_not_empty_with_lock();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1203
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1204
    gc_prologue(true);
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1205
    increment_total_collections(true /* full gc */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1206
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1207
    size_t g1h_prev_used = used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1208
    assert(used() == recalculate_used(), "Should be equal");
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
    if (VerifyBeforeGC && total_collections() >= VerifyGCStartAt) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1211
      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
  1212
      gclog_or_tty->print(" VerifyBeforeGC:");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1213
      prepare_for_verify();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1214
      Universe::verify(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1215
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1216
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1217
    COMPILER2_PRESENT(DerivedPointerTable::clear());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1218
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1219
    // We want to discover references, but not process them yet.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1220
    // This mode is disabled in
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1221
    // instanceRefKlass::process_discovered_references if the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1222
    // generation does some collection work, or
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1223
    // instanceRefKlass::enqueue_discovered_references if the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1224
    // generation returns without doing any work.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1225
    ref_processor()->disable_discovery();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1226
    ref_processor()->abandon_partial_discovery();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1227
    ref_processor()->verify_no_references_recorded();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1228
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1229
    // Abandon current iterations of concurrent marking and concurrent
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1230
    // refinement, if any are in progress.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1231
    concurrent_mark()->abort();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1232
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1233
    // 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
  1234
    release_mutator_alloc_region();
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1235
    abandon_gc_alloc_regions();
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  1236
    g1_rem_set()->cleanupHRRS();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1237
    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
  1238
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1239
    // 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
  1240
    // 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
  1241
    // 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
  1242
    // after this full GC.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1243
    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
  1244
    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
  1245
    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
  1246
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1247
    if (g1_policy()->in_young_gc_mode()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1248
      empty_young_list();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1249
      g1_policy()->set_full_young_gcs(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1250
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1251
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  1252
    // See the comment in G1CollectedHeap::ref_processing_init() about
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  1253
    // how reference processing currently works in G1.
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  1254
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1255
    // Temporarily make reference _discovery_ single threaded (non-MT).
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8680
diff changeset
  1256
    ReferenceProcessorMTDiscoveryMutator rp_disc_ser(ref_processor(), false);
1374
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
    // Temporarily make refs discovery atomic
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1259
    ReferenceProcessorAtomicMutator rp_disc_atomic(ref_processor(), true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1260
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1261
    // Temporarily clear _is_alive_non_header
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1262
    ReferenceProcessorIsAliveMutator rp_is_alive_null(ref_processor(), NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1263
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1264
    ref_processor()->enable_discovery();
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1265
    ref_processor()->setup_policy(do_clear_all_soft_refs);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1266
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1267
    // Do collection work
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1268
    {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1269
      HandleMark hm;  // Discard invalid handles created during gc
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1270
      G1MarkSweep::invoke_at_safepoint(ref_processor(), do_clear_all_soft_refs);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1271
    }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1272
    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
  1273
    rebuild_region_lists();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1274
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1275
    _summary_bytes_used = recalculate_used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1276
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1277
    ref_processor()->enqueue_discovered_references();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1278
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1279
    COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1280
4459
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  1281
    MemoryService::track_memory_usage();
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  1282
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1283
    if (VerifyAfterGC && total_collections() >= VerifyGCStartAt) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1284
      HandleMark hm;  // Discard invalid handles created during verification
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1285
      gclog_or_tty->print(" VerifyAfterGC:");
2249
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  1286
      prepare_for_verify();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1287
      Universe::verify(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1288
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1289
    NOT_PRODUCT(ref_processor()->verify_no_references_recorded());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1290
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1291
    reset_gc_time_stamp();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1292
    // Since everything potentially moved, we will clear all remembered
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1293
    // sets, and clear all cards.  Later we will rebuild remebered
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1294
    // 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
  1295
    PostMCRemSetClearClosure rs_clear(mr_bs());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1296
    heap_region_iterate(&rs_clear);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1297
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1298
    // Resize the heap if necessary.
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1299
    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
  1300
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1301
    if (_cg1r->use_cache()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1302
      _cg1r->clear_and_record_card_counts();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1303
      _cg1r->clear_hot_cache();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1304
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1305
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1306
    // Rebuild remembered sets of all regions.
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  1307
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  1308
    if (G1CollectedHeap::use_parallel_gc_threads()) {
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1309
      ParRebuildRSTask rebuild_rs_task(this);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1310
      assert(check_heap_region_claim_values(
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1311
             HeapRegion::InitialClaimValue), "sanity check");
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1312
      set_par_threads(workers()->total_workers());
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1313
      workers()->run_task(&rebuild_rs_task);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1314
      set_par_threads(0);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1315
      assert(check_heap_region_claim_values(
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1316
             HeapRegion::RebuildRSClaimValue), "sanity check");
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1317
      reset_heap_region_claim_values();
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1318
    } else {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1319
      RebuildRSOutOfRegionClosure rebuild_rs(this);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1320
      heap_region_iterate(&rebuild_rs);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1321
    }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1322
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1323
    if (PrintGC) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1324
      print_size_transition(gclog_or_tty, g1h_prev_used, used(), capacity());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1325
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1326
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1327
    if (true) { // FIXME
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1328
      // Ask the permanent generation to adjust size for full collections
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1329
      perm()->compute_new_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1330
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1331
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1332
    // 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
  1333
    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
  1334
    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
  1335
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1336
    // 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
  1337
    // 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
  1338
    // evacuation pause.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1339
    clear_cset_fast_test();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1340
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1341
    init_mutator_alloc_region();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1342
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1343
    double end = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1344
    g1_policy()->record_full_collection_end();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1345
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  1346
#ifdef TRACESPINNING
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  1347
    ParallelTaskTerminator::print_termination_counts();
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  1348
#endif
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  1349
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1350
    gc_epilogue(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1351
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  1352
    // Discard all rset updates
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  1353
    JavaThread::dirty_card_queue_set().abandon_logs();
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  1354
    assert(!G1DeferredRSUpdate
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  1355
           || (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
  1356
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1357
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1358
  if (g1_policy()->in_young_gc_mode()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1359
    _young_list->reset_sampled_info();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1360
    // At this point there should be no regions in the
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1361
    // entire heap tagged as young.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1362
    assert( check_young_list_empty(true /* check_heap */),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1363
            "young list should be empty at this point");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1364
  }
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1365
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1366
  // 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
  1367
  increment_full_collections_completed(false /* concurrent */);
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1368
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1369
  verify_region_sets_optional();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1370
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1371
  if (PrintHeapAtGC) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1372
    Universe::print_heap_after_gc();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1373
  }
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  1374
  g1mm()->update_counters();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1375
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1376
  return true;
1374
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
void G1CollectedHeap::do_full_collection(bool clear_all_soft_refs) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1380
  // do_collection() will return whether it succeeded in performing
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1381
  // the GC. Currently, there is no facility on the
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1382
  // do_full_collection() API to notify the caller than the collection
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1383
  // 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
  1384
  // locker). So, right now, we'll ignore the return value.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1385
  bool dummy = do_collection(true,                /* explicit_gc */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1386
                             clear_all_soft_refs,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1387
                             0                    /* word_size */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1388
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1389
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1390
// This code is mostly copied from TenuredGeneration.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1391
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1392
G1CollectedHeap::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1393
resize_if_necessary_after_full_collection(size_t word_size) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1394
  assert(MinHeapFreeRatio <= MaxHeapFreeRatio, "sanity check");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1395
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1396
  // Include the current allocation, if any, and bytes that will be
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1397
  // pre-allocated to support collections, as "used".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1398
  const size_t used_after_gc = used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1399
  const size_t capacity_after_gc = capacity();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1400
  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
  1401
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1402
  // This is enforced in arguments.cpp.
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1403
  assert(MinHeapFreeRatio <= MaxHeapFreeRatio,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1404
         "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
  1405
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1406
  // 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
  1407
  const double minimum_free_percentage = (double) MinHeapFreeRatio / 100.0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1408
  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
  1409
  const double maximum_free_percentage = (double) MaxHeapFreeRatio / 100.0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1410
  const double minimum_used_percentage = 1.0 - maximum_free_percentage;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1411
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1412
  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
  1413
  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
  1414
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1415
  // 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
  1416
  // 32-bit size_t's.
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1417
  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
  1418
  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
  1419
  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
  1420
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1421
  // 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
  1422
  // 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
  1423
  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
  1424
  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
  1425
                                    desired_capacity_upper_bound);
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1426
  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
  1427
                                    desired_capacity_upper_bound);
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1428
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1429
  // 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
  1430
  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
  1431
  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
  1432
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1433
  // 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
  1434
  // 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
  1435
  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
  1436
         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
  1437
                 "maximum_desired_capacity = "SIZE_FORMAT,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1438
                 minimum_desired_capacity, maximum_desired_capacity));
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1439
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1440
  // 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
  1441
  // 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
  1442
  // 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
  1443
  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
  1444
  // 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
  1445
  // 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
  1446
  // 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
  1447
  maximum_desired_capacity =  MAX2(maximum_desired_capacity, min_heap_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1448
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1449
  if (PrintGC && Verbose) {
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1450
    const double free_percentage =
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1451
      (double) free_after_gc / (double) capacity_after_gc;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1452
    gclog_or_tty->print_cr("Computing new size after full GC ");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1453
    gclog_or_tty->print_cr("  "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1454
                           "  minimum_free_percentage: %6.2f",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1455
                           minimum_free_percentage);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1456
    gclog_or_tty->print_cr("  "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1457
                           "  maximum_free_percentage: %6.2f",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1458
                           maximum_free_percentage);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1459
    gclog_or_tty->print_cr("  "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1460
                           "  capacity: %6.1fK"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1461
                           "  minimum_desired_capacity: %6.1fK"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1462
                           "  maximum_desired_capacity: %6.1fK",
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1463
                           (double) capacity_after_gc / (double) K,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1464
                           (double) minimum_desired_capacity / (double) K,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1465
                           (double) maximum_desired_capacity / (double) K);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1466
    gclog_or_tty->print_cr("  "
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1467
                           "  free_after_gc: %6.1fK"
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1468
                           "  used_after_gc: %6.1fK",
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1469
                           (double) free_after_gc / (double) K,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1470
                           (double) used_after_gc / (double) K);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1471
    gclog_or_tty->print_cr("  "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1472
                           "   free_percentage: %6.2f",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1473
                           free_percentage);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1474
  }
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1475
  if (capacity_after_gc < minimum_desired_capacity) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1476
    // Don't expand unless it's significant
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1477
    size_t expand_bytes = minimum_desired_capacity - capacity_after_gc;
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1478
    if (expand(expand_bytes)) {
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1479
      if (PrintGC && Verbose) {
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1480
        gclog_or_tty->print_cr("  "
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1481
                               "  expanding:"
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1482
                               "  max_heap_size: %6.1fK"
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1483
                               "  minimum_desired_capacity: %6.1fK"
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1484
                               "  expand_bytes: %6.1fK",
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1485
                               (double) max_heap_size / (double) K,
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1486
                               (double) minimum_desired_capacity / (double) K,
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1487
                               (double) expand_bytes / (double) K);
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1488
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1489
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1490
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1491
    // 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
  1492
  } else if (capacity_after_gc > maximum_desired_capacity) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1493
    // Capacity too large, compute shrinking size
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1494
    size_t shrink_bytes = capacity_after_gc - maximum_desired_capacity;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1495
    shrink(shrink_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1496
    if (PrintGC && Verbose) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1497
      gclog_or_tty->print_cr("  "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1498
                             "  shrinking:"
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1499
                             "  min_heap_size: %6.1fK"
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1500
                             "  maximum_desired_capacity: %6.1fK"
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1501
                             "  shrink_bytes: %6.1fK",
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1502
                             (double) min_heap_size / (double) K,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1503
                             (double) maximum_desired_capacity / (double) K,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1504
                             (double) shrink_bytes / (double) K);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1505
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1506
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1507
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1508
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1509
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1510
HeapWord*
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1511
G1CollectedHeap::satisfy_failed_allocation(size_t word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1512
                                           bool* succeeded) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1513
  assert_at_safepoint(true /* should_be_vm_thread */);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1514
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1515
  *succeeded = true;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1516
  // Let's attempt the allocation first.
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1517
  HeapWord* result =
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1518
    attempt_allocation_at_safepoint(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1519
                                 false /* expect_null_mutator_alloc_region */);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1520
  if (result != NULL) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1521
    assert(*succeeded, "sanity");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1522
    return result;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1523
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1524
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1525
  // 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
  1526
  // incremental pauses.  Therefore, at least for now, we'll favor
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1527
  // 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
  1528
  // do something smarter than full collection to satisfy a failed alloc.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1529
  result = expand_and_allocate(word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1530
  if (result != NULL) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1531
    assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1532
    return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1533
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1534
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1535
  // 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
  1536
  bool gc_succeeded = do_collection(false, /* explicit_gc */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1537
                                    false, /* clear_all_soft_refs */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1538
                                    word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1539
  if (!gc_succeeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1540
    *succeeded = false;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1541
    return NULL;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1542
  }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1543
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1544
  // Retry the allocation
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1545
  result = attempt_allocation_at_safepoint(word_size,
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1546
                                  true /* expect_null_mutator_alloc_region */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1547
  if (result != NULL) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1548
    assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1549
    return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1550
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1551
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1552
  // Then, try a Full GC that will collect all soft references.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1553
  gc_succeeded = do_collection(false, /* explicit_gc */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1554
                               true,  /* clear_all_soft_refs */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1555
                               word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1556
  if (!gc_succeeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1557
    *succeeded = false;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1558
    return NULL;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1559
  }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1560
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1561
  // Retry the allocation once more
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1562
  result = attempt_allocation_at_safepoint(word_size,
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1563
                                  true /* expect_null_mutator_alloc_region */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1564
  if (result != NULL) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1565
    assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1566
    return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1567
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1568
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1569
  assert(!collector_policy()->should_clear_all_soft_refs(),
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1570
         "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
  1571
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1572
  // What else?  We might try synchronous finalization later.  If the total
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1573
  // space available is large enough for the allocation, then a more
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1574
  // complete compaction phase than we've tried so far might be
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1575
  // appropriate.
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1576
  assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1577
  return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1578
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1579
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1580
// Attempting to expand the heap sufficiently
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1581
// to support an allocation of the given "word_size".  If
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1582
// successful, perform the allocation and return the address of the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1583
// allocated block, or else "NULL".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1584
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1585
HeapWord* G1CollectedHeap::expand_and_allocate(size_t word_size) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1586
  assert_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1587
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1588
  verify_region_sets_optional();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1589
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1590
  size_t expand_bytes = MAX2(word_size * HeapWordSize, MinHeapDeltaBytes);
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1591
  if (expand(expand_bytes)) {
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1592
    verify_region_sets_optional();
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1593
    return attempt_allocation_at_safepoint(word_size,
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1594
                                 false /* expect_null_mutator_alloc_region */);
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1595
  }
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1596
  return NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1597
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1598
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1599
bool G1CollectedHeap::expand(size_t expand_bytes) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1600
  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
  1601
  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
  1602
  aligned_expand_bytes = align_size_up(aligned_expand_bytes,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1603
                                       HeapRegion::GrainBytes);
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1604
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1605
  if (Verbose && PrintGC) {
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1606
    gclog_or_tty->print("Expanding garbage-first heap from %ldK by %ldK",
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1607
                           old_mem_size/K, aligned_expand_bytes/K);
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1608
  }
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1609
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1610
  HeapWord* old_end = (HeapWord*)_g1_storage.high();
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1611
  bool successful = _g1_storage.expand_by(aligned_expand_bytes);
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1612
  if (successful) {
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1613
    HeapWord* new_end = (HeapWord*)_g1_storage.high();
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1614
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1615
    // Expand the committed region.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1616
    _g1_committed.set_end(new_end);
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1617
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1618
    // Tell the cardtable about the expansion.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1619
    Universe::heap()->barrier_set()->resize_covered_region(_g1_committed);
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1620
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1621
    // And the offset table as well.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1622
    _bot_shared->resize(_g1_committed.word_size());
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1623
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1624
    expand_bytes = aligned_expand_bytes;
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1625
    HeapWord* base = old_end;
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1626
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1627
    // Create the heap regions for [old_end, new_end)
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1628
    while (expand_bytes > 0) {
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1629
      HeapWord* high = base + HeapRegion::GrainWords;
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1630
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1631
      // Create a new HeapRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1632
      MemRegion mr(base, high);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1633
      bool is_zeroed = !_g1_max_committed.contains(base);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1634
      HeapRegion* hr = new HeapRegion(_bot_shared, mr, is_zeroed);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1635
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1636
      // Add it to the HeapRegionSeq.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1637
      _hrs->insert(hr);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1638
      _free_list.add_as_tail(hr);
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1639
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1640
      // And we used up an expansion region to create it.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1641
      _expansion_regions--;
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1642
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1643
      expand_bytes -= HeapRegion::GrainBytes;
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1644
      base += HeapRegion::GrainWords;
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1645
    }
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1646
    assert(base == new_end, "sanity");
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1647
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1648
    // Now update max_committed if necessary.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1649
    _g1_max_committed.set_end(MAX2(_g1_max_committed.end(), new_end));
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1650
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1651
  } else {
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1652
    // The expansion of the virtual storage space was unsuccessful.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1653
    // 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
  1654
    if (G1ExitOnExpansionFailure &&
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1655
        _g1_storage.uncommitted_size() >= aligned_expand_bytes) {
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1656
      // We had head room...
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1657
      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
  1658
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1659
  }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1660
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1661
  if (Verbose && PrintGC) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1662
    size_t new_mem_size = _g1_storage.committed_size();
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1663
    gclog_or_tty->print_cr("...%s, expanded to %ldK",
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1664
                           (successful ? "Successful" : "Failed"),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1665
                           new_mem_size/K);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1666
  }
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1667
  return successful;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1668
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1669
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1670
void G1CollectedHeap::shrink_helper(size_t shrink_bytes)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1671
{
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1672
  size_t old_mem_size = _g1_storage.committed_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1673
  size_t aligned_shrink_bytes =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1674
    ReservedSpace::page_align_size_down(shrink_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1675
  aligned_shrink_bytes = align_size_down(aligned_shrink_bytes,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1676
                                         HeapRegion::GrainBytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1677
  size_t num_regions_deleted = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1678
  MemRegion mr = _hrs->shrink_by(aligned_shrink_bytes, num_regions_deleted);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1679
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1680
  assert(mr.end() == (HeapWord*)_g1_storage.high(), "Bad shrink!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1681
  if (mr.byte_size() > 0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1682
    _g1_storage.shrink_by(mr.byte_size());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1683
  assert(mr.start() == (HeapWord*)_g1_storage.high(), "Bad shrink!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1684
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1685
  _g1_committed.set_end(mr.start());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1686
  _expansion_regions += num_regions_deleted;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1687
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1688
  // Tell the cardtable about it.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1689
  Universe::heap()->barrier_set()->resize_covered_region(_g1_committed);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1690
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1691
  // And the offset table as well.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1692
  _bot_shared->resize(_g1_committed.word_size());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1693
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1694
  HeapRegionRemSet::shrink_heap(n_regions());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1695
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1696
  if (Verbose && PrintGC) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1697
    size_t new_mem_size = _g1_storage.committed_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1698
    gclog_or_tty->print_cr("Shrinking garbage-first heap from %ldK by %ldK to %ldK",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1699
                           old_mem_size/K, aligned_shrink_bytes/K,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1700
                           new_mem_size/K);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1701
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1702
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1703
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1704
void G1CollectedHeap::shrink(size_t shrink_bytes) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1705
  verify_region_sets_optional();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1706
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1707
  release_gc_alloc_regions(true /* totally */);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1708
  // Instead of tearing down / rebuilding the free lists here, we
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1709
  // 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
  1710
  // remove only the ones that we need to remove.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1711
  tear_down_region_lists();  // We will rebuild them in a moment.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1712
  shrink_helper(shrink_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1713
  rebuild_region_lists();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1714
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1715
  verify_region_sets_optional();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1716
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1717
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1718
// Public methods.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1719
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1720
#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
  1721
#pragma warning( disable:4355 ) // 'this' : used in base member initializer list
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1722
#endif // _MSC_VER
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1723
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1724
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1725
G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1726
  SharedHeap(policy_),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1727
  _g1_policy(policy_),
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  1728
  _dirty_card_queue_set(false),
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  1729
  _into_cset_dirty_card_queue_set(false),
7657
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7455
diff changeset
  1730
  _is_alive_closure(this),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1731
  _ref_processor(NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1732
  _process_strong_tasks(new SubTasksDone(G1H_PS_NumElements)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1733
  _bot_shared(NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1734
  _objs_with_preserved_marks(NULL), _preserved_marks_of_objs(NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1735
  _evac_failure_scan_stack(NULL) ,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1736
  _mark_in_progress(false),
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1737
  _cg1r(NULL), _summary_bytes_used(0),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1738
  _refine_cte_cl(NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1739
  _full_collection(false),
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1740
  _free_list("Master Free List"),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1741
  _secondary_free_list("Secondary Free List"),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1742
  _humongous_set("Master Humongous Set"),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1743
  _free_regions_coming(false),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1744
  _young_list(new YoungList(this)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1745
  _gc_time_stamp(0),
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  1746
  _surviving_young_words(NULL),
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1747
  _full_collections_completed(0),
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  1748
  _in_cset_fast_test(NULL),
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  1749
  _in_cset_fast_test_base(NULL),
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  1750
  _dirty_cards_region_list(NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1751
  _g1h = this; // To catch bugs.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1752
  if (_process_strong_tasks == NULL || !_process_strong_tasks->valid()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1753
    vm_exit_during_initialization("Failed necessary allocation.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1754
  }
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  1755
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  1756
  _humongous_object_threshold_in_words = HeapRegion::GrainWords / 2;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  1757
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1758
  int n_queues = MAX2((int)ParallelGCThreads, 1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1759
  _task_queues = new RefToScanQueueSet(n_queues);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1760
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1761
  int n_rem_sets = HeapRegionRemSet::num_par_rem_sets();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1762
  assert(n_rem_sets > 0, "Invariant.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1763
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1764
  HeapRegionRemSetIterator** iter_arr =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1765
    NEW_C_HEAP_ARRAY(HeapRegionRemSetIterator*, n_queues);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1766
  for (int i = 0; i < n_queues; i++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1767
    iter_arr[i] = new HeapRegionRemSetIterator();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1768
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1769
  _rem_set_iterator = iter_arr;
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
  for (int i = 0; i < n_queues; i++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1772
    RefToScanQueue* q = new RefToScanQueue();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1773
    q->initialize();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1774
    _task_queues->register_queue(i, q);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1775
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1776
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1777
  for (int ap = 0; ap < GCAllocPurposeCount; ++ap) {
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1778
    _gc_alloc_regions[ap]          = NULL;
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1779
    _gc_alloc_region_counts[ap]    = 0;
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1780
    _retained_gc_alloc_regions[ap] = NULL;
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1781
    // by default, we do not retain a GC alloc region for each ap;
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1782
    // we'll override this, when appropriate, below
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1783
    _retain_gc_alloc_region[ap]    = false;
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1784
  }
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1785
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1786
  // We will try to remember the last half-full tenured region we
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1787
  // allocated to at the end of a collection so that we can re-use it
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1788
  // during the next collection.
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1789
  _retain_gc_alloc_region[GCAllocForTenured]  = true;
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1790
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1791
  guarantee(_task_queues != NULL, "task_queues allocation failure.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1792
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1793
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1794
jint G1CollectedHeap::initialize() {
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4481
diff changeset
  1795
  CollectedHeap::pre_initialize();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1796
  os::enable_vtime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1797
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1798
  // Necessary to satisfy locking discipline assertions.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1799
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1800
  MutexLocker x(Heap_lock);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1801
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1802
  // While there are no constraints in the GC code that HeapWordSize
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1803
  // be any particular value, there are multiple other areas in the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1804
  // 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
  1805
  // cases incorrectly returns the size in wordSize units rather than
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1806
  // HeapWordSize).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1807
  guarantee(HeapWordSize == wordSize, "HeapWordSize must equal wordSize");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1808
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1809
  size_t init_byte_size = collector_policy()->initial_heap_byte_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1810
  size_t max_byte_size = collector_policy()->max_heap_byte_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1811
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1812
  // Ensure that the sizes are properly aligned.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1813
  Universe::check_alignment(init_byte_size, HeapRegion::GrainBytes, "g1 heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1814
  Universe::check_alignment(max_byte_size, HeapRegion::GrainBytes, "g1 heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1815
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1816
  _cg1r = new ConcurrentG1Refine();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1817
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1818
  // Reserve the maximum.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1819
  PermanentGenerationSpec* pgs = collector_policy()->permanent_generation();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1820
  // Includes the perm-gen.
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1821
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1822
  const size_t total_reserved = max_byte_size + pgs->max_size();
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1823
  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
  1824
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1825
  ReservedSpace heap_rs(max_byte_size + pgs->max_size(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1826
                        HeapRegion::GrainBytes,
7906
2e43f97e05f7 6941122: G1: UseLargePages does not work with G1 garbage collector
brutisso
parents: 7905
diff changeset
  1827
                        UseLargePages, addr);
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1828
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1829
  if (UseCompressedOops) {
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1830
    if (addr != NULL && !heap_rs.is_reserved()) {
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1831
      // 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
  1832
      // 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
  1833
      // Try again to reserver heap higher.
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1834
      addr = Universe::preferred_heap_base(total_reserved, Universe::ZeroBasedNarrowOop);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1835
      ReservedSpace heap_rs0(total_reserved, HeapRegion::GrainBytes,
7906
2e43f97e05f7 6941122: G1: UseLargePages does not work with G1 garbage collector
brutisso
parents: 7905
diff changeset
  1836
                             UseLargePages, addr);
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1837
      if (addr != NULL && !heap_rs0.is_reserved()) {
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1838
        // 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
  1839
        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
  1840
        assert(addr == NULL, "");
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1841
        ReservedSpace heap_rs1(total_reserved, HeapRegion::GrainBytes,
7906
2e43f97e05f7 6941122: G1: UseLargePages does not work with G1 garbage collector
brutisso
parents: 7905
diff changeset
  1842
                               UseLargePages, addr);
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1843
        heap_rs = heap_rs1;
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1844
      } else {
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1845
        heap_rs = heap_rs0;
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1846
      }
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1847
    }
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1848
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1849
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1850
  if (!heap_rs.is_reserved()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1851
    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
  1852
    return JNI_ENOMEM;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1853
  }
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
  // 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
  1856
  // temporarily think somethings in the heap.  (I've actually seen this
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1857
  // happen in asserts: DLD.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1858
  _reserved.set_word_size(0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1859
  _reserved.set_start((HeapWord*)heap_rs.base());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1860
  _reserved.set_end((HeapWord*)(heap_rs.base() + heap_rs.size()));
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
  _expansion_regions = max_byte_size/HeapRegion::GrainBytes;
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
  // 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
  1865
  _rem_set = collector_policy()->create_rem_set(_reserved, 2);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1866
  set_barrier_set(rem_set()->bs());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1867
  if (barrier_set()->is_a(BarrierSet::ModRef)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1868
    _mr_bs = (ModRefBarrierSet*)_barrier_set;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1869
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1870
    vm_exit_during_initialization("G1 requires a mod ref bs.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1871
    return JNI_ENOMEM;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1872
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1873
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1874
  // Also create a G1 rem set.
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  1875
  if (mr_bs()->is_a(BarrierSet::CardTableModRef)) {
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  1876
    _g1_rem_set = new G1RemSet(this, (CardTableModRefBS*)mr_bs());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1877
  } else {
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  1878
    vm_exit_during_initialization("G1 requires a cardtable mod ref bs.");
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  1879
    return JNI_ENOMEM;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1880
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1881
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1882
  // Carve out the G1 part of the heap.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1883
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1884
  ReservedSpace g1_rs   = heap_rs.first_part(max_byte_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1885
  _g1_reserved = MemRegion((HeapWord*)g1_rs.base(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1886
                           g1_rs.size()/HeapWordSize);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1887
  ReservedSpace perm_gen_rs = heap_rs.last_part(max_byte_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1888
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1889
  _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
  1890
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1891
  _g1_storage.initialize(g1_rs, 0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1892
  _g1_committed = MemRegion((HeapWord*)_g1_storage.low(), (size_t) 0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1893
  _g1_max_committed = _g1_committed;
1425
ec7818f129f8 6758633: G1: SEGV with GCOld on Linux
iveresov
parents: 1422
diff changeset
  1894
  _hrs = new HeapRegionSeq(_expansion_regions);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1895
  guarantee(_hrs != NULL, "Couldn't allocate HeapRegionSeq");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1896
2996
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  1897
  // 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
  1898
  // in the remembered set structures.
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  1899
  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
  1900
  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
  1901
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  1902
  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
  1903
  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
  1904
  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
  1905
            "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
  1906
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1907
  HeapRegionSet::set_unrealistically_long_length(max_regions() + 1);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1908
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1909
  _bot_shared = new G1BlockOffsetSharedArray(_reserved,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1910
                                             heap_word_size(init_byte_size));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1911
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1912
  _g1h = this;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1913
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1914
   _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
  1915
   _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
  1916
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1917
   // 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
  1918
   // 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
  1919
   // 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
  1920
   _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
  1921
                ((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
  1922
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1923
   // 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
  1924
   // 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
  1925
   // evacuation pause.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1926
   clear_cset_fast_test();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1927
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1928
  // Create the ConcurrentMark data structure and thread.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1929
  // (Must do this late, so that "max_regions" is defined.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1930
  _cm       = new ConcurrentMark(heap_rs, (int) max_regions());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1931
  _cmThread = _cm->cmThread();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1932
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1933
  // Initialize the from_card cache structure of HeapRegionRemSet.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1934
  HeapRegionRemSet::init_heap(max_regions());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1935
2344
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2259
diff changeset
  1936
  // Now expand into the initial heap size.
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1937
  if (!expand(init_byte_size)) {
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1938
    vm_exit_during_initialization("Failed to allocate initial heap.");
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1939
    return JNI_ENOMEM;
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1940
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1941
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1942
  // Perform any initialization actions delegated to the policy.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1943
  g1_policy()->init();
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
  g1_policy()->note_start_of_mark_thread();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1946
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1947
  _refine_cte_cl =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1948
    new RefineCardTableEntryClosure(ConcurrentG1RefineThread::sts(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1949
                                    g1_rem_set(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1950
                                    concurrent_g1_refine());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1951
  JavaThread::dirty_card_queue_set().set_closure(_refine_cte_cl);
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
  JavaThread::satb_mark_queue_set().initialize(SATB_Q_CBL_mon,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1954
                                               SATB_Q_FL_lock,
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  1955
                                               G1SATBProcessCompletedThreshold,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1956
                                               Shared_SATB_Q_lock);
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  1957
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  1958
  JavaThread::dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  1959
                                                DirtyCardQ_FL_lock,
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  1960
                                                concurrent_g1_refine()->yellow_zone(),
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  1961
                                                concurrent_g1_refine()->red_zone(),
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  1962
                                                Shared_DirtyCardQ_lock);
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  1963
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  1964
  if (G1DeferredRSUpdate) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  1965
    dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  1966
                                      DirtyCardQ_FL_lock,
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  1967
                                      -1, // never trigger processing
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  1968
                                      -1, // no limit on length
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  1969
                                      Shared_DirtyCardQ_lock,
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  1970
                                      &JavaThread::dirty_card_queue_set());
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  1971
  }
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  1972
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  1973
  // Initialize the card queue set used to hold cards containing
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  1974
  // references into the collection set.
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  1975
  _into_cset_dirty_card_queue_set.initialize(DirtyCardQ_CBL_mon,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  1976
                                             DirtyCardQ_FL_lock,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  1977
                                             -1, // never trigger processing
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  1978
                                             -1, // no limit on length
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  1979
                                             Shared_DirtyCardQ_lock,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  1980
                                             &JavaThread::dirty_card_queue_set());
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  1981
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1982
  // In case we're keeping closure specialization stats, initialize those
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1983
  // counts and that mechanism.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1984
  SpecializationStats::clear();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1985
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1986
  _gc_alloc_region_list = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1987
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1988
  // Do later initialization work for concurrent refinement.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1989
  _cg1r->init();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1990
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1991
  // 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
  1992
  // 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
  1993
  // space here, lots of asserts fire.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1994
  MemRegion mr(_g1_reserved.start(), HeapRegion::GrainWords);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1995
  HeapRegion* dummy_region = new HeapRegion(_bot_shared, mr, true);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1996
  // 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
  1997
  // 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
  1998
  // 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
  1999
  // 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
  2000
  dummy_region->set_young();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2001
  // Make sure it's full.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2002
  dummy_region->set_top(dummy_region->end());
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2003
  G1AllocRegion::setup(this, dummy_region);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2004
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2005
  init_mutator_alloc_region();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2006
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  2007
  // 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
  2008
  // values in the heap have been properly initialized.
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  2009
  _g1mm = new G1MonitoringSupport(this, &_g1_storage);
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  2010
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2011
  return JNI_OK;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2012
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2013
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2014
void G1CollectedHeap::ref_processing_init() {
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2015
  // Reference processing in G1 currently works as follows:
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2016
  //
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2017
  // * There is only one reference processor instance that
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2018
  //   'spans' the entire heap. It is created by the code
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2019
  //   below.
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2020
  // * Reference discovery is not enabled during an incremental
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2021
  //   pause (see 6484982).
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2022
  // * Discoverered refs are not enqueued nor are they processed
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2023
  //   during an incremental pause (see 6484982).
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2024
  // * Reference discovery is enabled at initial marking.
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2025
  // * Reference discovery is disabled and the discovered
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2026
  //   references processed etc during remarking.
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2027
  // * Reference discovery is MT (see below).
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2028
  // * Reference discovery requires a barrier (see below).
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2029
  // * Reference processing is currently not MT (see 6608385).
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2030
  // * A full GC enables (non-MT) reference discovery and
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2031
  //   processes any discovered references.
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2032
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2033
  SharedHeap::ref_processing_init();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2034
  MemRegion mr = reserved_region();
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8680
diff changeset
  2035
  _ref_processor =
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8680
diff changeset
  2036
    new ReferenceProcessor(mr,    // span
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8680
diff changeset
  2037
                           ParallelRefProcEnabled && (ParallelGCThreads > 1),    // mt processing
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8680
diff changeset
  2038
                           (int) ParallelGCThreads,   // degree of mt processing
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8680
diff changeset
  2039
                           ParallelGCThreads > 1 || ConcGCThreads > 1,  // mt discovery
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8680
diff changeset
  2040
                           (int) MAX2(ParallelGCThreads, ConcGCThreads), // degree of mt discovery
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8680
diff changeset
  2041
                           false,                     // Reference discovery is not atomic
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8680
diff changeset
  2042
                           &_is_alive_closure,        // is alive closure for efficiency
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8680
diff changeset
  2043
                           true);                     // Setting next fields of discovered
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8680
diff changeset
  2044
                                                      // lists requires a barrier.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2045
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2046
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2047
size_t G1CollectedHeap::capacity() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2048
  return _g1_committed.byte_size();
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
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2051
void G1CollectedHeap::iterate_dirty_card_closure(CardTableEntryClosure* cl,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2052
                                                 DirtyCardQueue* into_cset_dcq,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2053
                                                 bool concurrent,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2054
                                                 int worker_i) {
3589
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  2055
  // Clean cards in the hot card cache
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2056
  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
  2057
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2058
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2059
  int n_completed_buffers = 0;
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2060
  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
  2061
    n_completed_buffers++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2062
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2063
  g1_policy()->record_update_rs_processed_buffers(worker_i,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2064
                                                  (double) n_completed_buffers);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2065
  dcqs.clear_n_completed_buffers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2066
  assert(!dcqs.completed_buffers_exist_dirty(), "Completed buffers exist!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2067
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2068
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2069
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2070
// Computes the sum of the storage used by the various regions.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2071
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2072
size_t G1CollectedHeap::used() const {
3279
1af8fdb08664 6863216: Clean up debugging debris inadvertently pushed with 6700789
ysr
parents: 3278
diff changeset
  2073
  assert(Heap_lock->owner() != NULL,
1af8fdb08664 6863216: Clean up debugging debris inadvertently pushed with 6700789
ysr
parents: 3278
diff changeset
  2074
         "Should be owned on this thread's behalf.");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2075
  size_t result = _summary_bytes_used;
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2076
  // 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
  2077
  HeapRegion* hr = _mutator_alloc_region.get();
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2078
  if (hr != NULL)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2079
    result += hr->used();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2080
  return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2081
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2082
3263
23d2d46c6d08 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 3262
diff changeset
  2083
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
  2084
  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
  2085
  return result;
23d2d46c6d08 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 3262
diff changeset
  2086
}
23d2d46c6d08 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 3262
diff changeset
  2087
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2088
class SumUsedClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2089
  size_t _used;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2090
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2091
  SumUsedClosure() : _used(0) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2092
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2093
    if (!r->continuesHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2094
      _used += r->used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2095
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2096
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2097
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2098
  size_t result() { return _used; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2099
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2100
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2101
size_t G1CollectedHeap::recalculate_used() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2102
  SumUsedClosure blk;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2103
  _hrs->iterate(&blk);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2104
  return blk.result();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2105
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2106
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2107
#ifndef PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2108
class SumUsedRegionsClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2109
  size_t _num;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2110
public:
2344
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2259
diff changeset
  2111
  SumUsedRegionsClosure() : _num(0) {}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2112
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2113
    if (r->continuesHumongous() || r->used() > 0 || r->is_gc_alloc_region()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2114
      _num += 1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2115
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2116
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2117
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2118
  size_t result() { return _num; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2119
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2120
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2121
size_t G1CollectedHeap::recalculate_used_regions() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2122
  SumUsedRegionsClosure blk;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2123
  _hrs->iterate(&blk);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2124
  return blk.result();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2125
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2126
#endif // PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2127
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2128
size_t G1CollectedHeap::unsafe_max_alloc() {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2129
  if (free_regions() > 0) return HeapRegion::GrainBytes;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2130
  // otherwise, is there space in the current allocation region?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2131
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2132
  // 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
  2133
  // 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
  2134
  // there may be other threads which overwrite the current allocation
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2135
  // region field. attempt_allocation(), for example, sets it to NULL
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2136
  // 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
  2137
  // 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
  2138
  // 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
  2139
  // current allocation region field are optimized away.
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2140
  HeapRegion* hr = _mutator_alloc_region.get();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2141
  if (hr == NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2142
    return 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2143
  }
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2144
  return hr->free();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2145
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2146
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2147
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
  2148
  return
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2149
    ((cause == GCCause::_gc_locker           && GCLockerInvokesConcurrent) ||
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2150
     (cause == GCCause::_java_lang_system_gc && ExplicitGCInvokesConcurrent));
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2151
}
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2152
9334
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2153
#ifndef PRODUCT
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2154
void G1CollectedHeap::allocate_dummy_regions() {
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2155
  // Let's fill up most of the region
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2156
  size_t word_size = HeapRegion::GrainWords - 1024;
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2157
  // 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
  2158
  guarantee(isHumongous(word_size), "sanity");
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2159
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2160
  for (uintx i = 0; i < G1DummyRegionsPerGC; ++i) {
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2161
    // 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
  2162
    HeapWord* dummy_obj = humongous_obj_allocate(word_size);
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2163
    if (dummy_obj != NULL) {
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2164
      MemRegion mr(dummy_obj, word_size);
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2165
      CollectedHeap::fill_with_object(mr);
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2166
    } else {
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2167
      // 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
  2168
      // again. Let's get out of the loop.
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2169
      break;
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2170
    }
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2171
  }
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2172
}
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2173
#endif // !PRODUCT
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2174
7455
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2175
void G1CollectedHeap::increment_full_collections_completed(bool concurrent) {
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2176
  MonitorLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2177
7455
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2178
  // 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
  2179
  // 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
  2180
  // 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
  2181
  // assert here.
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2182
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2183
  // 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
  2184
  // 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
  2185
  // collections have been started.
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2186
  unsigned int full_collections_started = total_full_collections();
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2187
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2188
  // 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
  2189
  // 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
  2190
  // interrupt a concurrent cycle), the number of full collections
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2191
  // 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
  2192
  // 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
  2193
  // behind the number of full collections started.
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2194
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2195
  // 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
  2196
  assert(concurrent ||
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2197
         (full_collections_started == _full_collections_completed + 1) ||
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2198
         (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
  2199
         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
  2200
                 "is inconsistent with _full_collections_completed = %u",
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2201
                 full_collections_started, _full_collections_completed));
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2202
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2203
  // 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
  2204
  assert(!concurrent ||
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2205
         (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
  2206
         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
  2207
                 "full_collections_started = %u "
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2208
                 "is inconsistent with _full_collections_completed = %u",
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2209
                 full_collections_started, _full_collections_completed));
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2210
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2211
  _full_collections_completed += 1;
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2212
6766
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2213
  // 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
  2214
  // we wake up any waiters (especially when ExplicitInvokesConcurrent
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2215
  // 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
  2216
  // 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
  2217
  if (concurrent) {
6766
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2218
    _cmThread->clear_in_progress();
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2219
  }
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2220
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2221
  // 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
  2222
  // System.gc() with (with ExplicitGCInvokesConcurrent set or not)
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2223
  // 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
  2224
  // waiting in VM_G1IncCollectionPause::doit_epilogue().
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2225
  FullGCCount_lock->notify_all();
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2226
}
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2227
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2228
void G1CollectedHeap::collect_as_vm_thread(GCCause::Cause cause) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2229
  assert_at_safepoint(true /* should_be_vm_thread */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2230
  GCCauseSetter gcs(this, cause);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2231
  switch (cause) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2232
    case GCCause::_heap_inspection:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2233
    case GCCause::_heap_dump: {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2234
      HandleMark hm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2235
      do_full_collection(false);         // don't clear all soft refs
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2236
      break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2237
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2238
    default: // XXX FIX ME
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2239
      ShouldNotReachHere(); // Unexpected use of this function
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2240
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2241
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2242
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2243
void G1CollectedHeap::collect(GCCause::Cause cause) {
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2244
  // 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
  2245
  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
  2246
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2247
  unsigned int gc_count_before;
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2248
  unsigned int full_gc_count_before;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2249
  {
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2250
    MutexLocker ml(Heap_lock);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2251
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2252
    // 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
  2253
    gc_count_before = SharedHeap::heap()->total_collections();
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2254
    full_gc_count_before = SharedHeap::heap()->total_full_collections();
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2255
  }
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2256
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2257
  if (should_do_concurrent_full_gc(cause)) {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2258
    // Schedule an initial-mark evacuation pause that will start a
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2259
    // 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
  2260
    // we are not requesting a post-GC allocation.
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2261
    VM_G1IncCollectionPause op(gc_count_before,
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2262
                               0,     /* word_size */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2263
                               true,  /* should_initiate_conc_mark */
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2264
                               g1_policy()->max_pause_time_ms(),
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2265
                               cause);
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2266
    VMThread::execute(&op);
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2267
  } else {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2268
    if (cause == GCCause::_gc_locker
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2269
        DEBUG_ONLY(|| cause == GCCause::_scavenge_alot)) {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2270
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2271
      // Schedule a standard evacuation pause. We're setting word_size
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2272
      // 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
  2273
      VM_G1IncCollectionPause op(gc_count_before,
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2274
                                 0,     /* word_size */
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2275
                                 false, /* should_initiate_conc_mark */
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2276
                                 g1_policy()->max_pause_time_ms(),
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2277
                                 cause);
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2278
      VMThread::execute(&op);
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2279
    } else {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2280
      // Schedule a Full GC.
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2281
      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
  2282
      VMThread::execute(&op);
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2283
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2284
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2285
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2286
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2287
bool G1CollectedHeap::is_in(const void* p) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2288
  if (_g1_committed.contains(p)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2289
    HeapRegion* hr = _hrs->addr_to_region(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2290
    return hr->is_in(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2291
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2292
    return _perm_gen->as_gen()->is_in(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2293
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2294
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2295
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2296
// Iteration functions.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2297
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2298
// Iterates an OopClosure over all ref-containing fields of objects
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2299
// within a HeapRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2300
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2301
class IterateOopClosureRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2302
  MemRegion _mr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2303
  OopClosure* _cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2304
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2305
  IterateOopClosureRegionClosure(MemRegion mr, OopClosure* cl)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2306
    : _mr(mr), _cl(cl) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2307
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2308
    if (! r->continuesHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2309
      r->oop_iterate(_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2310
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2311
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2312
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2313
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2314
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2315
void G1CollectedHeap::oop_iterate(OopClosure* cl, bool do_perm) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2316
  IterateOopClosureRegionClosure blk(_g1_committed, cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2317
  _hrs->iterate(&blk);
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2318
  if (do_perm) {
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2319
    perm_gen()->oop_iterate(cl);
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2320
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2321
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2322
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2323
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
  2324
  IterateOopClosureRegionClosure blk(mr, cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2325
  _hrs->iterate(&blk);
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2326
  if (do_perm) {
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2327
    perm_gen()->oop_iterate(cl);
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2328
  }
1374
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
// Iterates an ObjectClosure over all objects within a HeapRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2332
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2333
class IterateObjectClosureRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2334
  ObjectClosure* _cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2335
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2336
  IterateObjectClosureRegionClosure(ObjectClosure* cl) : _cl(cl) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2337
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2338
    if (! r->continuesHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2339
      r->object_iterate(_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2340
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2341
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2342
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2343
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2344
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2345
void G1CollectedHeap::object_iterate(ObjectClosure* cl, bool do_perm) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2346
  IterateObjectClosureRegionClosure blk(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2347
  _hrs->iterate(&blk);
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2348
  if (do_perm) {
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2349
    perm_gen()->object_iterate(cl);
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2350
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2351
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2352
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2353
void G1CollectedHeap::object_iterate_since_last_GC(ObjectClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2354
  // FIXME: is this right?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2355
  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
  2356
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2357
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2358
// Calls a SpaceClosure on a HeapRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2359
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2360
class SpaceClosureRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2361
  SpaceClosure* _cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2362
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2363
  SpaceClosureRegionClosure(SpaceClosure* cl) : _cl(cl) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2364
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2365
    _cl->do_space(r);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2366
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2367
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2368
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2369
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2370
void G1CollectedHeap::space_iterate(SpaceClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2371
  SpaceClosureRegionClosure blk(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2372
  _hrs->iterate(&blk);
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
void G1CollectedHeap::heap_region_iterate(HeapRegionClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2376
  _hrs->iterate(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2377
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2378
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2379
void G1CollectedHeap::heap_region_iterate_from(HeapRegion* r,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2380
                                               HeapRegionClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2381
  _hrs->iterate_from(r, cl);
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
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2385
G1CollectedHeap::heap_region_iterate_from(int idx, HeapRegionClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2386
  _hrs->iterate_from(idx, cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2387
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2388
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2389
HeapRegion* G1CollectedHeap::region_at(size_t idx) { return _hrs->at(idx); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2390
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2391
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2392
G1CollectedHeap::heap_region_par_iterate_chunked(HeapRegionClosure* cl,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2393
                                                 int worker,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2394
                                                 jint claim_value) {
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2395
  const size_t regions = n_regions();
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  2396
  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
  2397
  // 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
  2398
  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
  2399
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2400
  // each worker will actually look at all regions
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2401
  for (size_t count = 0; count < regions; ++count) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2402
    const size_t index = (start_index + count) % regions;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2403
    assert(0 <= index && index < regions, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2404
    HeapRegion* r = region_at(index);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2405
    // 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
  2406
    // when we come across their corresponding "start humongous"
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2407
    // region) and regions already claimed
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2408
    if (r->claim_value() == claim_value || r->continuesHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2409
      continue;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2410
    }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2411
    // OK, try to claim it
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2412
    if (r->claimHeapRegion(claim_value)) {
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2413
      // success!
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2414
      assert(!r->continuesHumongous(), "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2415
      if (r->startsHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2416
        // 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
  2417
        // "continues humongous" first; in fact we'll do them
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2418
        // 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
  2419
        // closure on the "starts humongous" region might de-allocate
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2420
        // 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
  2421
        // 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
  2422
        // 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
  2423
        // then we'll do the "starts humongous" region.
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2424
        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
  2425
          HeapRegion* chr = region_at(ch_index);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2426
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2427
          // 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
  2428
          // "continues humongous" we're done
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2429
          if (chr->claim_value() == claim_value ||
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2430
              !chr->continuesHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2431
            break;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2432
          }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2433
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2434
          // Noone should have claimed it directly. We can given
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2435
          // that we claimed its "starts humongous" region.
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2436
          assert(chr->claim_value() != claim_value, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2437
          assert(chr->humongous_start_region() == r, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2438
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2439
          if (chr->claimHeapRegion(claim_value)) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2440
            // 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
  2441
            // be trying to claim this region
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2442
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2443
            bool res2 = cl->doHeapRegion(chr);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2444
            assert(!res2, "Should not abort");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2445
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2446
            // 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
  2447
            // does something with "continues humongous" regions
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2448
            // 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
  2449
            // 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
  2450
            assert(chr->continuesHumongous(), "should still be the case");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2451
            assert(chr->humongous_start_region() == r, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2452
          } else {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2453
            guarantee(false, "we should not reach here");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2454
          }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2455
        }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2456
      }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2457
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2458
      assert(!r->continuesHumongous(), "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2459
      bool res = cl->doHeapRegion(r);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2460
      assert(!res, "Should not abort");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2461
    }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2462
  }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2463
}
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2464
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2465
class ResetClaimValuesClosure: public HeapRegionClosure {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2466
public:
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2467
  bool doHeapRegion(HeapRegion* r) {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2468
    r->set_claim_value(HeapRegion::InitialClaimValue);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2469
    return false;
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2470
  }
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2471
};
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2472
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2473
void
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2474
G1CollectedHeap::reset_heap_region_claim_values() {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2475
  ResetClaimValuesClosure blk;
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2476
  heap_region_iterate(&blk);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2477
}
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2478
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2479
#ifdef ASSERT
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2480
// 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
  2481
// 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
  2482
// humongous_start_region() information on "continues humongous"
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2483
// regions is correct.
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2484
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2485
class CheckClaimValuesClosure : public HeapRegionClosure {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2486
private:
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2487
  jint _claim_value;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2488
  size_t _failures;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2489
  HeapRegion* _sh_region;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2490
public:
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2491
  CheckClaimValuesClosure(jint claim_value) :
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2492
    _claim_value(claim_value), _failures(0), _sh_region(NULL) { }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2493
  bool doHeapRegion(HeapRegion* r) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2494
    if (r->claim_value() != _claim_value) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2495
      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
  2496
                             "claim value = %d, should be %d",
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2497
                             r->bottom(), r->end(), r->claim_value(),
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2498
                             _claim_value);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2499
      ++_failures;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2500
    }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2501
    if (!r->isHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2502
      _sh_region = NULL;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2503
    } else if (r->startsHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2504
      _sh_region = r;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2505
    } else if (r->continuesHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2506
      if (r->humongous_start_region() != _sh_region) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2507
        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
  2508
                               "HS = "PTR_FORMAT", should be "PTR_FORMAT,
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2509
                               r->bottom(), r->end(),
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2510
                               r->humongous_start_region(),
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2511
                               _sh_region);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2512
        ++_failures;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2513
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2514
    }
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2515
    return false;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2516
  }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2517
  size_t failures() {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2518
    return _failures;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2519
  }
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
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2522
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
  2523
  CheckClaimValuesClosure cl(claim_value);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2524
  heap_region_iterate(&cl);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2525
  return cl.failures() == 0;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2526
}
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2527
#endif // ASSERT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2528
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2529
void G1CollectedHeap::collection_set_iterate(HeapRegionClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2530
  HeapRegion* r = g1_policy()->collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2531
  while (r != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2532
    HeapRegion* next = r->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2533
    if (cl->doHeapRegion(r)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2534
      cl->incomplete();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2535
      return;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2536
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2537
    r = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2538
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2539
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2540
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2541
void G1CollectedHeap::collection_set_iterate_from(HeapRegion* r,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2542
                                                  HeapRegionClosure *cl) {
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2543
  if (r == NULL) {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2544
    // 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
  2545
    return;
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2546
  }
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2547
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2548
  assert(r->in_collection_set(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2549
         "Start region must be a member of the collection set.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2550
  HeapRegion* cur = r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2551
  while (cur != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2552
    HeapRegion* next = cur->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2553
    if (cl->doHeapRegion(cur) && false) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2554
      cl->incomplete();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2555
      return;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2556
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2557
    cur = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2558
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2559
  cur = g1_policy()->collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2560
  while (cur != r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2561
    HeapRegion* next = cur->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2562
    if (cl->doHeapRegion(cur) && false) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2563
      cl->incomplete();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2564
      return;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2565
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2566
    cur = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2567
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2568
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2569
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2570
CompactibleSpace* G1CollectedHeap::first_compactible_space() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2571
  return _hrs->length() > 0 ? _hrs->at(0) : NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2572
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2573
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2574
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2575
Space* G1CollectedHeap::space_containing(const void* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2576
  Space* res = heap_region_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2577
  if (res == NULL)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2578
    res = perm_gen()->space_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2579
  return res;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2580
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2581
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2582
HeapWord* G1CollectedHeap::block_start(const void* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2583
  Space* sp = space_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2584
  if (sp != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2585
    return sp->block_start(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2586
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2587
  return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2588
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2589
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2590
size_t G1CollectedHeap::block_size(const HeapWord* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2591
  Space* sp = space_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2592
  assert(sp != NULL, "block_size of address outside of heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2593
  return sp->block_size(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2594
}
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
bool G1CollectedHeap::block_is_obj(const HeapWord* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2597
  Space* sp = space_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2598
  return sp->block_is_obj(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2599
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2600
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2601
bool G1CollectedHeap::supports_tlab_allocation() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2602
  return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2603
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2604
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2605
size_t G1CollectedHeap::tlab_capacity(Thread* ignored) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2606
  return HeapRegion::GrainBytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2607
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2608
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2609
size_t G1CollectedHeap::unsafe_max_tlab_alloc(Thread* ignored) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2610
  // 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
  2611
  // the min TLAB size.
5078
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2612
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2613
  // 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
  2614
  // 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
  2615
  // humongous objects.
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2616
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2617
  HeapRegion* hr = _mutator_alloc_region.get();
5078
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2618
  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
  2619
  if (hr == NULL) {
5078
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2620
    return max_tlab_size;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2621
  } else {
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2622
    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
  2623
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2624
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2625
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2626
size_t G1CollectedHeap::large_typearray_limit() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2627
  // FIXME
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2628
  return HeapRegion::GrainBytes/HeapWordSize;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2629
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2630
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2631
size_t G1CollectedHeap::max_capacity() const {
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  2632
  return _g1_reserved.byte_size();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2633
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2634
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2635
jlong G1CollectedHeap::millis_since_last_gc() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2636
  // assert(false, "NYI");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2637
  return 0;
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2640
void G1CollectedHeap::prepare_for_verify() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2641
  if (SafepointSynchronize::is_at_safepoint() || ! UseTLAB) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2642
    ensure_parsability(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2643
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2644
  g1_rem_set()->prepare_for_verify();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2645
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2646
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2647
class VerifyLivenessOopClosure: public OopClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2648
  G1CollectedHeap* g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2649
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2650
  VerifyLivenessOopClosure(G1CollectedHeap* _g1h) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2651
    g1h = _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2652
  }
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2653
  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
  2654
  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
  2655
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2656
  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
  2657
    oop obj = oopDesc::load_decode_heap_oop(p);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2658
    guarantee(obj == NULL || !g1h->is_obj_dead(obj),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2659
              "Dead object referenced by a not dead object");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2660
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2661
};
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
class VerifyObjsInRegionClosure: public ObjectClosure {
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2664
private:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2665
  G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2666
  size_t _live_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2667
  HeapRegion *_hr;
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2668
  bool _use_prev_marking;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2669
public:
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2670
  // use_prev_marking == true  -> use "prev" marking information,
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2671
  // use_prev_marking == false -> use "next" marking information
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2672
  VerifyObjsInRegionClosure(HeapRegion *hr, bool use_prev_marking)
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2673
    : _live_bytes(0), _hr(hr), _use_prev_marking(use_prev_marking) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2674
    _g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2675
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2676
  void do_object(oop o) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2677
    VerifyLivenessOopClosure isLive(_g1h);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2678
    assert(o != NULL, "Huh?");
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2679
    if (!_g1h->is_obj_dead_cond(o, _use_prev_marking)) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2680
      o->oop_iterate(&isLive);
5345
d3bd6e8757d8 6943926: G1: Integer overflow during heap region verification
johnc
parents: 5344
diff changeset
  2681
      if (!_hr->obj_allocated_since_prev_marking(o)) {
d3bd6e8757d8 6943926: G1: Integer overflow during heap region verification
johnc
parents: 5344
diff changeset
  2682
        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
  2683
        _live_bytes += (obj_size * HeapWordSize);
d3bd6e8757d8 6943926: G1: Integer overflow during heap region verification
johnc
parents: 5344
diff changeset
  2684
      }
1374
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 live_bytes() { return _live_bytes; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2688
};
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
class PrintObjsInRegionClosure : public ObjectClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2691
  HeapRegion *_hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2692
  G1CollectedHeap *_g1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2693
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2694
  PrintObjsInRegionClosure(HeapRegion *hr) : _hr(hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2695
    _g1 = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2696
  };
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2697
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2698
  void do_object(oop o) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2699
    if (o != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2700
      HeapWord *start = (HeapWord *) o;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2701
      size_t word_sz = o->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2702
      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
  2703
                          " isMarkedPrev %d isMarkedNext %d isAllocSince %d\n",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2704
                          (void*) o, word_sz,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2705
                          _g1->isMarkedPrev(o),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2706
                          _g1->isMarkedNext(o),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2707
                          _hr->obj_allocated_since_prev_marking(o));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2708
      HeapWord *end = start + word_sz;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2709
      HeapWord *cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2710
      int *val;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2711
      for (cur = start; cur < end; cur++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2712
        val = (int *) cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2713
        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
  2714
      }
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
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2718
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2719
class VerifyRegionClosure: public HeapRegionClosure {
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2720
private:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2721
  bool _allow_dirty;
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2722
  bool _par;
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2723
  bool _use_prev_marking;
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2724
  bool _failures;
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2725
public:
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2726
  // use_prev_marking == true  -> use "prev" marking information,
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2727
  // use_prev_marking == false -> use "next" marking information
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2728
  VerifyRegionClosure(bool allow_dirty, bool par, bool use_prev_marking)
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2729
    : _allow_dirty(allow_dirty),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2730
      _par(par),
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2731
      _use_prev_marking(use_prev_marking),
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2732
      _failures(false) {}
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2733
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2734
  bool failures() {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2735
    return _failures;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2736
  }
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2737
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2738
  bool doHeapRegion(HeapRegion* r) {
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2739
    guarantee(_par || r->claim_value() == HeapRegion::InitialClaimValue,
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2740
              "Should be unclaimed at verify points.");
2249
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  2741
    if (!r->continuesHumongous()) {
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2742
      bool failures = false;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2743
      r->verify(_allow_dirty, _use_prev_marking, &failures);
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2744
      if (failures) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2745
        _failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2746
      } else {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2747
        VerifyObjsInRegionClosure not_dead_yet_cl(r, _use_prev_marking);
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2748
        r->object_iterate(&not_dead_yet_cl);
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2749
        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
  2750
          gclog_or_tty->print_cr("["PTR_FORMAT","PTR_FORMAT"] "
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2751
                                 "max_live_bytes "SIZE_FORMAT" "
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2752
                                 "< calculated "SIZE_FORMAT,
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2753
                                 r->bottom(), r->end(),
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2754
                                 r->max_live_bytes(),
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2755
                                 not_dead_yet_cl.live_bytes());
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2756
          _failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2757
        }
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2758
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2759
    }
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2760
    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
  2761
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2762
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2763
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2764
class VerifyRootsClosure: public OopsInGenClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2765
private:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2766
  G1CollectedHeap* _g1h;
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2767
  bool             _use_prev_marking;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2768
  bool             _failures;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2769
public:
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2770
  // use_prev_marking == true  -> use "prev" marking information,
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2771
  // use_prev_marking == false -> use "next" marking information
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2772
  VerifyRootsClosure(bool use_prev_marking) :
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2773
    _g1h(G1CollectedHeap::heap()),
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2774
    _use_prev_marking(use_prev_marking),
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2775
    _failures(false) { }
1374
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
  bool failures() { return _failures; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2778
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2779
  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
  2780
    T heap_oop = oopDesc::load_heap_oop(p);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2781
    if (!oopDesc::is_null(heap_oop)) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2782
      oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2783
      if (_g1h->is_obj_dead_cond(obj, _use_prev_marking)) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2784
        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
  2785
                              "points to dead obj "PTR_FORMAT, p, (void*) obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2786
        obj->print_on(gclog_or_tty);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2787
        _failures = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2788
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2789
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2790
  }
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2791
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2792
  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
  2793
  void do_oop(narrowOop* p) { do_oop_nv(p); }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2794
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2795
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2796
// This is the task used for parallel heap verification.
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2797
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2798
class G1ParVerifyTask: public AbstractGangTask {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2799
private:
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2800
  G1CollectedHeap* _g1h;
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2801
  bool _allow_dirty;
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2802
  bool _use_prev_marking;
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2803
  bool _failures;
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2804
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2805
public:
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2806
  // use_prev_marking == true  -> use "prev" marking information,
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2807
  // use_prev_marking == false -> use "next" marking information
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2808
  G1ParVerifyTask(G1CollectedHeap* g1h, bool allow_dirty,
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2809
                  bool use_prev_marking) :
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2810
    AbstractGangTask("Parallel verify task"),
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2811
    _g1h(g1h),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2812
    _allow_dirty(allow_dirty),
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2813
    _use_prev_marking(use_prev_marking),
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2814
    _failures(false) { }
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2815
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2816
  bool failures() {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2817
    return _failures;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2818
  }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2819
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2820
  void work(int worker_i) {
2249
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  2821
    HandleMark hm;
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2822
    VerifyRegionClosure blk(_allow_dirty, true, _use_prev_marking);
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2823
    _g1h->heap_region_par_iterate_chunked(&blk, worker_i,
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2824
                                          HeapRegion::ParVerifyClaimValue);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2825
    if (blk.failures()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2826
      _failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2827
    }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2828
  }
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2829
};
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2830
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2831
void G1CollectedHeap::verify(bool allow_dirty, bool silent) {
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2832
  verify(allow_dirty, silent, /* use_prev_marking */ true);
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2833
}
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2834
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2835
void G1CollectedHeap::verify(bool allow_dirty,
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2836
                             bool silent,
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2837
                             bool use_prev_marking) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2838
  if (SafepointSynchronize::is_at_safepoint() || ! UseTLAB) {
9342
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  2839
    if (!silent) { gclog_or_tty->print("Roots (excluding permgen) "); }
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2840
    VerifyRootsClosure rootsCl(use_prev_marking);
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  2841
    CodeBlobToOopClosure blobsCl(&rootsCl, /*do_marking=*/ false);
9342
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  2842
    // 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
  2843
    // 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
  2844
    const int so = SharedHeap::SO_AllClasses | SharedHeap::SO_Strings | SharedHeap::SO_CodeCache;
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  2845
    process_strong_roots(true,      // activate StrongRootsScope
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  2846
                         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
  2847
                                    // 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
  2848
                         SharedHeap::ScanningOption(so),  // roots scanning options
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2849
                         &rootsCl,
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  2850
                         &blobsCl,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2851
                         &rootsCl);
9342
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  2852
    // Since we used "collecting_perm_gen" == true above, we will not have
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  2853
    // checked the refs from perm into the G1-collected heap. We check those
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  2854
    // references explicitly below. Whether the relevant cards are dirty
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  2855
    // is checked further below in the rem set verification.
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  2856
    if (!silent) { gclog_or_tty->print("Permgen roots "); }
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  2857
    perm_gen()->oop_iterate(&rootsCl);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2858
    bool failures = rootsCl.failures();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2859
    if (!silent) { gclog_or_tty->print("HeapRegionSets "); }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2860
    verify_region_sets();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2861
    if (!silent) { gclog_or_tty->print("HeapRegions "); }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2862
    if (GCParallelVerificationEnabled && ParallelGCThreads > 1) {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2863
      assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2864
             "sanity check");
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2865
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2866
      G1ParVerifyTask task(this, allow_dirty, use_prev_marking);
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2867
      int n_workers = workers()->total_workers();
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2868
      set_par_threads(n_workers);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2869
      workers()->run_task(&task);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2870
      set_par_threads(0);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2871
      if (task.failures()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2872
        failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2873
      }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2874
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2875
      assert(check_heap_region_claim_values(HeapRegion::ParVerifyClaimValue),
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2876
             "sanity check");
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2877
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2878
      reset_heap_region_claim_values();
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2879
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2880
      assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2881
             "sanity check");
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2882
    } else {
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2883
      VerifyRegionClosure blk(allow_dirty, false, use_prev_marking);
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2884
      _hrs->iterate(&blk);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2885
      if (blk.failures()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2886
        failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2887
      }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2888
    }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2889
    if (!silent) gclog_or_tty->print("RemSet ");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2890
    rem_set()->verify();
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2891
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2892
    if (failures) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2893
      gclog_or_tty->print_cr("Heap:");
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2894
      print_on(gclog_or_tty, true /* extended */);
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2895
      gclog_or_tty->print_cr("");
5542
be05c5ffe905 6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents: 5540
diff changeset
  2896
#ifndef PRODUCT
4099
77d31ea5a439 6890137: G1: revamp reachable object dump
tonyp
parents: 4023
diff changeset
  2897
      if (VerifyDuringGC && G1VerifyDuringGCPrintReachable) {
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5343
diff changeset
  2898
        concurrent_mark()->print_reachable("at-verification-failure",
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5343
diff changeset
  2899
                                           use_prev_marking, false /* all */);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2900
      }
5542
be05c5ffe905 6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents: 5540
diff changeset
  2901
#endif
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2902
      gclog_or_tty->flush();
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2903
    }
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2904
    guarantee(!failures, "there should not have been any failures");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2905
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2906
    if (!silent) gclog_or_tty->print("(SKIPPING roots, heapRegions, remset) ");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2907
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2908
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2909
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2910
class PrintRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2911
  outputStream* _st;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2912
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2913
  PrintRegionClosure(outputStream* st) : _st(st) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2914
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2915
    r->print_on(_st);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2916
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2917
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2918
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2919
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2920
void G1CollectedHeap::print() const { print_on(tty); }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2921
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2922
void G1CollectedHeap::print_on(outputStream* st) const {
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2923
  print_on(st, PrintHeapAtGCExtended);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2924
}
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2925
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2926
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
  2927
  st->print(" %-20s", "garbage-first heap");
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2928
  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
  2929
            capacity()/K, used_unlocked()/K);
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2930
  st->print(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", " INTPTR_FORMAT ")",
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2931
            _g1_storage.low_boundary(),
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2932
            _g1_storage.high(),
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2933
            _g1_storage.high_boundary());
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2934
  st->cr();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2935
  st->print("  region size " SIZE_FORMAT "K, ",
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2936
            HeapRegion::GrainBytes/K);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2937
  size_t young_regions = _young_list->length();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2938
  st->print(SIZE_FORMAT " young (" SIZE_FORMAT "K), ",
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2939
            young_regions, young_regions * HeapRegion::GrainBytes / K);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2940
  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
  2941
  st->print(SIZE_FORMAT " survivors (" SIZE_FORMAT "K)",
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2942
            survivor_regions, survivor_regions * HeapRegion::GrainBytes / K);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2943
  st->cr();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2944
  perm()->as_gen()->print_on(st);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2945
  if (extended) {
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2946
    st->cr();
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2947
    print_on_extended(st);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2948
  }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2949
}
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2950
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  2951
void G1CollectedHeap::print_on_extended(outputStream* st) const {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2952
  PrintRegionClosure blk(st);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2953
  _hrs->iterate(&blk);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2954
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2955
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2956
void G1CollectedHeap::print_gc_threads_on(outputStream* st) const {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  2957
  if (G1CollectedHeap::use_parallel_gc_threads()) {
4022
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  2958
    workers()->print_worker_threads_on(st);
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  2959
  }
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  2960
  _cmThread->print_on(st);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2961
  st->cr();
4022
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  2962
  _cm->print_worker_threads_on(st);
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  2963
  _cg1r->print_worker_threads_on(st);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2964
  st->cr();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2965
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2966
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2967
void G1CollectedHeap::gc_threads_do(ThreadClosure* tc) const {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  2968
  if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2969
    workers()->threads_do(tc);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2970
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2971
  tc->do_thread(_cmThread);
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2972
  _cg1r->threads_do(tc);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2973
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2974
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2975
void G1CollectedHeap::print_tracing_info() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2976
  // We'll overload this to mean "trace GC pause statistics."
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2977
  if (TraceGen0Time || TraceGen1Time) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2978
    // The "G1CollectorPolicy" is keeping track of these stats, so delegate
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2979
    // to that.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2980
    g1_policy()->print_tracing_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2981
  }
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2345
diff changeset
  2982
  if (G1SummarizeRSetStats) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2983
    g1_rem_set()->print_summary_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2984
  }
5033
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
  2985
  if (G1SummarizeConcMark) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2986
    concurrent_mark()->print_summary_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2987
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2988
  g1_policy()->print_yg_surv_rate_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2989
  SpecializationStats::print();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2990
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2991
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2992
int G1CollectedHeap::addr_to_arena_id(void* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2993
  HeapRegion* hr = heap_region_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2994
  if (hr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2995
    return 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2996
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2997
    return 1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2998
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2999
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3000
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3001
G1CollectedHeap* G1CollectedHeap::heap() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3002
  assert(_sh->kind() == CollectedHeap::G1CollectedHeap,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3003
         "not a garbage-first heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3004
  return _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3005
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3006
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3007
void G1CollectedHeap::gc_prologue(bool full /* Ignored */) {
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4637
diff changeset
  3008
  // always_do_update_barrier = false;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3009
  assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3010
  // Call allocation profiler
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3011
  AllocationProfiler::iterate_since_last_gc();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3012
  // Fill TLAB's and such
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3013
  ensure_parsability(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3014
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3015
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3016
void G1CollectedHeap::gc_epilogue(bool full /* Ignored */) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3017
  // FIXME: what is this about?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3018
  // I'm ignoring the "fill_newgen()" call if "alloc_event_enabled"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3019
  // is set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3020
  COMPILER2_PRESENT(assert(DerivedPointerTable::is_empty(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3021
                        "derived pointer present"));
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4637
diff changeset
  3022
  // always_do_update_barrier = true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3023
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3024
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3025
HeapWord* G1CollectedHeap::do_collection_pause(size_t word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3026
                                               unsigned int gc_count_before,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3027
                                               bool* succeeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3028
  assert_heap_not_locked_and_not_at_safepoint();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3029
  g1_policy()->record_stop_world_start();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3030
  VM_G1IncCollectionPause op(gc_count_before,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3031
                             word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3032
                             false, /* should_initiate_conc_mark */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3033
                             g1_policy()->max_pause_time_ms(),
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3034
                             GCCause::_g1_inc_collection_pause);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3035
  VMThread::execute(&op);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3036
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3037
  HeapWord* result = op.result();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3038
  bool ret_succeeded = op.prologue_succeeded() && op.pause_succeeded();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3039
  assert(result == NULL || ret_succeeded,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3040
         "the result should be NULL if the VM did not succeed");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3041
  *succeeded = ret_succeeded;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3042
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3043
  assert_heap_not_locked();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3044
  return result;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3045
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3046
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3047
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3048
G1CollectedHeap::doConcurrentMark() {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3049
  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
  3050
  if (!_cmThread->in_progress()) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3051
    _cmThread->set_started();
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3052
    CGC_lock->notify();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3053
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3054
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3055
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3056
class VerifyMarkedObjsClosure: public ObjectClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3057
    G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3058
    public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3059
    VerifyMarkedObjsClosure(G1CollectedHeap* g1h) : _g1h(g1h) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3060
    void do_object(oop obj) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3061
      assert(obj->mark()->is_marked() ? !_g1h->is_obj_dead(obj) : true,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3062
             "markandsweep mark should agree with concurrent deadness");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3063
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3064
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3065
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3066
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3067
G1CollectedHeap::checkConcurrentMark() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3068
    VerifyMarkedObjsClosure verifycl(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3069
    //    MutexLockerEx x(getMarkBitMapLock(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3070
    //              Mutex::_no_safepoint_check_flag);
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  3071
    object_iterate(&verifycl, false);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3072
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3073
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3074
void G1CollectedHeap::do_sync_mark() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3075
  _cm->checkpointRootsInitial();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3076
  _cm->markFromRoots();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3077
  _cm->checkpointRootsFinal(false);
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
// <NEW PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3081
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3082
double G1CollectedHeap::predict_region_elapsed_time_ms(HeapRegion *hr,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3083
                                                       bool young) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3084
  return _g1_policy->predict_region_elapsed_time_ms(hr, young);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3085
}
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
void G1CollectedHeap::check_if_region_is_too_expensive(double
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3088
                                                           predicted_time_ms) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3089
  _g1_policy->check_if_region_is_too_expensive(predicted_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3090
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3091
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3092
size_t G1CollectedHeap::pending_card_num() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3093
  size_t extra_cards = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3094
  JavaThread *curr = Threads::first();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3095
  while (curr != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3096
    DirtyCardQueue& dcq = curr->dirty_card_queue();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3097
    extra_cards += dcq.size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3098
    curr = curr->next();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3099
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3100
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3101
  size_t buffer_size = dcqs.buffer_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3102
  size_t buffer_num = dcqs.completed_buffers_num();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3103
  return buffer_size * buffer_num + extra_cards;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3104
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3105
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3106
size_t G1CollectedHeap::max_pending_card_num() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3107
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3108
  size_t buffer_size = dcqs.buffer_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3109
  size_t buffer_num  = dcqs.completed_buffers_num();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3110
  int thread_num  = Threads::number_of_threads();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3111
  return (buffer_num + thread_num) * buffer_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3112
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3113
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3114
size_t G1CollectedHeap::cards_scanned() {
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  3115
  return g1_rem_set()->cardsScanned();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3116
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3117
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3118
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3119
G1CollectedHeap::setup_surviving_young_words() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3120
  guarantee( _surviving_young_words == NULL, "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3121
  size_t array_length = g1_policy()->young_cset_length();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3122
  _surviving_young_words = NEW_C_HEAP_ARRAY(size_t, array_length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3123
  if (_surviving_young_words == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3124
    vm_exit_out_of_memory(sizeof(size_t) * array_length,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3125
                          "Not enough space for young surv words summary.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3126
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3127
  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
  3128
#ifdef ASSERT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3129
  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
  3130
    assert( _surviving_young_words[i] == 0, "memset above" );
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3131
  }
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3132
#endif // !ASSERT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3133
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3134
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3135
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3136
G1CollectedHeap::update_surviving_young_words(size_t* surv_young_words) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3137
  MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3138
  size_t array_length = g1_policy()->young_cset_length();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3139
  for (size_t i = 0; i < array_length; ++i)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3140
    _surviving_young_words[i] += surv_young_words[i];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3141
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3142
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3143
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3144
G1CollectedHeap::cleanup_surviving_young_words() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3145
  guarantee( _surviving_young_words != NULL, "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3146
  FREE_C_HEAP_ARRAY(size_t, _surviving_young_words);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3147
  _surviving_young_words = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3148
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3149
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3150
// </NEW PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3151
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3152
struct PrepareForRSScanningClosure : public HeapRegionClosure {
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3153
  bool doHeapRegion(HeapRegion *r) {
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3154
    r->rem_set()->set_iter_claimed(0);
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3155
    return false;
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3156
  }
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3157
};
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3158
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3159
#if TASKQUEUE_STATS
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3160
void G1CollectedHeap::print_taskqueue_stats_hdr(outputStream* const st) {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3161
  st->print_raw_cr("GC Task Stats");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3162
  st->print_raw("thr "); TaskQueueStats::print_header(1, st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3163
  st->print_raw("--- "); TaskQueueStats::print_header(2, st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3164
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3165
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3166
void G1CollectedHeap::print_taskqueue_stats(outputStream* const st) const {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3167
  print_taskqueue_stats_hdr(st);
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3168
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3169
  TaskQueueStats totals;
6425
206fd9fee2cf 6978300: G1: debug builds crash if ParallelGCThreads==0
jcoomes
parents: 6261
diff changeset
  3170
  const int n = workers() != NULL ? workers()->total_workers() : 1;
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3171
  for (int i = 0; i < n; ++i) {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3172
    st->print("%3d ", i); task_queue(i)->stats.print(st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3173
    totals += task_queue(i)->stats;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3174
  }
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3175
  st->print_raw("tot "); totals.print(st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3176
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3177
  DEBUG_ONLY(totals.verify());
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3178
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3179
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3180
void G1CollectedHeap::reset_taskqueue_stats() {
6425
206fd9fee2cf 6978300: G1: debug builds crash if ParallelGCThreads==0
jcoomes
parents: 6261
diff changeset
  3181
  const int n = workers() != NULL ? workers()->total_workers() : 1;
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3182
  for (int i = 0; i < n; ++i) {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3183
    task_queue(i)->stats.reset();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3184
  }
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3185
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3186
#endif // TASKQUEUE_STATS
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3187
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3188
bool
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3189
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
  3190
  assert_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3191
  guarantee(!is_gc_active(), "collection is not reentrant");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3192
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3193
  if (GC_locker::check_active_before_gc()) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3194
    return false;
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3195
  }
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3196
7896
08aadd7aa3ee 6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents: 7659
diff changeset
  3197
  SvcGCMarker sgcm(SvcGCMarker::MINOR);
7659
1d92613a1e8a 6896624: G1: hotspot:::gc and hotspot:::mem-pool-gc probes are not fired
tonyp
parents: 7658
diff changeset
  3198
  ResourceMark rm;
1d92613a1e8a 6896624: G1: hotspot:::gc and hotspot:::mem-pool-gc probes are not fired
tonyp
parents: 7658
diff changeset
  3199
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3200
  if (PrintHeapAtGC) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3201
    Universe::print_heap_before_gc();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3202
  }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3203
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3204
  verify_region_sets_optional();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3205
  verify_dirty_young_regions();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3206
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3207
  {
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3208
    // 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
  3209
    // 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
  3210
    // for the duration of this pause.
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3211
    g1_policy()->decide_on_conc_mark_initiation();
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3212
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3213
    char verbose_str[128];
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3214
    sprintf(verbose_str, "GC pause ");
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3215
    if (g1_policy()->in_young_gc_mode()) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3216
      if (g1_policy()->full_young_gcs())
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3217
        strcat(verbose_str, "(young)");
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3218
      else
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3219
        strcat(verbose_str, "(partial)");
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3220
    }
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3221
    if (g1_policy()->during_initial_mark_pause()) {
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3222
      strcat(verbose_str, " (initial-mark)");
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3223
      // 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
  3224
      // full collection counter.
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3225
      increment_total_full_collections();
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3226
    }
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3227
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3228
    // 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
  3229
    // 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
  3230
    // is messy if we do.
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3231
    gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3232
    TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3233
    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
  3234
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  3235
    TraceCollectorStats tcs(g1mm()->incremental_collection_counters());
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents: 9424
diff changeset
  3236
    TraceMemoryManagerStats tms(false /* fullGC */, gc_cause());
4459
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  3237
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3238
    // If the secondary_free_list is not empty, append it to the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3239
    // free_list. No need to wait for the cleanup operation to finish;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3240
    // the region allocation code will check the secondary_free_list
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3241
    // and wait if necessary. If the G1StressConcRegionFreeing flag is
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3242
    // set, skip this step so that the region allocation code has to
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3243
    // get entries from the secondary_free_list.
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3244
    if (!G1StressConcRegionFreeing) {
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3245
      append_secondary_free_list_if_not_empty_with_lock();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3246
    }
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3247
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3248
    increment_gc_time_stamp();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3249
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3250
    if (g1_policy()->in_young_gc_mode()) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3251
      assert(check_young_list_well_formed(),
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3252
             "young list should be well formed");
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3253
    }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3254
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3255
    { // 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
  3256
      IsGCActiveMark x;
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3257
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3258
      gc_prologue(false);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3259
      increment_total_collections(false /* full gc */);
1374
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
#if G1_REM_SET_LOGGING
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3262
      gclog_or_tty->print_cr("\nJust chose CS, heap:");
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3263
      print();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3264
#endif
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3265
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3266
      if (VerifyBeforeGC && total_collections() >= VerifyGCStartAt) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3267
        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
  3268
        gclog_or_tty->print(" VerifyBeforeGC:");
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3269
        prepare_for_verify();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3270
        Universe::verify(false);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3271
      }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3272
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3273
      COMPILER2_PRESENT(DerivedPointerTable::clear());
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3274
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  3275
      // Please see comment in G1CollectedHeap::ref_processing_init()
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  3276
      // to see how reference processing currently works in G1.
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  3277
      //
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3278
      // We want to turn off ref discovery, if necessary, and turn it back on
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3279
      // on again later if we do. XXX Dubious: why is discovery disabled?
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3280
      bool was_enabled = ref_processor()->discovery_enabled();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3281
      if (was_enabled) ref_processor()->disable_discovery();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3282
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3283
      // Forget the current alloc region (we might even choose it to be part
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3284
      // of the collection set!).
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3285
      release_mutator_alloc_region();
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3286
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3287
      // The elapsed time induced by the start time below deliberately elides
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3288
      // the possible verification above.
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3289
      double start_time_sec = os::elapsedTime();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3290
      size_t start_used_bytes = used();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3291
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3292
#if YOUNG_LIST_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3293
      gclog_or_tty->print_cr("\nBefore recording pause start.\nYoung_list:");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3294
      _young_list->print();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3295
      g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3296
#endif // YOUNG_LIST_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3297
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3298
      g1_policy()->record_collection_pause_start(start_time_sec,
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3299
                                                 start_used_bytes);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3300
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3301
#if YOUNG_LIST_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3302
      gclog_or_tty->print_cr("\nAfter recording pause start.\nYoung_list:");
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3303
      _young_list->print();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3304
#endif // YOUNG_LIST_VERBOSE
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3305
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3306
      if (g1_policy()->during_initial_mark_pause()) {
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3307
        concurrent_mark()->checkpointRootsInitialPre();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3308
      }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3309
      save_marks();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3310
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3311
      // We must do this before any possible evacuation that should propagate
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3312
      // marks.
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3313
      if (mark_in_progress()) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3314
        double start_time_sec = os::elapsedTime();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3315
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3316
        _cm->drainAllSATBBuffers();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3317
        double finish_mark_ms = (os::elapsedTime() - start_time_sec) * 1000.0;
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3318
        g1_policy()->record_satb_drain_time(finish_mark_ms);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3319
      }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3320
      // Record the number of elements currently on the mark stack, so we
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3321
      // only iterate over these.  (Since evacuation may add to the mark
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3322
      // stack, doing more exposes race conditions.)  If no mark is in
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3323
      // progress, this will be zero.
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3324
      _cm->set_oops_do_bound();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3325
9936
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9935
diff changeset
  3326
      if (mark_in_progress()) {
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3327
        concurrent_mark()->newCSet();
9936
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9935
diff changeset
  3328
      }
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3329
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3330
#if YOUNG_LIST_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3331
      gclog_or_tty->print_cr("\nBefore choosing collection set.\nYoung_list:");
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3332
      _young_list->print();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3333
      g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3334
#endif // YOUNG_LIST_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3335
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3336
      g1_policy()->choose_collection_set(target_pause_time_ms);
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3337
9936
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9935
diff changeset
  3338
      // We have chosen the complete collection set. If marking is
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9935
diff changeset
  3339
      // active then, we clear the region fields of any of the
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9935
diff changeset
  3340
      // concurrent marking tasks whose region fields point into
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9935
diff changeset
  3341
      // the collection set as these values will become stale. This
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9935
diff changeset
  3342
      // will cause the owning marking threads to claim a new region
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9935
diff changeset
  3343
      // when marking restarts.
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9935
diff changeset
  3344
      if (mark_in_progress()) {
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9935
diff changeset
  3345
        concurrent_mark()->reset_active_task_region_fields_in_cset();
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9935
diff changeset
  3346
      }
59dac2950cc7 7041440: G1: assert(obj->is_oop_or_null(true )) failed: Error #
johnc
parents: 9935
diff changeset
  3347
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3348
      // Nothing to do if we were unable to choose a collection set.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3349
#if G1_REM_SET_LOGGING
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3350
      gclog_or_tty->print_cr("\nAfter pause, heap:");
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3351
      print();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3352
#endif
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3353
      PrepareForRSScanningClosure prepare_for_rs_scan;
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3354
      collection_set_iterate(&prepare_for_rs_scan);
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3355
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3356
      setup_surviving_young_words();
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3357
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3358
      // Set up the gc allocation regions.
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3359
      get_gc_alloc_regions();
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3360
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3361
      // Actually do the work...
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3362
      evacuate_collection_set();
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3363
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3364
      free_collection_set(g1_policy()->collection_set());
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3365
      g1_policy()->clear_collection_set();
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3366
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3367
      cleanup_surviving_young_words();
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3368
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3369
      // Start a new incremental collection set for the next pause.
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3370
      g1_policy()->start_incremental_cset_building();
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3371
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3372
      // Clear the _cset_fast_test bitmap in anticipation of adding
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3373
      // regions to the incremental collection set for the next
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3374
      // evacuation pause.
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3375
      clear_cset_fast_test();
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3376
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3377
      if (g1_policy()->in_young_gc_mode()) {
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3378
        _young_list->reset_sampled_info();
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3379
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3380
        // Don't check the whole heap at this point as the
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3381
        // GC alloc regions from this pause have been tagged
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3382
        // as survivors and moved on to the survivor list.
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3383
        // Survivor regions will fail the !is_young() check.
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3384
        assert(check_young_list_empty(false /* check_heap */),
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3385
               "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
  3386
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3387
#if YOUNG_LIST_VERBOSE
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3388
        gclog_or_tty->print_cr("Before recording survivors.\nYoung List:");
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3389
        _young_list->print();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3390
#endif // YOUNG_LIST_VERBOSE
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3391
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3392
        g1_policy()->record_survivor_regions(_young_list->survivor_length(),
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3393
                                          _young_list->first_survivor_region(),
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3394
                                          _young_list->last_survivor_region());
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3395
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3396
        _young_list->reset_auxilary_lists();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3397
      }
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
      if (evacuation_failed()) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3400
        _summary_bytes_used = recalculate_used();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3401
      } else {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3402
        // The "used" of the the collection set have already been subtracted
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3403
        // when they were freed.  Add in the bytes evacuated.
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3404
        _summary_bytes_used += g1_policy()->bytes_in_to_space();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3405
      }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3406
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3407
      if (g1_policy()->in_young_gc_mode() &&
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3408
          g1_policy()->during_initial_mark_pause()) {
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3409
        concurrent_mark()->checkpointRootsInitialPost();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3410
        set_marking_started();
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3411
        // CAUTION: after the doConcurrentMark() call below,
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3412
        // the concurrent marking thread(s) could be running
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3413
        // concurrently with us. Make sure that anything after
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3414
        // this point does not assume that we are the only GC thread
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3415
        // running. Note: of course, the actual marking work will
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3416
        // not start until the safepoint itself is released in
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3417
        // ConcurrentGCThread::safepoint_desynchronize().
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3418
        doConcurrentMark();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3419
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3420
9334
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  3421
      allocate_dummy_regions();
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  3422
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3423
#if YOUNG_LIST_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3424
      gclog_or_tty->print_cr("\nEnd of the pause.\nYoung_list:");
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3425
      _young_list->print();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3426
      g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty);
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3427
#endif // YOUNG_LIST_VERBOSE
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3428
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3429
      init_mutator_alloc_region();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3430
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3431
      double end_time_sec = os::elapsedTime();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3432
      double pause_time_ms = (end_time_sec - start_time_sec) * MILLIUNITS;
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3433
      g1_policy()->record_pause_time_ms(pause_time_ms);
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3434
      g1_policy()->record_collection_pause_end();
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3435
4459
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  3436
      MemoryService::track_memory_usage();
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  3437
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3438
      if (VerifyAfterGC && total_collections() >= VerifyGCStartAt) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3439
        HandleMark hm;  // Discard invalid handles created during verification
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3440
        gclog_or_tty->print(" VerifyAfterGC:");
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3441
        prepare_for_verify();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3442
        Universe::verify(false);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3443
      }
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3444
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3445
      if (was_enabled) ref_processor()->enable_discovery();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3446
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3447
      {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3448
        size_t expand_bytes = g1_policy()->expansion_amount();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3449
        if (expand_bytes > 0) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3450
          size_t bytes_before = capacity();
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  3451
          if (!expand(expand_bytes)) {
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  3452
            // 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
  3453
            // committed/uncommitted amount match the backing store
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  3454
            assert(capacity() == _g1_storage.committed_size(), "committed size mismatch");
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  3455
            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
  3456
          }
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3457
        }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3458
      }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3459
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3460
      if (mark_in_progress()) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3461
        concurrent_mark()->update_g1_committed();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3462
      }
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  3463
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  3464
#ifdef TRACESPINNING
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3465
      ParallelTaskTerminator::print_termination_counts();
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  3466
#endif
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3467
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3468
      gc_epilogue(false);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3469
    }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3470
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3471
    if (ExitAfterGCNum > 0 && total_collections() == ExitAfterGCNum) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3472
      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
  3473
      print_tracing_info();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3474
      vm_exit(-1);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3475
    }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3476
  }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3477
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3478
  verify_region_sets_optional();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3479
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3480
  TASKQUEUE_STATS_ONLY(if (ParallelGCVerbose) print_taskqueue_stats());
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3481
  TASKQUEUE_STATS_ONLY(reset_taskqueue_stats());
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3482
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3483
  if (PrintHeapAtGC) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3484
    Universe::print_heap_after_gc();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3485
  }
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  3486
  g1mm()->update_counters();
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  3487
3584
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  3488
  if (G1SummarizeRSetStats &&
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  3489
      (G1SummarizeRSetStatsPeriod > 0) &&
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  3490
      (total_collections() % G1SummarizeRSetStatsPeriod == 0)) {
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  3491
    g1_rem_set()->print_summary_info();
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  3492
  }
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3493
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3494
  return true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3495
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3496
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3497
size_t G1CollectedHeap::desired_plab_sz(GCAllocPurpose purpose)
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3498
{
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3499
  size_t gclab_word_size;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3500
  switch (purpose) {
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3501
    case GCAllocForSurvived:
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3502
      gclab_word_size = YoungPLABSize;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3503
      break;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3504
    case GCAllocForTenured:
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3505
      gclab_word_size = OldPLABSize;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3506
      break;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3507
    default:
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3508
      assert(false, "unknown GCAllocPurpose");
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3509
      gclab_word_size = OldPLABSize;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3510
      break;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3511
  }
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3512
  return gclab_word_size;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3513
}
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3514
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3515
void G1CollectedHeap::init_mutator_alloc_region() {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3516
  assert(_mutator_alloc_region.get() == NULL, "pre-condition");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3517
  _mutator_alloc_region.init();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3518
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3519
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3520
void G1CollectedHeap::release_mutator_alloc_region() {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3521
  _mutator_alloc_region.release();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3522
  assert(_mutator_alloc_region.get() == NULL, "post-condition");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3523
}
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3524
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3525
void G1CollectedHeap::set_gc_alloc_region(int purpose, HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3526
  assert(purpose >= 0 && purpose < GCAllocPurposeCount, "invalid purpose");
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3527
  // make sure we don't call set_gc_alloc_region() multiple times on
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3528
  // the same region
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3529
  assert(r == NULL || !r->is_gc_alloc_region(),
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3530
         "shouldn't already be a GC alloc region");
5244
1ac8ab19bedb 6940894: G1: assert(new_obj != 0 || ... "should be forwarded") for compaction tests
johnc
parents: 5243
diff changeset
  3531
  assert(r == NULL || !r->isHumongous(),
1ac8ab19bedb 6940894: G1: assert(new_obj != 0 || ... "should be forwarded") for compaction tests
johnc
parents: 5243
diff changeset
  3532
         "humongous regions shouldn't be used as GC alloc regions");
1ac8ab19bedb 6940894: G1: assert(new_obj != 0 || ... "should be forwarded") for compaction tests
johnc
parents: 5243
diff changeset
  3533
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3534
  HeapWord* original_top = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3535
  if (r != NULL)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3536
    original_top = r->top();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3537
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3538
  // We will want to record the used space in r as being there before gc.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3539
  // One we install it as a GC alloc region it's eligible for allocation.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3540
  // So record it now and use it later.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3541
  size_t r_used = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3542
  if (r != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3543
    r_used = r->used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3544
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  3545
    if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3546
      // need to take the lock to guard against two threads calling
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3547
      // get_gc_alloc_region concurrently (very unlikely but...)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3548
      MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3549
      r->save_marks();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3550
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3551
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3552
  HeapRegion* old_alloc_region = _gc_alloc_regions[purpose];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3553
  _gc_alloc_regions[purpose] = r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3554
  if (old_alloc_region != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3555
    // Replace aliases too.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3556
    for (int ap = 0; ap < GCAllocPurposeCount; ++ap) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3557
      if (_gc_alloc_regions[ap] == old_alloc_region) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3558
        _gc_alloc_regions[ap] = r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3559
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3560
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3561
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3562
  if (r != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3563
    push_gc_alloc_region(r);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3564
    if (mark_in_progress() && original_top != r->next_top_at_mark_start()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3565
      // We are using a region as a GC alloc region after it has been used
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3566
      // as a mutator allocation region during the current marking cycle.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3567
      // The mutator-allocated objects are currently implicitly marked, but
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3568
      // when we move hr->next_top_at_mark_start() forward at the the end
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3569
      // of the GC pause, they won't be.  We therefore mark all objects in
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3570
      // the "gap".  We do this object-by-object, since marking densely
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3571
      // does not currently work right with marking bitmap iteration.  This
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3572
      // means we rely on TLAB filling at the start of pauses, and no
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3573
      // "resuscitation" of filled TLAB's.  If we want to do this, we need
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3574
      // to fix the marking bitmap iteration.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3575
      HeapWord* curhw = r->next_top_at_mark_start();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3576
      HeapWord* t = original_top;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3577
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3578
      while (curhw < t) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3579
        oop cur = (oop)curhw;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3580
        // We'll assume parallel for generality.  This is rare code.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3581
        concurrent_mark()->markAndGrayObjectIfNecessary(cur); // can't we just mark them?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3582
        curhw = curhw + cur->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3583
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3584
      assert(curhw == t, "Should have parsed correctly.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3585
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3586
    if (G1PolicyVerbose > 1) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3587
      gclog_or_tty->print("New alloc region ["PTR_FORMAT", "PTR_FORMAT", " PTR_FORMAT") "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3588
                          "for survivors:", r->bottom(), original_top, r->end());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3589
      r->print();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3590
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3591
    g1_policy()->record_before_bytes(r_used);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3592
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3593
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3594
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3595
void G1CollectedHeap::push_gc_alloc_region(HeapRegion* hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3596
  assert(Thread::current()->is_VM_thread() ||
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3597
         FreeList_lock->owned_by_self(), "Precondition");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3598
  assert(!hr->is_gc_alloc_region() && !hr->in_collection_set(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3599
         "Precondition.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3600
  hr->set_is_gc_alloc_region(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3601
  hr->set_next_gc_alloc_region(_gc_alloc_region_list);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3602
  _gc_alloc_region_list = hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3603
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3604
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3605
#ifdef G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3606
class FindGCAllocRegion: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3607
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3608
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3609
    if (r->is_gc_alloc_region()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3610
      gclog_or_tty->print_cr("Region %d ["PTR_FORMAT"...] is still a gc_alloc_region.",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3611
                             r->hrs_index(), r->bottom());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3612
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3613
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3614
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3615
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3616
#endif // G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3617
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3618
void G1CollectedHeap::forget_alloc_region_list() {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3619
  assert_at_safepoint(true /* should_be_vm_thread */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3620
  while (_gc_alloc_region_list != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3621
    HeapRegion* r = _gc_alloc_region_list;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3622
    assert(r->is_gc_alloc_region(), "Invariant.");
2249
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  3623
    // We need HeapRegion::oops_on_card_seq_iterate_careful() to work on
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  3624
    // newly allocated data in order to be able to apply deferred updates
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  3625
    // before the GC is done for verification purposes (i.e to allow
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  3626
    // G1HRRSFlushLogBuffersOnVerify). It's safe thing to do after the
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  3627
    // collection.
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  3628
    r->ContiguousSpace::set_saved_mark();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3629
    _gc_alloc_region_list = r->next_gc_alloc_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3630
    r->set_next_gc_alloc_region(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3631
    r->set_is_gc_alloc_region(false);
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  3632
    if (r->is_survivor()) {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  3633
      if (r->is_empty()) {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  3634
        r->set_not_young();
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  3635
      } else {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  3636
        _young_list->add_survivor_region(r);
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  3637
      }
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  3638
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3639
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3640
#ifdef G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3641
  FindGCAllocRegion fa;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3642
  heap_region_iterate(&fa);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3643
#endif // G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3644
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3645
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3646
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3647
bool G1CollectedHeap::check_gc_alloc_regions() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3648
  // TODO: allocation regions check
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3649
  return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3650
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3651
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3652
void G1CollectedHeap::get_gc_alloc_regions() {
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3653
  // First, let's check that the GC alloc region list is empty (it should)
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3654
  assert(_gc_alloc_region_list == NULL, "invariant");
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3655
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3656
  for (int ap = 0; ap < GCAllocPurposeCount; ++ap) {
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3657
    assert(_gc_alloc_regions[ap] == NULL, "invariant");
3278
652f923606a4 6862661: G1: _gc_alloc_region_counts is not updated properly after 6604422
apetrusenko
parents: 3263
diff changeset
  3658
    assert(_gc_alloc_region_counts[ap] == 0, "invariant");
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3659
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3660
    // Create new GC alloc regions.
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3661
    HeapRegion* alloc_region = _retained_gc_alloc_regions[ap];
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3662
    _retained_gc_alloc_regions[ap] = NULL;
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3663
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3664
    if (alloc_region != NULL) {
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3665
      assert(_retain_gc_alloc_region[ap], "only way to retain a GC region");
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3666
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3667
      // let's make sure that the GC alloc region is not tagged as such
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3668
      // outside a GC operation
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3669
      assert(!alloc_region->is_gc_alloc_region(), "sanity");
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3670
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3671
      if (alloc_region->in_collection_set() ||
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3672
          alloc_region->top() == alloc_region->end() ||
5244
1ac8ab19bedb 6940894: G1: assert(new_obj != 0 || ... "should be forwarded") for compaction tests
johnc
parents: 5243
diff changeset
  3673
          alloc_region->top() == alloc_region->bottom() ||
1ac8ab19bedb 6940894: G1: assert(new_obj != 0 || ... "should be forwarded") for compaction tests
johnc
parents: 5243
diff changeset
  3674
          alloc_region->isHumongous()) {
1ac8ab19bedb 6940894: G1: assert(new_obj != 0 || ... "should be forwarded") for compaction tests
johnc
parents: 5243
diff changeset
  3675
        // we will discard the current GC alloc region if
1ac8ab19bedb 6940894: G1: assert(new_obj != 0 || ... "should be forwarded") for compaction tests
johnc
parents: 5243
diff changeset
  3676
        // * it's in the collection set (it can happen!),
1ac8ab19bedb 6940894: G1: assert(new_obj != 0 || ... "should be forwarded") for compaction tests
johnc
parents: 5243
diff changeset
  3677
        // * it's already full (no point in using it),
1ac8ab19bedb 6940894: G1: assert(new_obj != 0 || ... "should be forwarded") for compaction tests
johnc
parents: 5243
diff changeset
  3678
        // * it's empty (this means that it was emptied during
1ac8ab19bedb 6940894: G1: assert(new_obj != 0 || ... "should be forwarded") for compaction tests
johnc
parents: 5243
diff changeset
  3679
        // a cleanup and it should be on the free list now), or
1ac8ab19bedb 6940894: G1: assert(new_obj != 0 || ... "should be forwarded") for compaction tests
johnc
parents: 5243
diff changeset
  3680
        // * it's humongous (this means that it was emptied
1ac8ab19bedb 6940894: G1: assert(new_obj != 0 || ... "should be forwarded") for compaction tests
johnc
parents: 5243
diff changeset
  3681
        // during a cleanup and was added to the free list, but
1ac8ab19bedb 6940894: G1: assert(new_obj != 0 || ... "should be forwarded") for compaction tests
johnc
parents: 5243
diff changeset
  3682
        // has been subseqently used to allocate a humongous
1ac8ab19bedb 6940894: G1: assert(new_obj != 0 || ... "should be forwarded") for compaction tests
johnc
parents: 5243
diff changeset
  3683
        // object that may be less than the region size).
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3684
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3685
        alloc_region = NULL;
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3686
      }
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3687
    }
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3688
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3689
    if (alloc_region == NULL) {
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3690
      // we will get a new GC alloc region
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  3691
      alloc_region = new_gc_alloc_region(ap, HeapRegion::GrainWords);
3278
652f923606a4 6862661: G1: _gc_alloc_region_counts is not updated properly after 6604422
apetrusenko
parents: 3263
diff changeset
  3692
    } else {
652f923606a4 6862661: G1: _gc_alloc_region_counts is not updated properly after 6604422
apetrusenko
parents: 3263
diff changeset
  3693
      // the region was retained from the last collection
652f923606a4 6862661: G1: _gc_alloc_region_counts is not updated properly after 6604422
apetrusenko
parents: 3263
diff changeset
  3694
      ++_gc_alloc_region_counts[ap];
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5343
diff changeset
  3695
      if (G1PrintHeapRegions) {
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5343
diff changeset
  3696
        gclog_or_tty->print_cr("new alloc region %d:["PTR_FORMAT", "PTR_FORMAT"], "
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5343
diff changeset
  3697
                               "top "PTR_FORMAT,
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5343
diff changeset
  3698
                               alloc_region->hrs_index(), alloc_region->bottom(), alloc_region->end(), alloc_region->top());
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5343
diff changeset
  3699
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3700
    }
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3701
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3702
    if (alloc_region != NULL) {
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3703
      assert(_gc_alloc_regions[ap] == NULL, "pre-condition");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3704
      set_gc_alloc_region(ap, alloc_region);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3705
    }
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3706
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3707
    assert(_gc_alloc_regions[ap] == NULL ||
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3708
           _gc_alloc_regions[ap]->is_gc_alloc_region(),
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3709
           "the GC alloc region should be tagged as such");
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3710
    assert(_gc_alloc_regions[ap] == NULL ||
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3711
           _gc_alloc_regions[ap] == _gc_alloc_region_list,
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3712
           "the GC alloc region should be the same as the GC alloc list head");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3713
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3714
  // Set alternative regions for allocation purposes that have reached
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3715
  // their limit.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3716
  for (int ap = 0; ap < GCAllocPurposeCount; ++ap) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3717
    GCAllocPurpose alt_purpose = g1_policy()->alternative_purpose(ap);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3718
    if (_gc_alloc_regions[ap] == NULL && alt_purpose != ap) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3719
      _gc_alloc_regions[ap] = _gc_alloc_regions[alt_purpose];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3720
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3721
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3722
  assert(check_gc_alloc_regions(), "alloc regions messed up");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3723
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3724
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3725
void G1CollectedHeap::release_gc_alloc_regions(bool totally) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3726
  // We keep a separate list of all regions that have been alloc regions in
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3727
  // the current collection pause. Forget that now. This method will
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3728
  // untag the GC alloc regions and tear down the GC alloc region
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3729
  // list. It's desirable that no regions are tagged as GC alloc
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3730
  // outside GCs.
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  3731
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3732
  forget_alloc_region_list();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3733
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3734
  // The current alloc regions contain objs that have survived
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3735
  // collection. Make them no longer GC alloc regions.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3736
  for (int ap = 0; ap < GCAllocPurposeCount; ++ap) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3737
    HeapRegion* r = _gc_alloc_regions[ap];
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3738
    _retained_gc_alloc_regions[ap] = NULL;
3278
652f923606a4 6862661: G1: _gc_alloc_region_counts is not updated properly after 6604422
apetrusenko
parents: 3263
diff changeset
  3739
    _gc_alloc_region_counts[ap] = 0;
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3740
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3741
    if (r != NULL) {
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3742
      // we retain nothing on _gc_alloc_regions between GCs
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3743
      set_gc_alloc_region(ap, NULL);
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3744
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3745
      if (r->is_empty()) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3746
        // We didn't actually allocate anything in it; let's just put
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3747
        // it back on the free list.
8927
461fa7ee5254 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 8688
diff changeset
  3748
        _free_list.add_as_head(r);
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3749
      } else if (_retain_gc_alloc_region[ap] && !totally) {
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3750
        // retain it so that we can use it at the beginning of the next GC
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3751
        _retained_gc_alloc_regions[ap] = r;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3752
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3753
    }
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3754
  }
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3755
}
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3756
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3757
#ifndef PRODUCT
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3758
// Useful for debugging
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3759
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3760
void G1CollectedHeap::print_gc_alloc_regions() {
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3761
  gclog_or_tty->print_cr("GC alloc regions");
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3762
  for (int ap = 0; ap < GCAllocPurposeCount; ++ap) {
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3763
    HeapRegion* r = _gc_alloc_regions[ap];
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3764
    if (r == NULL) {
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3765
      gclog_or_tty->print_cr("  %2d : "PTR_FORMAT, ap, NULL);
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3766
    } else {
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3767
      gclog_or_tty->print_cr("  %2d : "PTR_FORMAT" "SIZE_FORMAT,
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3768
                             ap, r->bottom(), r->used());
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3769
    }
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3770
  }
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3771
}
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3772
#endif // PRODUCT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3773
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3774
void G1CollectedHeap::init_for_evac_failure(OopsInHeapRegionClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3775
  _drain_in_progress = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3776
  set_evac_failure_closure(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3777
  _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
  3778
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3779
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3780
void G1CollectedHeap::finalize_for_evac_failure() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3781
  assert(_evac_failure_scan_stack != NULL &&
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3782
         _evac_failure_scan_stack->length() == 0,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3783
         "Postcondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3784
  assert(!_drain_in_progress, "Postcondition");
4100
4f43ba12619a 6870843: G1: G1 GC memory leak
apetrusenko
parents: 4099
diff changeset
  3785
  delete _evac_failure_scan_stack;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3786
  _evac_failure_scan_stack = NULL;
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3789
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3790
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3791
// *** Sequential G1 Evacuation
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
class G1IsAliveClosure: public BoolObjectClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3794
  G1CollectedHeap* _g1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3795
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3796
  G1IsAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3797
  void do_object(oop p) { assert(false, "Do not call."); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3798
  bool do_object_b(oop p) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3799
    // It is reachable if it is outside the collection set, or is inside
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3800
    // and forwarded.
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
#ifdef G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3803
    gclog_or_tty->print_cr("is alive "PTR_FORMAT" in CS %d forwarded %d overall %d",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3804
                           (void*) p, _g1->obj_in_cs(p), p->is_forwarded(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3805
                           !_g1->obj_in_cs(p) || p->is_forwarded());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3806
#endif // G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3807
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3808
    return !_g1->obj_in_cs(p) || p->is_forwarded();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3809
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3810
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3811
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3812
class G1KeepAliveClosure: public OopClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3813
  G1CollectedHeap* _g1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3814
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3815
  G1KeepAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3816
  void do_oop(narrowOop* p) { guarantee(false, "Not needed"); }
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3817
  void do_oop(      oop* p) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3818
    oop obj = *p;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3819
#ifdef G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3820
    if (PrintGC && Verbose) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3821
      gclog_or_tty->print_cr("keep alive *"PTR_FORMAT" = "PTR_FORMAT" "PTR_FORMAT,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3822
                             p, (void*) obj, (void*) *p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3823
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3824
#endif // G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3825
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3826
    if (_g1->obj_in_cs(obj)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3827
      assert( obj->is_forwarded(), "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3828
      *p = obj->forwardee();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3829
#ifdef G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3830
      gclog_or_tty->print_cr("     in CSet: moved "PTR_FORMAT" -> "PTR_FORMAT,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3831
                             (void*) obj, (void*) *p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3832
#endif // G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3833
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3834
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3835
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3836
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3837
class UpdateRSetDeferred : public OopsInHeapRegionClosure {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3838
private:
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3839
  G1CollectedHeap* _g1;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3840
  DirtyCardQueue *_dcq;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3841
  CardTableModRefBS* _ct_bs;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3842
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3843
public:
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3844
  UpdateRSetDeferred(G1CollectedHeap* g1, DirtyCardQueue* dcq) :
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3845
    _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
  3846
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3847
  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
  3848
  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
  3849
  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
  3850
    assert(_from->is_in_reserved(p), "paranoia");
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3851
    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
  3852
        !_from->is_survivor()) {
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3853
      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
  3854
      if (_ct_bs->mark_card_deferred(card_index)) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3855
        _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
  3856
      }
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3857
    }
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3858
  }
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3859
};
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3860
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3861
class RemoveSelfPointerClosure: public ObjectClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3862
private:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3863
  G1CollectedHeap* _g1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3864
  ConcurrentMark* _cm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3865
  HeapRegion* _hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3866
  size_t _prev_marked_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3867
  size_t _next_marked_bytes;
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3868
  OopsInHeapRegionClosure *_cl;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3869
public:
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3870
  RemoveSelfPointerClosure(G1CollectedHeap* g1, HeapRegion* hr,
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3871
                           OopsInHeapRegionClosure* cl) :
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3872
    _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
  3873
    _next_marked_bytes(0), _cl(cl) {}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3874
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3875
  size_t prev_marked_bytes() { return _prev_marked_bytes; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3876
  size_t next_marked_bytes() { return _next_marked_bytes; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3877
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3878
  // <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
  3879
  // 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
  3880
  // 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
  3881
  // 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
  3882
  // |----- 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
  3883
  // 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
  3884
  // 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
  3885
  // 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
  3886
  // would point into middle of the filler object.
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3887
  // 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
  3888
  // </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
  3889
  //
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3890
  // 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
  3891
  // 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
  3892
  // 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
  3893
  // 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
  3894
  void do_object(oop obj) {
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3895
    HeapWord* obj_addr = (HeapWord*) obj;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3896
    assert(_hr->is_in(obj_addr), "sanity");
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3897
    size_t obj_size = obj->size();
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3898
    _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
  3899
    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
  3900
      // 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
  3901
      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
  3902
      _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
  3903
      assert(_cm->isPrevMarked(obj), "Should be marked!");
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3904
      _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
  3905
      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
  3906
        _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
  3907
      }
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3908
      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
  3909
      // 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
  3910
      // 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
  3911
      // 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
  3912
      // 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
  3913
      // 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
  3914
      // 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
  3915
      // 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
  3916
      // 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
  3917
      // 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
  3918
      // 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
  3919
      // 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
  3920
      // 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
  3921
      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
  3922
      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
  3923
    } 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
  3924
      // 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
  3925
      // dummy object.
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3926
      MemRegion mr((HeapWord*)obj, obj_size);
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  3927
      CollectedHeap::fill_with_object(mr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3928
      _cm->clearRangeBothMaps(mr);
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
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3931
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3932
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3933
void G1CollectedHeap::remove_self_forwarding_pointers() {
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  3934
  UpdateRSetImmediate immediate_update(_g1h->g1_rem_set());
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3935
  DirtyCardQueue dcq(&_g1h->dirty_card_queue_set());
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3936
  UpdateRSetDeferred deferred_update(_g1h, &dcq);
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3937
  OopsInHeapRegionClosure *cl;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3938
  if (G1DeferredRSUpdate) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3939
    cl = &deferred_update;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3940
  } else {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3941
    cl = &immediate_update;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3942
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3943
  HeapRegion* cur = g1_policy()->collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3944
  while (cur != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3945
    assert(g1_policy()->assertMarkedBytesDataOK(), "Should be!");
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3946
    assert(!cur->isHumongous(), "sanity");
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3947
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3948
    if (cur->evacuation_failed()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3949
      assert(cur->in_collection_set(), "bad CS");
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3950
      RemoveSelfPointerClosure rspc(_g1h, cur, cl);
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3951
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3952
      cur->reset_bot();
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3953
      cl->set_region(cur);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3954
      cur->object_iterate(&rspc);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3955
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3956
      // 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
  3957
      // and the marked bytes be the ones observed in the iteration.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3958
      if (_g1h->concurrent_mark()->at_least_one_mark_complete()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3959
        // The comments below are the postconditions achieved by the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3960
        // calls.  Note especially the last such condition, which says that
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3961
        // the count of marked bytes has been properly restored.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3962
        cur->note_start_of_marking(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3963
        // _next_top_at_mark_start == top, _next_marked_bytes == 0
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3964
        cur->add_to_marked_bytes(rspc.prev_marked_bytes());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3965
        // _next_marked_bytes == prev_marked_bytes.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3966
        cur->note_end_of_marking();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3967
        // _prev_top_at_mark_start == top(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3968
        // _prev_marked_bytes == prev_marked_bytes
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3969
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3970
      // 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
  3971
      // above needlessly, but harmlessly.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3972
      if (_g1h->mark_in_progress()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3973
        cur->note_start_of_marking(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3974
        // _next_top_at_mark_start == top, _next_marked_bytes == 0
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3975
        // _next_marked_bytes == next_marked_bytes.
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3978
      // 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
  3979
      g1_policy()->note_change_in_marked_bytes(cur);
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
    cur = cur->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3982
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3983
  assert(g1_policy()->assertMarkedBytesDataOK(), "Should be!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3984
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3985
  // Now restore saved marks, if any.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3986
  if (_objs_with_preserved_marks != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3987
    assert(_preserved_marks_of_objs != NULL, "Both or none.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3988
    guarantee(_objs_with_preserved_marks->length() ==
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3989
              _preserved_marks_of_objs->length(), "Both or none.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3990
    for (int i = 0; i < _objs_with_preserved_marks->length(); i++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3991
      oop obj   = _objs_with_preserved_marks->at(i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3992
      markOop m = _preserved_marks_of_objs->at(i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3993
      obj->set_mark(m);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3994
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3995
    // Delete the preserved marks growable arrays (allocated on the C heap).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3996
    delete _objs_with_preserved_marks;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3997
    delete _preserved_marks_of_objs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3998
    _objs_with_preserved_marks = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3999
    _preserved_marks_of_objs = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4000
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4001
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4002
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4003
void G1CollectedHeap::push_on_evac_failure_scan_stack(oop obj) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4004
  _evac_failure_scan_stack->push(obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4005
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4006
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4007
void G1CollectedHeap::drain_evac_failure_scan_stack() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4008
  assert(_evac_failure_scan_stack != NULL, "precondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4009
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4010
  while (_evac_failure_scan_stack->length() > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4011
     oop obj = _evac_failure_scan_stack->pop();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4012
     _evac_failure_closure->set_region(heap_region_containing(obj));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4013
     obj->oop_iterate_backwards(_evac_failure_closure);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4014
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4015
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4016
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4017
oop
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4018
G1CollectedHeap::handle_evacuation_failure_par(OopsInHeapRegionClosure* cl,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4019
                                               oop old) {
9424
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4020
  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
  4021
         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
  4022
                 (HeapWord*) old));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4023
  markOop m = old->mark();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4024
  oop forward_ptr = old->forward_to_atomic(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4025
  if (forward_ptr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4026
    // Forward-to-self succeeded.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4027
    if (_evac_failure_closure != cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4028
      MutexLockerEx x(EvacFailureStack_lock, Mutex::_no_safepoint_check_flag);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4029
      assert(!_drain_in_progress,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4030
             "Should only be true while someone holds the lock.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4031
      // Set the global evac-failure closure to the current thread's.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4032
      assert(_evac_failure_closure == NULL, "Or locking has failed.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4033
      set_evac_failure_closure(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4034
      // Now do the common part.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4035
      handle_evacuation_failure_common(old, m);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4036
      // Reset to NULL.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4037
      set_evac_failure_closure(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4038
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4039
      // The lock is already held, and this is recursive.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4040
      assert(_drain_in_progress, "This should only be the recursive case.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4041
      handle_evacuation_failure_common(old, m);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4042
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4043
    return old;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4044
  } 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
  4045
    // 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
  4046
    // 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
  4047
    // 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
  4048
    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
  4049
           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
  4050
                   "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
  4051
                   (HeapWord*) old, (HeapWord*) forward_ptr));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4052
    return forward_ptr;
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
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4055
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4056
void G1CollectedHeap::handle_evacuation_failure_common(oop old, markOop m) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4057
  set_evacuation_failed(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4058
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4059
  preserve_mark_if_necessary(old, m);
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
  HeapRegion* r = heap_region_containing(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4062
  if (!r->evacuation_failed()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4063
    r->set_evacuation_failed(true);
5033
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
  4064
    if (G1PrintHeapRegions) {
6261
1fe3e07abdb4 6975964: G1: print out a more descriptive message for evacuation failure when +PrintGCDetails is set
tonyp
parents: 6260
diff changeset
  4065
      gclog_or_tty->print("overflow in heap region "PTR_FORMAT" "
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4066
                          "["PTR_FORMAT","PTR_FORMAT")\n",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4067
                          r, r->bottom(), r->end());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4068
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4069
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4070
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4071
  push_on_evac_failure_scan_stack(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4072
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4073
  if (!_drain_in_progress) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4074
    // prevent recursion in copy_to_survivor_space()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4075
    _drain_in_progress = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4076
    drain_evac_failure_scan_stack();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4077
    _drain_in_progress = false;
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
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4080
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4081
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
  4082
  assert(evacuation_failed(), "Oversaving!");
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7657
diff changeset
  4083
  // 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
  4084
  // case of a promotion failure.
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7657
diff changeset
  4085
  if (m->must_be_preserved_for_promotion_failure(obj)) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4086
    if (_objs_with_preserved_marks == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4087
      assert(_preserved_marks_of_objs == NULL, "Both or none.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4088
      _objs_with_preserved_marks =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4089
        new (ResourceObj::C_HEAP) GrowableArray<oop>(40, true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4090
      _preserved_marks_of_objs =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4091
        new (ResourceObj::C_HEAP) GrowableArray<markOop>(40, true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4092
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4093
    _objs_with_preserved_marks->push(obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4094
    _preserved_marks_of_objs->push(m);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4095
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4096
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4097
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4098
// *** Parallel G1 Evacuation
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4099
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4100
HeapWord* G1CollectedHeap::par_allocate_during_gc(GCAllocPurpose purpose,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4101
                                                  size_t word_size) {
6260
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6259
diff changeset
  4102
  assert(!isHumongous(word_size),
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6259
diff changeset
  4103
         err_msg("we should not be seeing humongous allocation requests "
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6259
diff changeset
  4104
                 "during GC, word_size = "SIZE_FORMAT, word_size));
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6259
diff changeset
  4105
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4106
  HeapRegion* alloc_region = _gc_alloc_regions[purpose];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4107
  // let the caller handle alloc failure
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4108
  if (alloc_region == NULL) return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4109
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4110
  HeapWord* block = alloc_region->par_allocate(word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4111
  if (block == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4112
    block = allocate_during_gc_slow(purpose, alloc_region, true, word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4113
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4114
  return block;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4115
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4116
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4117
void G1CollectedHeap::retire_alloc_region(HeapRegion* alloc_region,
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4118
                                            bool par) {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4119
  // Another thread might have obtained alloc_region for the given
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4120
  // purpose, and might be attempting to allocate in it, and might
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4121
  // succeed.  Therefore, we can't do the "finalization" stuff on the
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4122
  // region below until we're sure the last allocation has happened.
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4123
  // We ensure this by allocating the remaining space with a garbage
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4124
  // object.
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4125
  if (par) par_allocate_remaining_space(alloc_region);
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4126
  // Now we can do the post-GC stuff on the region.
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4127
  alloc_region->note_end_of_copying();
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4128
  g1_policy()->record_after_bytes(alloc_region->used());
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4129
}
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4130
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4131
HeapWord*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4132
G1CollectedHeap::allocate_during_gc_slow(GCAllocPurpose purpose,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4133
                                         HeapRegion*    alloc_region,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4134
                                         bool           par,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4135
                                         size_t         word_size) {
6260
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6259
diff changeset
  4136
  assert(!isHumongous(word_size),
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6259
diff changeset
  4137
         err_msg("we should not be seeing humongous allocation requests "
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6259
diff changeset
  4138
                 "during GC, word_size = "SIZE_FORMAT, word_size));
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6259
diff changeset
  4139
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4140
  // We need to make sure we serialize calls to this method. Given
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4141
  // that the FreeList_lock guards accesses to the free_list anyway,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4142
  // and we need to potentially remove a region from it, we'll use it
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4143
  // to protect the whole call.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4144
  MutexLockerEx x(FreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4145
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4146
  HeapWord* block = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4147
  // In the parallel case, a previous thread to obtain the lock may have
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4148
  // already assigned a new gc_alloc_region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4149
  if (alloc_region != _gc_alloc_regions[purpose]) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4150
    assert(par, "But should only happen in parallel case.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4151
    alloc_region = _gc_alloc_regions[purpose];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4152
    if (alloc_region == NULL) return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4153
    block = alloc_region->par_allocate(word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4154
    if (block != NULL) return block;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4155
    // Otherwise, continue; this new region is empty, too.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4156
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4157
  assert(alloc_region != NULL, "We better have an allocation region");
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4158
  retire_alloc_region(alloc_region, par);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4159
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4160
  if (_gc_alloc_region_counts[purpose] >= g1_policy()->max_regions(purpose)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4161
    // Cannot allocate more regions for the given purpose.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4162
    GCAllocPurpose alt_purpose = g1_policy()->alternative_purpose(purpose);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4163
    // Is there an alternative?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4164
    if (purpose != alt_purpose) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4165
      HeapRegion* alt_region = _gc_alloc_regions[alt_purpose];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4166
      // Has not the alternative region been aliased?
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4167
      if (alloc_region != alt_region && alt_region != NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4168
        // Try to allocate in the alternative region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4169
        if (par) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4170
          block = alt_region->par_allocate(word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4171
        } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4172
          block = alt_region->allocate(word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4173
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4174
        // Make an alias.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4175
        _gc_alloc_regions[purpose] = _gc_alloc_regions[alt_purpose];
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4176
        if (block != NULL) {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4177
          return block;
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4178
        }
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4179
        retire_alloc_region(alt_region, par);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4180
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4181
      // Both the allocation region and the alternative one are full
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4182
      // and aliased, replace them with a new allocation region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4183
      purpose = alt_purpose;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4184
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4185
      set_gc_alloc_region(purpose, NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4186
      return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4187
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4188
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4189
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4190
  // Now allocate a new region for allocation.
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4191
  alloc_region = new_gc_alloc_region(purpose, word_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4192
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4193
  // let the caller handle alloc failure
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4194
  if (alloc_region != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4195
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4196
    assert(check_gc_alloc_regions(), "alloc regions messed up");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4197
    assert(alloc_region->saved_mark_at_top(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4198
           "Mark should have been saved already.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4199
    // This must be done last: once it's installed, other regions may
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4200
    // allocate in it (without holding the lock.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4201
    set_gc_alloc_region(purpose, alloc_region);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4202
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4203
    if (par) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4204
      block = alloc_region->par_allocate(word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4205
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4206
      block = alloc_region->allocate(word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4207
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4208
    // Caller handles alloc failure.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4209
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4210
    // This sets other apis using the same old alloc region to NULL, also.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4211
    set_gc_alloc_region(purpose, NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4212
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4213
  return block;  // May be NULL.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4214
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4215
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4216
void G1CollectedHeap::par_allocate_remaining_space(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4217
  HeapWord* block = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4218
  size_t free_words;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4219
  do {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4220
    free_words = r->free()/HeapWordSize;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4221
    // If there's too little space, no one can allocate, so we're done.
5694
1e0532a6abff 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 5542
diff changeset
  4222
    if (free_words < CollectedHeap::min_fill_size()) return;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4223
    // Otherwise, try to claim it.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4224
    block = r->par_allocate(free_words);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4225
  } while (block == NULL);
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  4226
  fill_with_object(block, free_words);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4227
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4228
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4229
#ifndef PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4230
bool GCLabBitMapClosure::do_bit(size_t offset) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4231
  HeapWord* addr = _bitmap->offsetToHeapWord(offset);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4232
  guarantee(_cm->isMarked(oop(addr)), "it should be!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4233
  return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4234
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4235
#endif // PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4236
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4237
G1ParScanThreadState::G1ParScanThreadState(G1CollectedHeap* g1h, int queue_num)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4238
  : _g1h(g1h),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4239
    _refs(g1h->task_queue(queue_num)),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4240
    _dcq(&g1h->dirty_card_queue_set()),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4241
    _ct_bs((CardTableModRefBS*)_g1h->barrier_set()),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4242
    _g1_rem(g1h->g1_rem_set()),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4243
    _hash_seed(17), _queue_num(queue_num),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4244
    _term_attempts(0),
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4245
    _surviving_alloc_buffer(g1h->desired_plab_sz(GCAllocForSurvived)),
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4246
    _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
  4247
    _age_table(false),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4248
    _strong_roots_time(0), _term_time(0),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4249
    _alloc_buffer_waste(0), _undo_waste(0)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4250
{
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4251
  // we allocate G1YoungSurvRateNumRegions plus one entries, since
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4252
  // 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
  4253
  // non-young regions (where the age is -1)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4254
  // 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
  4255
  // an attempt to eliminate cache contention
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4256
  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
  4257
  size_t array_length = PADDING_ELEM_NUM +
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4258
                        real_length +
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4259
                        PADDING_ELEM_NUM;
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4260
  _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
  4261
  if (_surviving_young_words_base == NULL)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4262
    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
  4263
                          "Not enough space for young surv histo.");
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4264
  _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
  4265
  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
  4266
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4267
  _alloc_buffers[GCAllocForSurvived] = &_surviving_alloc_buffer;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4268
  _alloc_buffers[GCAllocForTenured]  = &_tenured_alloc_buffer;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4269
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4270
  _start = os::elapsedTime();
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4271
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4272
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4273
void
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4274
G1ParScanThreadState::print_termination_stats_hdr(outputStream* const st)
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4275
{
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4276
  st->print_raw_cr("GC Termination Stats");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4277
  st->print_raw_cr("     elapsed  --strong roots-- -------termination-------"
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4278
                   " ------waste (KiB)------");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4279
  st->print_raw_cr("thr     ms        ms      %        ms      %    attempts"
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4280
                   "  total   alloc    undo");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4281
  st->print_raw_cr("--- --------- --------- ------ --------- ------ --------"
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4282
                   " ------- ------- -------");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4283
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4284
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4285
void
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4286
G1ParScanThreadState::print_termination_stats(int i,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4287
                                              outputStream* const st) const
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4288
{
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4289
  const double elapsed_ms = elapsed_time() * 1000.0;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4290
  const double s_roots_ms = strong_roots_time() * 1000.0;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4291
  const double term_ms    = term_time() * 1000.0;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4292
  st->print_cr("%3d %9.2f %9.2f %6.2f "
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4293
               "%9.2f %6.2f " SIZE_FORMAT_W(8) " "
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4294
               SIZE_FORMAT_W(7) " " SIZE_FORMAT_W(7) " " SIZE_FORMAT_W(7),
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4295
               i, elapsed_ms, s_roots_ms, s_roots_ms * 100 / elapsed_ms,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4296
               term_ms, term_ms * 100 / elapsed_ms, term_attempts(),
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4297
               (alloc_buffer_waste() + undo_waste()) * HeapWordSize / K,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4298
               alloc_buffer_waste() * HeapWordSize / K,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4299
               undo_waste() * HeapWordSize / K);
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4300
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4301
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4302
#ifdef ASSERT
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4303
bool G1ParScanThreadState::verify_ref(narrowOop* ref) const {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4304
  assert(ref != NULL, "invariant");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4305
  assert(UseCompressedOops, "sanity");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4306
  assert(!has_partial_array_mask(ref), err_msg("ref=" PTR_FORMAT, ref));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4307
  oop p = oopDesc::load_decode_heap_oop(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4308
  assert(_g1h->is_in_g1_reserved(p),
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4309
         err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4310
  return true;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4311
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4312
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4313
bool G1ParScanThreadState::verify_ref(oop* ref) const {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4314
  assert(ref != NULL, "invariant");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4315
  if (has_partial_array_mask(ref)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4316
    // Must be in the collection set--it's already been copied.
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4317
    oop p = clear_partial_array_mask(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4318
    assert(_g1h->obj_in_cs(p),
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4319
           err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4320
  } else {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4321
    oop p = oopDesc::load_decode_heap_oop(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4322
    assert(_g1h->is_in_g1_reserved(p),
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4323
           err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4324
  }
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4325
  return true;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4326
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4327
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4328
bool G1ParScanThreadState::verify_task(StarTask ref) const {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4329
  if (ref.is_narrow()) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4330
    return verify_ref((narrowOop*) ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4331
  } else {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4332
    return verify_ref((oop*) ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4333
  }
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4334
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4335
#endif // ASSERT
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4336
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4337
void G1ParScanThreadState::trim_queue() {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4338
  StarTask ref;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4339
  do {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4340
    // Drain the overflow stack first, so other threads can steal.
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4341
    while (refs()->pop_overflow(ref)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4342
      deal_with_reference(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4343
    }
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4344
    while (refs()->pop_local(ref)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4345
      deal_with_reference(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4346
    }
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4347
  } while (!refs()->is_empty());
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4348
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4349
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4350
G1ParClosureSuper::G1ParClosureSuper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4351
  _g1(g1), _g1_rem(_g1->g1_rem_set()), _cm(_g1->concurrent_mark()),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4352
  _par_scan_state(par_scan_state) { }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4353
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4354
template <class T> void G1ParCopyHelper::mark_forwardee(T* p) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4355
  // This is called _after_ do_oop_work has been called, hence after
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4356
  // the object has been relocated to its new location and *p points
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4357
  // to its new location.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4358
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4359
  T heap_oop = oopDesc::load_heap_oop(p);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4360
  if (!oopDesc::is_null(heap_oop)) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4361
    oop obj = oopDesc::decode_heap_oop(heap_oop);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4362
    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
  4363
    if (_g1->is_in_g1_reserved(addr)) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4364
      _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
  4365
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4366
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4367
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4368
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4369
oop G1ParCopyHelper::copy_to_survivor_space(oop old) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4370
  size_t    word_sz = old->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4371
  HeapRegion* from_region = _g1->heap_region_containing_raw(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4372
  // +1 to make the -1 indexes valid...
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4373
  int       young_index = from_region->young_index_in_cset()+1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4374
  assert( (from_region->is_young() && young_index > 0) ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4375
          (!from_region->is_young() && young_index == 0), "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4376
  G1CollectorPolicy* g1p = _g1->g1_policy();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4377
  markOop m = old->mark();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4378
  int age = m->has_displaced_mark_helper() ? m->displaced_mark_helper()->age()
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4379
                                           : m->age();
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4380
  GCAllocPurpose alloc_purpose = g1p->evacuation_destination(from_region, age,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4381
                                                             word_sz);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4382
  HeapWord* obj_ptr = _par_scan_state->allocate(alloc_purpose, word_sz);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4383
  oop       obj     = oop(obj_ptr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4384
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4385
  if (obj_ptr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4386
    // 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
  4387
    // installed a forwarding pointer.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4388
    OopsInHeapRegionClosure* cl = _par_scan_state->evac_failure_closure();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4389
    return _g1->handle_evacuation_failure_par(cl, old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4390
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4391
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4392
  // We're going to allocate linearly, so might as well prefetch ahead.
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4393
  Prefetch::write(obj_ptr, PrefetchCopyIntervalInBytes);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4394
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4395
  oop forward_ptr = old->forward_to_atomic(obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4396
  if (forward_ptr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4397
    Copy::aligned_disjoint_words((HeapWord*) old, obj_ptr, word_sz);
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4398
    if (g1p->track_object_age(alloc_purpose)) {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4399
      // We could simply do obj->incr_age(). However, this causes a
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4400
      // performance issue. obj->incr_age() will first check whether
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4401
      // the object has a displaced mark by checking its mark word;
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4402
      // getting the mark word from the new location of the object
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4403
      // stalls. So, given that we already have the mark word and we
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4404
      // are about to install it anyway, it's better to increase the
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4405
      // age on the mark word, when the object does not have a
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4406
      // displaced mark word. We're not expecting many objects to have
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4407
      // a displaced marked word, so that case is not optimized
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4408
      // further (it could be...) and we simply call obj->incr_age().
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4409
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4410
      if (m->has_displaced_mark_helper()) {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4411
        // in this case, we have to install the mark word first,
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4412
        // otherwise obj looks to be forwarded (the old mark word,
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4413
        // which contains the forward pointer, was copied)
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4414
        obj->set_mark(m);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4415
        obj->incr_age();
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4416
      } else {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4417
        m = m->incr_age();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4418
        obj->set_mark(m);
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4419
      }
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4420
      _par_scan_state->age_table()->add(obj, word_sz);
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4421
    } else {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4422
      obj->set_mark(m);
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4423
    }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4424
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4425
    // preserve "next" mark bit
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4426
    if (_g1->mark_in_progress() && !_g1->is_obj_ill(old)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4427
      if (!use_local_bitmaps ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4428
          !_par_scan_state->alloc_buffer(alloc_purpose)->mark(obj_ptr)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4429
        // 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
  4430
        // 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
  4431
        // the bullet and do the standard parallel mark
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4432
        _cm->markAndGrayObjectIfNecessary(obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4433
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4434
#if 1
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4435
      if (_g1->isMarkedNext(old)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4436
        _cm->nextMarkBitMap()->parClear((HeapWord*)old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4437
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4438
#endif
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4439
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4440
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4441
    size_t* surv_young_words = _par_scan_state->surviving_young_words();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4442
    surv_young_words[young_index] += word_sz;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4443
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4444
    if (obj->is_objArray() && arrayOop(obj)->length() >= ParGCArrayScanChunk) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4445
      arrayOop(old)->set_length(0);
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4446
      oop* old_p = set_partial_array_mask(old);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4447
      _par_scan_state->push_on_queue(old_p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4448
    } else {
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4449
      // No point in using the slower heap_region_containing() method,
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4450
      // given that we know obj is in the heap.
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4451
      _scanner->set_region(_g1->heap_region_containing_raw(obj));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4452
      obj->oop_iterate_backwards(_scanner);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4453
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4454
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4455
    _par_scan_state->undo_allocation(alloc_purpose, obj_ptr, word_sz);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4456
    obj = forward_ptr;
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
  return obj;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4459
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4460
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4461
template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_forwardee>
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4462
template <class T>
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4463
void G1ParCopyClosure <do_gen_barrier, barrier, do_mark_forwardee>
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4464
::do_oop_work(T* p) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4465
  oop obj = oopDesc::load_decode_heap_oop(p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4466
  assert(barrier != G1BarrierRS || obj != NULL,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4467
         "Precondition: G1BarrierRS implies obj is nonNull");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4468
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4469
  // 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
  4470
  if (_g1->in_cset_fast_test(obj)) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4471
#if G1_REM_SET_LOGGING
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4472
    gclog_or_tty->print_cr("Loc "PTR_FORMAT" contains pointer "PTR_FORMAT" "
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4473
                           "into CS.", p, (void*) obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4474
#endif
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4475
    if (obj->is_forwarded()) {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4476
      oopDesc::encode_store_heap_oop(p, obj->forwardee());
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4477
    } else {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4478
      oop copy_oop = copy_to_survivor_space(obj);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4479
      oopDesc::encode_store_heap_oop(p, copy_oop);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4480
    }
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4481
    // When scanning the RS, we only care about objs in CS.
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4482
    if (barrier == G1BarrierRS) {
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4483
      _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
  4484
    }
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4485
  }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4486
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4487
  if (barrier == G1BarrierEvac && obj != NULL) {
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4488
    _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
  4489
  }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4490
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4491
  if (do_gen_barrier && obj != NULL) {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4492
    par_do_barrier(p);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4493
  }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4494
}
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4495
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4496
template void G1ParCopyClosure<false, G1BarrierEvac, false>::do_oop_work(oop* p);
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4497
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
  4498
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4499
template <class T> void G1ParScanPartialArrayClosure::do_oop_nv(T* p) {
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4500
  assert(has_partial_array_mask(p), "invariant");
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4501
  oop old = clear_partial_array_mask(p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4502
  assert(old->is_objArray(), "must be obj array");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4503
  assert(old->is_forwarded(), "must be forwarded");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4504
  assert(Universe::heap()->is_in_reserved(old), "must be in heap.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4505
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4506
  objArrayOop obj = objArrayOop(old->forwardee());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4507
  assert((void*)old != (void*)old->forwardee(), "self forwarding here?");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4508
  // Process ParGCArrayScanChunk elements now
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4509
  // and push the remainder back onto queue
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4510
  int start     = arrayOop(old)->length();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4511
  int end       = obj->length();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4512
  int remainder = end - start;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4513
  assert(start <= end, "just checking");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4514
  if (remainder > 2 * ParGCArrayScanChunk) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4515
    // Test above combines last partial chunk with a full chunk
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4516
    end = start + ParGCArrayScanChunk;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4517
    arrayOop(old)->set_length(end);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4518
    // Push remainder.
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4519
    oop* old_p = set_partial_array_mask(old);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4520
    assert(arrayOop(old)->length() < obj->length(), "Empty push?");
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4521
    _par_scan_state->push_on_queue(old_p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4522
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4523
    // Restore length so that the heap remains parsable in
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4524
    // case of evacuation failure.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4525
    arrayOop(old)->set_length(end);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4526
  }
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4527
  _scanner.set_region(_g1->heap_region_containing_raw(obj));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4528
  // 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
  4529
  obj->oop_iterate_range(&_scanner, start, end);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4530
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4531
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4532
class G1ParEvacuateFollowersClosure : public VoidClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4533
protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4534
  G1CollectedHeap*              _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4535
  G1ParScanThreadState*         _par_scan_state;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4536
  RefToScanQueueSet*            _queues;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4537
  ParallelTaskTerminator*       _terminator;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4538
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4539
  G1ParScanThreadState*   par_scan_state() { return _par_scan_state; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4540
  RefToScanQueueSet*      queues()         { return _queues; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4541
  ParallelTaskTerminator* terminator()     { return _terminator; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4542
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4543
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4544
  G1ParEvacuateFollowersClosure(G1CollectedHeap* g1h,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4545
                                G1ParScanThreadState* par_scan_state,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4546
                                RefToScanQueueSet* queues,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4547
                                ParallelTaskTerminator* terminator)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4548
    : _g1h(g1h), _par_scan_state(par_scan_state),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4549
      _queues(queues), _terminator(terminator) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4550
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4551
  void do_void();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4552
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4553
private:
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4554
  inline bool offer_termination();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4555
};
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4556
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4557
bool G1ParEvacuateFollowersClosure::offer_termination() {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4558
  G1ParScanThreadState* const pss = par_scan_state();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4559
  pss->start_term_time();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4560
  const bool res = terminator()->offer_termination();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4561
  pss->end_term_time();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4562
  return res;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4563
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4564
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4565
void G1ParEvacuateFollowersClosure::do_void() {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4566
  StarTask stolen_task;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4567
  G1ParScanThreadState* const pss = par_scan_state();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4568
  pss->trim_queue();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4569
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4570
  do {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4571
    while (queues()->steal(pss->queue_num(), pss->hash_seed(), stolen_task)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4572
      assert(pss->verify_task(stolen_task), "sanity");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4573
      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
  4574
        pss->deal_with_reference((narrowOop*) stolen_task);
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4575
      } else {
6980
d19831e79825 6990359: G1: don't push a stolen entry on the taskqueue, deal with it directly
tonyp
parents: 6959
diff changeset
  4576
        pss->deal_with_reference((oop*) stolen_task);
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4577
      }
6980
d19831e79825 6990359: G1: don't push a stolen entry on the taskqueue, deal with it directly
tonyp
parents: 6959
diff changeset
  4578
d19831e79825 6990359: G1: don't push a stolen entry on the taskqueue, deal with it directly
tonyp
parents: 6959
diff changeset
  4579
      // 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
  4580
      // 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
  4581
      // we drain the queues as necessary.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4582
      pss->trim_queue();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4583
    }
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4584
  } while (!offer_termination());
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4585
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4586
  pss->retire_alloc_buffers();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4587
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4588
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4589
class G1ParTask : public AbstractGangTask {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4590
protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4591
  G1CollectedHeap*       _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4592
  RefToScanQueueSet      *_queues;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4593
  ParallelTaskTerminator _terminator;
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4594
  int _n_workers;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4595
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4596
  Mutex _stats_lock;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4597
  Mutex* stats_lock() { return &_stats_lock; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4598
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4599
  size_t getNCards() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4600
    return (_g1h->capacity() + G1BlockOffsetSharedArray::N_bytes - 1)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4601
      / G1BlockOffsetSharedArray::N_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4602
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4603
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4604
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4605
  G1ParTask(G1CollectedHeap* g1h, int workers, RefToScanQueueSet *task_queues)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4606
    : AbstractGangTask("G1 collection"),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4607
      _g1h(g1h),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4608
      _queues(task_queues),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4609
      _terminator(workers, _queues),
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4610
      _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
  4611
      _n_workers(workers)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4612
  {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4613
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4614
  RefToScanQueueSet* queues() { return _queues; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4615
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4616
  RefToScanQueue *work_queue(int i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4617
    return queues()->queue(i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4618
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4619
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4620
  void work(int i) {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4621
    if (i >= _n_workers) return;  // no work needed this round
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4622
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4623
    double start_time_ms = os::elapsedTime() * 1000.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4624
    _g1h->g1_policy()->record_gc_worker_start_time(i, start_time_ms);
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4625
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4626
    ResourceMark rm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4627
    HandleMark   hm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4628
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4629
    G1ParScanThreadState            pss(_g1h, i);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4630
    G1ParScanHeapEvacClosure        scan_evac_cl(_g1h, &pss);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4631
    G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4632
    G1ParScanPartialArrayClosure    partial_scan_cl(_g1h, &pss);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4633
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4634
    pss.set_evac_closure(&scan_evac_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4635
    pss.set_evac_failure_closure(&evac_failure_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4636
    pss.set_partial_scan_closure(&partial_scan_cl);
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
    G1ParScanExtRootClosure         only_scan_root_cl(_g1h, &pss);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4639
    G1ParScanPermClosure            only_scan_perm_cl(_g1h, &pss);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4640
    G1ParScanHeapRSClosure          only_scan_heap_rs_cl(_g1h, &pss);
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4641
    G1ParPushHeapRSClosure          push_heap_rs_cl(_g1h, &pss);
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4642
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4643
    G1ParScanAndMarkExtRootClosure  scan_mark_root_cl(_g1h, &pss);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4644
    G1ParScanAndMarkPermClosure     scan_mark_perm_cl(_g1h, &pss);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4645
    G1ParScanAndMarkHeapRSClosure   scan_mark_heap_rs_cl(_g1h, &pss);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4646
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4647
    OopsInHeapRegionClosure        *scan_root_cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4648
    OopsInHeapRegionClosure        *scan_perm_cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4649
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  4650
    if (_g1h->g1_policy()->during_initial_mark_pause()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4651
      scan_root_cl = &scan_mark_root_cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4652
      scan_perm_cl = &scan_mark_perm_cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4653
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4654
      scan_root_cl = &only_scan_root_cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4655
      scan_perm_cl = &only_scan_perm_cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4656
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4657
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4658
    pss.start_strong_roots();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4659
    _g1h->g1_process_strong_roots(/* not collecting perm */ false,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4660
                                  SharedHeap::SO_AllClasses,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4661
                                  scan_root_cl,
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4662
                                  &push_heap_rs_cl,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4663
                                  scan_perm_cl,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4664
                                  i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4665
    pss.end_strong_roots();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4666
    {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4667
      double start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4668
      G1ParEvacuateFollowersClosure evac(_g1h, &pss, _queues, &_terminator);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4669
      evac.do_void();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4670
      double elapsed_ms = (os::elapsedTime()-start)*1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4671
      double term_ms = pss.term_time()*1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4672
      _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
  4673
      _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
  4674
    }
5033
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
  4675
    _g1h->g1_policy()->record_thread_age_table(pss.age_table());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4676
    _g1h->update_surviving_young_words(pss.surviving_young_words()+1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4677
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4678
    // Clean up any par-expanded rem sets.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4679
    HeapRegionRemSet::par_cleanup();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4680
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4681
    if (ParallelGCVerbose) {
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4682
      MutexLocker x(stats_lock());
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4683
      pss.print_termination_stats(i);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4684
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4685
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4686
    assert(pss.refs()->is_empty(), "should be empty");
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4687
    double end_time_ms = os::elapsedTime() * 1000.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4688
    _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
  4689
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4690
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4691
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4692
// *** Common G1 Evacuation Stuff
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4693
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  4694
// This method is run in a GC worker.
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  4695
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4696
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4697
G1CollectedHeap::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4698
g1_process_strong_roots(bool collecting_perm_gen,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4699
                        SharedHeap::ScanningOption so,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4700
                        OopClosure* scan_non_heap_roots,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4701
                        OopsInHeapRegionClosure* scan_rs,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4702
                        OopsInGenClosure* scan_perm,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4703
                        int worker_i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4704
  // First scan the strong roots, including the perm gen.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4705
  double ext_roots_start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4706
  double closure_app_time_sec = 0.0;
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
  BufferingOopClosure buf_scan_non_heap_roots(scan_non_heap_roots);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4709
  BufferingOopsInGenClosure buf_scan_perm(scan_perm);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4710
  buf_scan_perm.set_generation(perm_gen());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4711
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4712
  // 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
  4713
  // unaligned oop locations.
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4714
  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
  4715
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4716
  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
  4717
                       collecting_perm_gen, so,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4718
                       &buf_scan_non_heap_roots,
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4719
                       &eager_scan_code_roots,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4720
                       &buf_scan_perm);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4721
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4722
  // Finish up any enqueued closure apps.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4723
  buf_scan_non_heap_roots.done();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4724
  buf_scan_perm.done();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4725
  double ext_roots_end = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4726
  g1_policy()->reset_obj_copy_time(worker_i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4727
  double obj_copy_time_sec =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4728
    buf_scan_non_heap_roots.closure_app_seconds() +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4729
    buf_scan_perm.closure_app_seconds();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4730
  g1_policy()->record_obj_copy_time(worker_i, obj_copy_time_sec * 1000.0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4731
  double ext_root_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4732
    ((ext_roots_end - ext_roots_start) - obj_copy_time_sec) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4733
  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
  4734
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4735
  // Scan strong roots in mark stack.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4736
  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
  4737
    concurrent_mark()->oops_do(scan_non_heap_roots);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4738
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4739
  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
  4740
  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
  4741
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4742
  // XXX What should this be doing in the parallel case?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4743
  g1_policy()->record_collection_pause_end_CH_strong_roots();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4744
  // Now scan the complement of the collection set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4745
  if (scan_rs != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4746
    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
  4747
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4748
  // Finish with the ref_processor roots.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4749
  if (!_process_strong_tasks->is_task_claimed(G1H_PS_refProcessor_oops_do)) {
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  4750
    // We need to treat the discovered reference lists as roots and
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  4751
    // keep entries (which are added by the marking threads) on them
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  4752
    // live until they can be processed at the end of marking.
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  4753
    ref_processor()->weak_oops_do(scan_non_heap_roots);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4754
    ref_processor()->oops_do(scan_non_heap_roots);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4755
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4756
  g1_policy()->record_collection_pause_end_G1_strong_roots();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4757
  _process_strong_tasks->all_tasks_completed();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4758
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4759
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4760
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4761
G1CollectedHeap::g1_process_weak_roots(OopClosure* root_closure,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4762
                                       OopClosure* non_root_closure) {
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4763
  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
  4764
  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
  4765
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4766
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4767
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4768
class SaveMarksClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4769
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4770
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4771
    r->save_marks();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4772
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4773
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4774
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4775
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4776
void G1CollectedHeap::save_marks() {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  4777
  if (!CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4778
    SaveMarksClosure sm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4779
    heap_region_iterate(&sm);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4780
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4781
  // We do this even in the parallel case
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4782
  perm_gen()->save_marks();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4783
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4784
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4785
void G1CollectedHeap::evacuate_collection_set() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4786
  set_evacuation_failed(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4787
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4788
  g1_rem_set()->prepare_for_oops_into_collection_set_do();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4789
  concurrent_g1_refine()->set_use_cache(false);
3589
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  4790
  concurrent_g1_refine()->clear_hot_cache_claimed_index();
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  4791
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4792
  int n_workers = (ParallelGCThreads > 0 ? workers()->total_workers() : 1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4793
  set_par_threads(n_workers);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4794
  G1ParTask g1_par_task(this, n_workers, _task_queues);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4795
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4796
  init_for_evac_failure(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4797
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4798
  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
  4799
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4800
  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
  4801
  double start_par = os::elapsedTime();
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  4802
  if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4803
    // 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
  4804
    StrongRootsScope srs(this);
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4805
    if (ParallelGCVerbose) G1ParScanThreadState::print_termination_stats_hdr();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4806
    workers()->run_task(&g1_par_task);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4807
  } else {
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4808
    StrongRootsScope srs(this);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4809
    g1_par_task.work(0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4810
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4811
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4812
  double par_time = (os::elapsedTime() - start_par) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4813
  g1_policy()->record_par_time(par_time);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4814
  set_par_threads(0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4815
  // Is this the right thing to do here?  We don't save marks
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4816
  // on individual heap regions when we allocate from
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4817
  // them in parallel, so this seems like the correct place for this.
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4818
  retire_all_alloc_regions();
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  4819
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  4820
  // Weak root processing.
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  4821
  // 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
  4822
  // 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
  4823
  // here too.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4824
  {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4825
    G1IsAliveClosure is_alive(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4826
    G1KeepAliveClosure keep_alive(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4827
    JNIHandles::weak_oops_do(&is_alive, &keep_alive);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4828
  }
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  4829
  release_gc_alloc_regions(false /* totally */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4830
  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
  4831
3589
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  4832
  concurrent_g1_refine()->clear_hot_cache();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4833
  concurrent_g1_refine()->set_use_cache(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4834
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4835
  finalize_for_evac_failure();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4836
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4837
  // Must do this before removing self-forwarding pointers, which clears
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4838
  // the per-region evac-failure flags.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4839
  concurrent_mark()->complete_marking_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4840
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4841
  if (evacuation_failed()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4842
    remove_self_forwarding_pointers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4843
    if (PrintGCDetails) {
6261
1fe3e07abdb4 6975964: G1: print out a more descriptive message for evacuation failure when +PrintGCDetails is set
tonyp
parents: 6260
diff changeset
  4844
      gclog_or_tty->print(" (to-space overflow)");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4845
    } else if (PrintGC) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4846
      gclog_or_tty->print("--");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4847
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4848
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4849
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4850
  if (G1DeferredRSUpdate) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4851
    RedirtyLoggedCardTableEntryFastClosure redirty;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4852
    dirty_card_queue_set().set_closure(&redirty);
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4853
    dirty_card_queue_set().apply_closure_to_all_completed_buffers();
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  4854
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  4855
    DirtyCardQueueSet& dcq = JavaThread::dirty_card_queue_set();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  4856
    dcq.merge_bufferlists(&dirty_card_queue_set());
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4857
    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
  4858
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4859
  COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4860
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4861
8072
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7923
diff changeset
  4862
void G1CollectedHeap::free_region_if_empty(HeapRegion* hr,
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4863
                                     size_t* pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4864
                                     FreeRegionList* free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4865
                                     HumongousRegionSet* humongous_proxy_set,
8072
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7923
diff changeset
  4866
                                     HRRSCleanupTask* hrrs_cleanup_task,
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4867
                                     bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4868
  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
  4869
    if (hr->isHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4870
      assert(hr->startsHumongous(), "we should only see starts humongous");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4871
      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
  4872
    } else {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4873
      free_region(hr, pre_used, free_list, par);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4874
    }
8072
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7923
diff changeset
  4875
  } else {
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7923
diff changeset
  4876
    hr->rem_set()->do_cleanup_work(hrrs_cleanup_task);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4877
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4878
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4879
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4880
void G1CollectedHeap::free_region(HeapRegion* hr,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4881
                                  size_t* pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4882
                                  FreeRegionList* free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4883
                                  bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4884
  assert(!hr->isHumongous(), "this is only for non-humongous regions");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4885
  assert(!hr->is_empty(), "the region should not be empty");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4886
  assert(free_list != NULL, "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4887
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4888
  *pre_used += hr->used();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4889
  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
  4890
  free_list->add_as_head(hr);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4891
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4892
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4893
void G1CollectedHeap::free_humongous_region(HeapRegion* hr,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4894
                                     size_t* pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4895
                                     FreeRegionList* free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4896
                                     HumongousRegionSet* humongous_proxy_set,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4897
                                     bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4898
  assert(hr->startsHumongous(), "this is only for starts humongous regions");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4899
  assert(free_list != NULL, "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4900
  assert(humongous_proxy_set != NULL, "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4901
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4902
  size_t hr_used = hr->used();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4903
  size_t hr_capacity = hr->capacity();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4904
  size_t hr_pre_used = 0;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4905
  _humongous_set.remove_with_proxy(hr, humongous_proxy_set);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4906
  hr->set_notHumongous();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4907
  free_region(hr, &hr_pre_used, free_list, par);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4908
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4909
  int i = hr->hrs_index() + 1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4910
  size_t num = 1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4911
  while ((size_t) i < n_regions()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4912
    HeapRegion* curr_hr = _hrs->at(i);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4913
    if (!curr_hr->continuesHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4914
      break;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4915
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4916
    curr_hr->set_notHumongous();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4917
    free_region(curr_hr, &hr_pre_used, free_list, par);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4918
    num += 1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4919
    i += 1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4920
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4921
  assert(hr_pre_used == hr_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4922
         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
  4923
                 "should be the same", hr_pre_used, hr_used));
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4924
  *pre_used += hr_pre_used;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4925
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4926
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4927
void G1CollectedHeap::update_sets_after_freeing_regions(size_t pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4928
                                       FreeRegionList* free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4929
                                       HumongousRegionSet* humongous_proxy_set,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4930
                                       bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4931
  if (pre_used > 0) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4932
    Mutex* lock = (par) ? ParGCRareEvent_lock : NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4933
    MutexLockerEx x(lock, Mutex::_no_safepoint_check_flag);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4934
    assert(_summary_bytes_used >= pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4935
           err_msg("invariant: _summary_bytes_used: "SIZE_FORMAT" "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4936
                   "should be >= pre_used: "SIZE_FORMAT,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4937
                   _summary_bytes_used, pre_used));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4938
    _summary_bytes_used -= pre_used;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4939
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4940
  if (free_list != NULL && !free_list->is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4941
    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
  4942
    _free_list.add_as_head(free_list);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4943
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4944
  if (humongous_proxy_set != NULL && !humongous_proxy_set->is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4945
    MutexLockerEx x(OldSets_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4946
    _humongous_set.update_from_proxy(humongous_proxy_set);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4947
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4948
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4949
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4950
void G1CollectedHeap::dirtyCardsForYoungRegions(CardTableModRefBS* ct_bs, HeapRegion* list) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4951
  while (list != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4952
    guarantee( list->is_young(), "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4953
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4954
    HeapWord* bottom = list->bottom();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4955
    HeapWord* end = list->end();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4956
    MemRegion mr(bottom, end);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4957
    ct_bs->dirty(mr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4958
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4959
    list = list->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4960
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4961
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4962
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4963
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4964
class G1ParCleanupCTTask : public AbstractGangTask {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4965
  CardTableModRefBS* _ct_bs;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4966
  G1CollectedHeap* _g1h;
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  4967
  HeapRegion* volatile _su_head;
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4968
public:
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4969
  G1ParCleanupCTTask(CardTableModRefBS* ct_bs,
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  4970
                     G1CollectedHeap* g1h,
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  4971
                     HeapRegion* survivor_list) :
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4972
    AbstractGangTask("G1 Par Cleanup CT Task"),
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4973
    _ct_bs(ct_bs),
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  4974
    _g1h(g1h),
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  4975
    _su_head(survivor_list)
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4976
  { }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4977
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4978
  void work(int i) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4979
    HeapRegion* r;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4980
    while (r = _g1h->pop_dirty_cards_region()) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4981
      clear_cards(r);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4982
    }
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4983
    // Redirty the cards of the survivor regions.
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  4984
    dirty_list(&this->_su_head);
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  4985
  }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  4986
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4987
  void clear_cards(HeapRegion* r) {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4988
    // Cards for Survivor regions will be dirtied later.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4989
    if (!r->is_survivor()) {
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4990
      _ct_bs->clear(MemRegion(r->bottom(), r->end()));
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4991
    }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  4992
  }
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  4993
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  4994
  void dirty_list(HeapRegion* volatile * head_ptr) {
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  4995
    HeapRegion* head;
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  4996
    do {
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  4997
      // Pop region off the list.
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  4998
      head = *head_ptr;
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  4999
      if (head != NULL) {
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5000
        HeapRegion* r = (HeapRegion*)
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5001
          Atomic::cmpxchg_ptr(head->get_next_young_region(), head_ptr, head);
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5002
        if (r == head) {
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5003
          assert(!r->isHumongous(), "Humongous regions shouldn't be on survivor list");
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5004
          _ct_bs->dirty(MemRegion(r->bottom(), r->end()));
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5005
        }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5006
      }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5007
    } while (*head_ptr != NULL);
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5008
  }
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5009
};
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5010
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5011
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5012
#ifndef PRODUCT
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5013
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
  5014
  G1CollectedHeap* _g1h;
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5015
  CardTableModRefBS* _ct_bs;
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5016
public:
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5017
  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
  5018
    : _g1h(g1h), _ct_bs(ct_bs) { }
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5019
  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
  5020
    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
  5021
      _g1h->verify_dirty_region(r);
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5022
    } else {
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5023
      _g1h->verify_not_dirty_region(r);
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5024
    }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5025
    return false;
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5026
  }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5027
};
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5028
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5029
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
  5030
  // 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
  5031
  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
  5032
  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
  5033
  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
  5034
}
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5035
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5036
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
  5037
  // 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
  5038
  // 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
  5039
  // 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
  5040
  // 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
  5041
  // 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
  5042
  // 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
  5043
  // is dirty.
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5044
  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
  5045
  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
  5046
  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
  5047
}
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5048
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5049
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
  5050
  CardTableModRefBS* ct_bs = (CardTableModRefBS*) barrier_set();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5051
  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
  5052
    verify_dirty_region(hr);
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5053
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5054
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5055
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5056
void G1CollectedHeap::verify_dirty_young_regions() {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5057
  verify_dirty_young_list(_young_list->first_region());
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5058
  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
  5059
}
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5060
#endif
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5061
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5062
void G1CollectedHeap::cleanUpCardTable() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5063
  CardTableModRefBS* ct_bs = (CardTableModRefBS*) (barrier_set());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5064
  double start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5065
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5066
  // Iterate over the dirty cards region list.
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5067
  G1ParCleanupCTTask cleanup_task(ct_bs, this,
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5068
                                  _young_list->first_survivor_region());
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5069
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5070
  if (ParallelGCThreads > 0) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5071
    set_par_threads(workers()->total_workers());
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5072
    workers()->run_task(&cleanup_task);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5073
    set_par_threads(0);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5074
  } else {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5075
    while (_dirty_cards_region_list) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5076
      HeapRegion* r = _dirty_cards_region_list;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5077
      cleanup_task.clear_cards(r);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5078
      _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
  5079
      if (_dirty_cards_region_list == r) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5080
        // The last region.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5081
        _dirty_cards_region_list = NULL;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5082
      }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5083
      r->set_next_dirty_cards_region(NULL);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5084
    }
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5085
    // now, redirty the cards of the survivor regions
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5086
    // (it seemed faster to do it this way, instead of iterating over
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5087
    // all regions and then clearing / dirtying as appropriate)
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5088
    dirtyCardsForYoungRegions(ct_bs, _young_list->first_survivor_region());
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5089
  }
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5090
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5091
  double elapsed = os::elapsedTime() - start;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5092
  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
  5093
#ifndef PRODUCT
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5094
  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
  5095
    G1VerifyCardTableCleanup cleanup_verifier(this, ct_bs);
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5096
    heap_region_iterate(&cleanup_verifier);
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5097
  }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5098
#endif
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5099
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5100
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5101
void G1CollectedHeap::free_collection_set(HeapRegion* cs_head) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5102
  size_t pre_used = 0;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5103
  FreeRegionList local_free_list("Local List for CSet Freeing");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5104
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5105
  double young_time_ms     = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5106
  double non_young_time_ms = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5107
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5108
  // 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
  5109
  // 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
  5110
  // 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
  5111
  _young_list->clear();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5112
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5113
  G1CollectorPolicy* policy = g1_policy();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5114
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5115
  double start_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5116
  bool non_young = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5117
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5118
  HeapRegion* cur = cs_head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5119
  int age_bound = -1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5120
  size_t rs_lengths = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5121
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5122
  while (cur != NULL) {
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  5123
    assert(!is_on_master_free_list(cur), "sanity");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5124
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5125
    if (non_young) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5126
      if (cur->is_young()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5127
        double end_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5128
        double elapsed_ms = (end_sec - start_sec) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5129
        non_young_time_ms += elapsed_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5130
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5131
        start_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5132
        non_young = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5133
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5134
    } else {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5135
      double end_sec = os::elapsedTime();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5136
      double elapsed_ms = (end_sec - start_sec) * 1000.0;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5137
      young_time_ms += elapsed_ms;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5138
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5139
      start_sec = os::elapsedTime();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5140
      non_young = true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5141
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5142
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5143
    rs_lengths += cur->rem_set()->occupied();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5144
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5145
    HeapRegion* next = cur->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5146
    assert(cur->in_collection_set(), "bad CS");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5147
    cur->set_next_in_collection_set(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5148
    cur->set_in_collection_set(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5149
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5150
    if (cur->is_young()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5151
      int index = cur->young_index_in_cset();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5152
      guarantee( index != -1, "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5153
      guarantee( (size_t)index < policy->young_cset_length(), "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5154
      size_t words_survived = _surviving_young_words[index];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5155
      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
  5156
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5157
      // 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
  5158
      // (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
  5159
      // 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
  5160
      // _next_young_region field.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5161
      cur->set_next_young_region(NULL);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5162
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5163
      int index = cur->young_index_in_cset();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5164
      guarantee( index == -1, "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5165
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5166
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5167
    assert( (cur->is_young() && cur->young_index_in_cset() > -1) ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5168
            (!cur->is_young() && cur->young_index_in_cset() == -1),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5169
            "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5170
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5171
    if (!cur->evacuation_failed()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5172
      // And the region is empty.
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5173
      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
  5174
      free_region(cur, &pre_used, &local_free_list, false /* par */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5175
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5176
      cur->uninstall_surv_rate_group();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5177
      if (cur->is_young())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5178
        cur->set_young_index_in_cset(-1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5179
      cur->set_not_young();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5180
      cur->set_evacuation_failed(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5181
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5182
    cur = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5183
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5184
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5185
  policy->record_max_rs_lengths(rs_lengths);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5186
  policy->cset_regions_freed();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5187
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5188
  double end_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5189
  double elapsed_ms = (end_sec - start_sec) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5190
  if (non_young)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5191
    non_young_time_ms += elapsed_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5192
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5193
    young_time_ms += elapsed_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5194
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5195
  update_sets_after_freeing_regions(pre_used, &local_free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5196
                                    NULL /* humongous_proxy_set */,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5197
                                    false /* par */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5198
  policy->record_young_free_cset_time_ms(young_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5199
  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
  5200
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5201
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5202
// 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
  5203
// 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
  5204
// 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
  5205
// 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
  5206
// 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
  5207
// 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
  5208
// 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
  5209
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5210
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
  5211
  HeapRegion* cur = cs_head;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5212
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5213
  while (cur != NULL) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5214
    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
  5215
    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
  5216
    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
  5217
    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
  5218
    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
  5219
    cur = next;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5220
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5221
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5222
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5223
void G1CollectedHeap::set_free_regions_coming() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5224
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5225
    gclog_or_tty->print_cr("G1ConcRegionFreeing [cm thread] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5226
                           "setting free regions coming");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5227
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5228
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5229
  assert(!free_regions_coming(), "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5230
  _free_regions_coming = true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5231
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5232
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5233
void G1CollectedHeap::reset_free_regions_coming() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5234
  {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5235
    assert(free_regions_coming(), "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5236
    MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5237
    _free_regions_coming = false;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5238
    SecondaryFreeList_lock->notify_all();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5239
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5240
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5241
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5242
    gclog_or_tty->print_cr("G1ConcRegionFreeing [cm thread] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5243
                           "reset free regions coming");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5244
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5245
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5246
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5247
void G1CollectedHeap::wait_while_free_regions_coming() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5248
  // 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
  5249
  // first before we take the lock.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5250
  if (!free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5251
    return;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5252
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5253
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5254
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5255
    gclog_or_tty->print_cr("G1ConcRegionFreeing [other] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5256
                           "waiting for free regions");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5257
  }
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
  {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5260
    MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5261
    while (free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5262
      SecondaryFreeList_lock->wait(Mutex::_no_safepoint_check_flag);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5263
    }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5264
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5265
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5266
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5267
    gclog_or_tty->print_cr("G1ConcRegionFreeing [other] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5268
                           "done waiting for free regions");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5269
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5270
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5271
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5272
size_t G1CollectedHeap::n_regions() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5273
  return _hrs->length();
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
size_t G1CollectedHeap::max_regions() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5277
  return
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  5278
    (size_t)align_size_up(max_capacity(), HeapRegion::GrainBytes) /
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5279
    HeapRegion::GrainBytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5280
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5281
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5282
void G1CollectedHeap::set_region_short_lived_locked(HeapRegion* hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5283
  assert(heap_lock_held_for_gc(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5284
              "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
  5285
  _young_list->push_region(hr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5286
  g1_policy()->set_region_short_lived(hr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5287
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5288
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5289
class NoYoungRegionsClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5290
private:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5291
  bool _success;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5292
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5293
  NoYoungRegionsClosure() : _success(true) { }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5294
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5295
    if (r->is_young()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5296
      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
  5297
                             r->bottom(), r->end());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5298
      _success = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5299
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5300
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5301
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5302
  bool success() { return _success; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5303
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5304
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5305
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
  5306
  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
  5307
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5308
  if (check_heap) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5309
    NoYoungRegionsClosure closure;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5310
    heap_region_iterate(&closure);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5311
    ret = ret && closure.success();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5312
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5313
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5314
  return ret;
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
void G1CollectedHeap::empty_young_list() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5318
  assert(heap_lock_held_for_gc(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5319
              "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
  5320
  assert(g1_policy()->in_young_gc_mode(), "should be in young GC mode");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5321
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5322
  _young_list->empty_list();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5323
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5324
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5325
bool G1CollectedHeap::all_alloc_regions_no_allocs_since_save_marks() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5326
  bool no_allocs = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5327
  for (int ap = 0; ap < GCAllocPurposeCount && no_allocs; ++ap) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5328
    HeapRegion* r = _gc_alloc_regions[ap];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5329
    no_allocs = r == NULL || r->saved_mark_at_top();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5330
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5331
  return no_allocs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5332
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5333
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  5334
void G1CollectedHeap::retire_all_alloc_regions() {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5335
  for (int ap = 0; ap < GCAllocPurposeCount; ++ap) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5336
    HeapRegion* r = _gc_alloc_regions[ap];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5337
    if (r != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5338
      // Check for aliases.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5339
      bool has_processed_alias = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5340
      for (int i = 0; i < ap; ++i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5341
        if (_gc_alloc_regions[i] == r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5342
          has_processed_alias = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5343
          break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5344
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5345
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5346
      if (!has_processed_alias) {
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  5347
        retire_alloc_region(r, false /* par */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5348
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5349
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5350
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5351
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5352
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5353
// Done at the start of full GC.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5354
void G1CollectedHeap::tear_down_region_lists() {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5355
  _free_list.remove_all();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5356
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5357
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5358
class RegionResetter: public HeapRegionClosure {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5359
  G1CollectedHeap* _g1h;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5360
  FreeRegionList _local_free_list;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5361
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5362
public:
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5363
  RegionResetter() : _g1h(G1CollectedHeap::heap()),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5364
                     _local_free_list("Local Free List for RegionResetter") { }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5365
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5366
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5367
    if (r->continuesHumongous()) return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5368
    if (r->top() > r->bottom()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5369
      if (r->top() < r->end()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5370
        Copy::fill_to_words(r->top(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5371
                          pointer_delta(r->end(), r->top()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5372
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5373
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5374
      assert(r->is_empty(), "tautology");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5375
      _local_free_list.add_as_tail(r);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5376
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5377
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5378
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5379
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5380
  void update_free_lists() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5381
    _g1h->update_sets_after_freeing_regions(0, &_local_free_list, NULL,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5382
                                            false /* par */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5383
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5384
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5385
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5386
// Done at the end of full GC.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5387
void G1CollectedHeap::rebuild_region_lists() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5388
  // This needs to go at the end of the full GC.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5389
  RegionResetter rs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5390
  heap_region_iterate(&rs);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5391
  rs.update_free_lists();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5392
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5393
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5394
void G1CollectedHeap::set_refine_cte_cl_concurrency(bool concurrent) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5395
  _refine_cte_cl->set_concurrent(concurrent);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5396
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5397
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5398
bool G1CollectedHeap::is_in_closed_subset(const void* p) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5399
  HeapRegion* hr = heap_region_containing(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5400
  if (hr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5401
    return is_in_permanent(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5402
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5403
    return hr->is_in(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5404
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5405
}
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5406
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5407
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
  5408
                                                      bool force) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5409
  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
  5410
  assert(!force || g1_policy()->can_expand_young_list(),
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5411
         "if force is true we should be able to expand the young list");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5412
  if (force || !g1_policy()->is_young_list_full()) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5413
    HeapRegion* new_alloc_region = new_region(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5414
                                              false /* do_expand */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5415
    if (new_alloc_region != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5416
      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
  5417
      set_region_short_lived_locked(new_alloc_region);
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  5418
      g1mm()->update_eden_counters();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5419
      return new_alloc_region;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5420
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5421
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5422
  return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5423
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5424
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5425
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
  5426
                                                  size_t allocated_bytes) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5427
  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
  5428
  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
  5429
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5430
  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
  5431
  _summary_bytes_used += allocated_bytes;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5432
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5433
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5434
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
  5435
                                                    bool force) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5436
  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
  5437
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5438
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5439
void MutatorAllocRegion::retire_region(HeapRegion* alloc_region,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5440
                                       size_t allocated_bytes) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5441
  _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
  5442
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5443
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5444
// Heap region set verification
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5445
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5446
class VerifyRegionListsClosure : public HeapRegionClosure {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5447
private:
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5448
  HumongousRegionSet* _humongous_set;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5449
  FreeRegionList*     _free_list;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5450
  size_t              _region_count;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5451
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5452
public:
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5453
  VerifyRegionListsClosure(HumongousRegionSet* humongous_set,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5454
                           FreeRegionList* free_list) :
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5455
    _humongous_set(humongous_set), _free_list(free_list),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5456
    _region_count(0) { }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5457
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5458
  size_t region_count()      { return _region_count;      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5459
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5460
  bool doHeapRegion(HeapRegion* hr) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5461
    _region_count += 1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5462
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5463
    if (hr->continuesHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5464
      return false;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5465
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5466
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5467
    if (hr->is_young()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5468
      // TODO
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5469
    } else if (hr->startsHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5470
      _humongous_set->verify_next_region(hr);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5471
    } else if (hr->is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5472
      _free_list->verify_next_region(hr);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5473
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5474
    return false;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5475
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5476
};
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5477
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5478
void G1CollectedHeap::verify_region_sets() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5479
  assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5480
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5481
  // First, check the explicit lists.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5482
  _free_list.verify();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5483
  {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5484
    // Given that a concurrent operation might be adding regions to
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5485
    // the secondary free list we have to take the lock before
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5486
    // verifying it.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5487
    MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5488
    _secondary_free_list.verify();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5489
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5490
  _humongous_set.verify();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5491
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5492
  // If a concurrent region freeing operation is in progress it will
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5493
  // be difficult to correctly attributed any free regions we come
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5494
  // 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
  5495
  // one of several (free_list, secondary_free_list, any local lists,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5496
  // 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
  5497
  // verification operation. Alternatively, waiting for the concurrent
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5498
  // 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
  5499
  // operation (no concurrent operation will last longer than the
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5500
  // interval between two calls to verification) and it might hide
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5501
  // any issues that we would like to catch during testing.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5502
  if (free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5503
    return;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5504
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5505
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  5506
  // Make sure we append the secondary_free_list on the free_list so
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  5507
  // that all free regions we will come across can be safely
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  5508
  // attributed to the free_list.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  5509
  append_secondary_free_list_if_not_empty_with_lock();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5510
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5511
  // Finally, make sure that the region accounting in the lists is
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5512
  // consistent with what we see in the heap.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5513
  _humongous_set.verify_start();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5514
  _free_list.verify_start();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5515
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5516
  VerifyRegionListsClosure cl(&_humongous_set, &_free_list);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5517
  heap_region_iterate(&cl);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5518
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5519
  _humongous_set.verify_end();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5520
  _free_list.verify_end();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5521
}