hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
author tonyp
Wed, 19 Jan 2011 19:30:42 -0500
changeset 7923 fc200fcd4e05
parent 7908 d1ab39295cee
child 8072 f223f43cd62f
permissions -rw-r--r--
6977804: G1: remove the zero-filling thread Summary: This changeset removes the zero-filling thread from G1 and collapses the two free region lists we had before (the "free" and "unclean" lists) into one. The new free list uses the new heap region sets / lists abstractions that we'll ultimately use it to keep track of all regions in the heap. A heap region set was also introduced for the humongous regions. Finally, this change increases the concurrency between the thread that completes freeing regions (after a cleanup pause) and the rest of the system (before we'd have to wait for said thread to complete before allocating a new region). The changest also includes a lot of refactoring and code simplification. Reviewed-by: jcoomes, johnc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     1
/*
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"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    31
#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    32
#include "gc_implementation/g1/g1CollectorPolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    33
#include "gc_implementation/g1/g1MarkSweep.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    34
#include "gc_implementation/g1/g1OopClosures.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    35
#include "gc_implementation/g1/g1RemSet.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    36
#include "gc_implementation/g1/heapRegionRemSet.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    37
#include "gc_implementation/g1/heapRegionSeq.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    38
#include "gc_implementation/g1/vm_operations_g1.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    39
#include "gc_implementation/shared/isGCActiveMark.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    40
#include "memory/gcLocker.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    41
#include "memory/genOopClosures.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    42
#include "memory/generationSpec.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    43
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    44
#include "oops/oop.pcgc.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    45
#include "runtime/aprofiler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    46
#include "runtime/vmThread.hpp"
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    47
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
    48
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
    49
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    50
// 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
    51
// to-be-collected) are printed at "strategic" points before / during
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    52
// / 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
    53
#define YOUNG_LIST_VERBOSE 0
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    54
// CURRENT STATUS
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    55
// This file is under construction.  Search for "FIXME".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    56
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    57
// INVARIANTS/NOTES
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    58
//
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    59
// All allocation activity covered by the G1CollectedHeap interface is
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    60
// serialized by acquiring the HeapLock.  This happens in mem_allocate
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    61
// and allocate_new_tlab, which are the "entry" points to the
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    62
// 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
    63
// 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
    64
// is done by clients of this interface.)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    65
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    66
// Local to this file.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    67
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    68
class RefineCardTableEntryClosure: public CardTableEntryClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    69
  SuspendibleThreadSet* _sts;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    70
  G1RemSet* _g1rs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    71
  ConcurrentG1Refine* _cg1r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    72
  bool _concurrent;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    73
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    74
  RefineCardTableEntryClosure(SuspendibleThreadSet* sts,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    75
                              G1RemSet* g1rs,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    76
                              ConcurrentG1Refine* cg1r) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    77
    _sts(sts), _g1rs(g1rs), _cg1r(cg1r), _concurrent(true)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    78
  {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    79
  bool do_card_ptr(jbyte* card_ptr, int worker_i) {
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
    80
    bool oops_into_cset = _g1rs->concurrentRefineOneCard(card_ptr, worker_i, false);
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
    81
    // This path is executed by the concurrent refine or mutator threads,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
    82
    // 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
    83
    // that point into the collection set.
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
    84
    assert(!oops_into_cset, "should be");
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
    85
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    86
    if (_concurrent && _sts->should_yield()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    87
      // Caller will actually yield.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    88
      return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    89
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    90
    // Otherwise, we finished successfully; return true.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    91
    return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    92
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    93
  void set_concurrent(bool b) { _concurrent = b; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    94
};
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
class ClearLoggedCardTableEntryClosure: public CardTableEntryClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    98
  int _calls;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    99
  G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   100
  CardTableModRefBS* _ctbs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   101
  int _histo[256];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   102
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   103
  ClearLoggedCardTableEntryClosure() :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   104
    _calls(0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   105
  {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   106
    _g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   107
    _ctbs = (CardTableModRefBS*)_g1h->barrier_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   108
    for (int i = 0; i < 256; i++) _histo[i] = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   109
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   110
  bool do_card_ptr(jbyte* card_ptr, int worker_i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   111
    if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   112
      _calls++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   113
      unsigned char* ujb = (unsigned char*)card_ptr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   114
      int ind = (int)(*ujb);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   115
      _histo[ind]++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   116
      *card_ptr = -1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   117
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   118
    return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   119
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   120
  int calls() { return _calls; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   121
  void print_histo() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   122
    gclog_or_tty->print_cr("Card table value histogram:");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   123
    for (int i = 0; i < 256; i++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   124
      if (_histo[i] != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   125
        gclog_or_tty->print_cr("  %d: %d", i, _histo[i]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   126
      }
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
class RedirtyLoggedCardTableEntryClosure: public CardTableEntryClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   132
  int _calls;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   133
  G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   134
  CardTableModRefBS* _ctbs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   135
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   136
  RedirtyLoggedCardTableEntryClosure() :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   137
    _calls(0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   138
  {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   139
    _g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   140
    _ctbs = (CardTableModRefBS*)_g1h->barrier_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   141
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   142
  bool do_card_ptr(jbyte* card_ptr, int worker_i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   143
    if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   144
      _calls++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   145
      *card_ptr = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   146
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   147
    return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   148
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   149
  int calls() { return _calls; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   150
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   151
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   152
class RedirtyLoggedCardTableEntryFastClosure : public CardTableEntryClosure {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   153
public:
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   154
  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
   155
    *card_ptr = CardTableModRefBS::dirty_card_val();
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   156
    return true;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   157
  }
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
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   160
YoungList::YoungList(G1CollectedHeap* g1h)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   161
  : _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
   162
    _length(0),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   163
    _last_sampled_rs_lengths(0),
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   164
    _survivor_head(NULL), _survivor_tail(NULL), _survivor_length(0)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   165
{
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   166
  guarantee( check_list_empty(false), "just making sure..." );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   167
}
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
void YoungList::push_region(HeapRegion *hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   170
  assert(!hr->is_young(), "should not already be young");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   171
  assert(hr->get_next_young_region() == NULL, "cause it should!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   172
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   173
  hr->set_next_young_region(_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   174
  _head = hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   175
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   176
  hr->set_young();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   177
  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
   178
  ++_length;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   179
}
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
void YoungList::add_survivor_region(HeapRegion* hr) {
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   182
  assert(hr->is_survivor(), "should be flagged as survivor region");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   183
  assert(hr->get_next_young_region() == NULL, "cause it should!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   184
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   185
  hr->set_next_young_region(_survivor_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   186
  if (_survivor_head == NULL) {
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   187
    _survivor_tail = hr;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   188
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   189
  _survivor_head = hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   190
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   191
  ++_survivor_length;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   192
}
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
void YoungList::empty_list(HeapRegion* list) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   195
  while (list != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   196
    HeapRegion* next = list->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   197
    list->set_next_young_region(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   198
    list->uninstall_surv_rate_group();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   199
    list->set_not_young();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   200
    list = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   201
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   202
}
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
void YoungList::empty_list() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   205
  assert(check_list_well_formed(), "young list should be well formed");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   206
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   207
  empty_list(_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   208
  _head = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   209
  _length = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   210
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   211
  empty_list(_survivor_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   212
  _survivor_head = NULL;
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   213
  _survivor_tail = NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   214
  _survivor_length = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   215
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   216
  _last_sampled_rs_lengths = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   217
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   218
  assert(check_list_empty(false), "just making sure...");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   219
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   220
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   221
bool YoungList::check_list_well_formed() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   222
  bool ret = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   223
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   224
  size_t length = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   225
  HeapRegion* curr = _head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   226
  HeapRegion* last = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   227
  while (curr != NULL) {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   228
    if (!curr->is_young()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   229
      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
   230
                             "incorrectly tagged (y: %d, surv: %d)",
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   231
                             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
   232
                             curr->is_young(), curr->is_survivor());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   233
      ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   234
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   235
    ++length;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   236
    last = curr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   237
    curr = curr->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   238
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   239
  ret = ret && (length == _length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   240
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   241
  if (!ret) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   242
    gclog_or_tty->print_cr("### YOUNG LIST seems not well formed!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   243
    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
   244
                           length, _length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   245
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   246
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   247
  return ret;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   248
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   249
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   250
bool YoungList::check_list_empty(bool check_sample) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   251
  bool ret = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   252
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   253
  if (_length != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   254
    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
   255
                  _length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   256
    ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   257
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   258
  if (check_sample && _last_sampled_rs_lengths != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   259
    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
   260
    ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   261
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   262
  if (_head != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   263
    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
   264
    ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   265
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   266
  if (!ret) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   267
    gclog_or_tty->print_cr("### YOUNG LIST does not seem empty");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   268
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   269
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   270
  return ret;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   271
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   272
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   273
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   274
YoungList::rs_length_sampling_init() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   275
  _sampled_rs_lengths = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   276
  _curr               = _head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   277
}
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
bool
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   280
YoungList::rs_length_sampling_more() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   281
  return _curr != NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   282
}
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
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   285
YoungList::rs_length_sampling_next() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   286
  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
   287
  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
   288
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   289
  _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
   290
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   291
  // 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
   292
  // 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
   293
  // 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
   294
  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
   295
    // 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
   296
    _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
   297
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   298
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   299
  _curr = _curr->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   300
  if (_curr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   301
    _last_sampled_rs_lengths = _sampled_rs_lengths;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   302
    // 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
   303
  }
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
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   307
YoungList::reset_auxilary_lists() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   308
  guarantee( is_empty(), "young list should be empty" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   309
  assert(check_list_well_formed(), "young list should be well formed");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   310
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   311
  // Add survivor regions to SurvRateGroup.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   312
  _g1h->g1_policy()->note_start_adding_survivor_regions();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   313
  _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
   314
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   315
  for (HeapRegion* curr = _survivor_head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   316
       curr != NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   317
       curr = curr->get_next_young_region()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   318
    _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
   319
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   320
    // 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
   321
    // 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
   322
    // pause.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   323
    _g1h->g1_policy()->add_region_to_incremental_cset_rhs(curr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   324
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   325
  _g1h->g1_policy()->note_stop_adding_survivor_regions();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   326
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   327
  _head   = _survivor_head;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   328
  _length = _survivor_length;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   329
  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
   330
    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
   331
    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
   332
    _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
   333
  }
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
  // 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
   336
  // 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
   337
  // 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
   338
  // 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
   339
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   340
  _g1h->g1_policy()->finished_recalculating_age_indexes(false /* is_survivors */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   341
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   342
  assert(check_list_well_formed(), "young list should be well formed");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   343
}
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
void YoungList::print() {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   346
  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
   347
  const char* names[] = {"YOUNG", "SURVIVOR"};
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   348
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   349
  for (unsigned int list = 0; list < ARRAY_SIZE(lists); ++list) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   350
    gclog_or_tty->print_cr("%s LIST CONTENTS", names[list]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   351
    HeapRegion *curr = lists[list];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   352
    if (curr == NULL)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   353
      gclog_or_tty->print_cr("  empty");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   354
    while (curr != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   355
      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
   356
                             "age: %4d, y: %d, surv: %d",
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   357
                             curr->bottom(), curr->end(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   358
                             curr->top(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   359
                             curr->prev_top_at_mark_start(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   360
                             curr->next_top_at_mark_start(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   361
                             curr->top_at_conc_mark_count(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   362
                             curr->age_in_surv_rate_group_cond(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   363
                             curr->is_young(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   364
                             curr->is_survivor());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   365
      curr = curr->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   366
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   367
  }
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
  gclog_or_tty->print_cr("");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   370
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   371
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   372
void G1CollectedHeap::push_dirty_cards_region(HeapRegion* hr)
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   373
{
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   374
  // 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
   375
  // by installing a self pointer.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   376
  HeapRegion* next = hr->get_next_dirty_cards_region();
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   377
  if (next == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   378
    HeapRegion* res = (HeapRegion*)
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   379
      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
   380
                          NULL);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   381
    if (res == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   382
      HeapRegion* head;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   383
      do {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   384
        // Put the region to the dirty cards region list.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   385
        head = _dirty_cards_region_list;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   386
        next = (HeapRegion*)
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   387
          Atomic::cmpxchg_ptr(hr, &_dirty_cards_region_list, head);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   388
        if (next == head) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   389
          assert(hr->get_next_dirty_cards_region() == hr,
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   390
                 "hr->get_next_dirty_cards_region() != hr");
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   391
          if (next == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   392
            // The last region in the list points to itself.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   393
            hr->set_next_dirty_cards_region(hr);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   394
          } else {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   395
            hr->set_next_dirty_cards_region(next);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   396
          }
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
      } while (next != head);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   399
    }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   400
  }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   401
}
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
HeapRegion* G1CollectedHeap::pop_dirty_cards_region()
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   404
{
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   405
  HeapRegion* head;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   406
  HeapRegion* hr;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   407
  do {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   408
    head = _dirty_cards_region_list;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   409
    if (head == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   410
      return NULL;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   411
    }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   412
    HeapRegion* new_head = head->get_next_dirty_cards_region();
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   413
    if (head == new_head) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   414
      // The last region.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   415
      new_head = NULL;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   416
    }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   417
    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
   418
                                          head);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   419
  } while (hr != head);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   420
  assert(hr != NULL, "invariant");
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   421
  hr->set_next_dirty_cards_region(NULL);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   422
  return hr;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   423
}
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   424
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   425
void G1CollectedHeap::stop_conc_gc_threads() {
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
   426
  _cg1r->stop();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   427
  _cmThread->stop();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   428
}
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
void G1CollectedHeap::check_ct_logs_at_safepoint() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   431
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   432
  CardTableModRefBS* ct_bs = (CardTableModRefBS*)barrier_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   433
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   434
  // Count the dirty cards at the start.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   435
  CountNonCleanMemRegionClosure count1(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   436
  ct_bs->mod_card_iterate(&count1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   437
  int orig_count = count1.n();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   438
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   439
  // First clear the logged cards.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   440
  ClearLoggedCardTableEntryClosure clear;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   441
  dcqs.set_closure(&clear);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   442
  dcqs.apply_closure_to_all_completed_buffers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   443
  dcqs.iterate_closure_all_threads(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   444
  clear.print_histo();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   445
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   446
  // Now ensure that there's no dirty cards.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   447
  CountNonCleanMemRegionClosure count2(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   448
  ct_bs->mod_card_iterate(&count2);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   449
  if (count2.n() != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   450
    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
   451
                           count2.n(), orig_count);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   452
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   453
  guarantee(count2.n() == 0, "Card table should be clean.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   454
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   455
  RedirtyLoggedCardTableEntryClosure redirty;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   456
  JavaThread::dirty_card_queue_set().set_closure(&redirty);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   457
  dcqs.apply_closure_to_all_completed_buffers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   458
  dcqs.iterate_closure_all_threads(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   459
  gclog_or_tty->print_cr("Log entries = %d, dirty cards = %d.",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   460
                         clear.calls(), orig_count);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   461
  guarantee(redirty.calls() == clear.calls(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   462
            "Or else mechanism is broken.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   463
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   464
  CountNonCleanMemRegionClosure count3(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   465
  ct_bs->mod_card_iterate(&count3);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   466
  if (count3.n() != orig_count) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   467
    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
   468
                           orig_count, count3.n());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   469
    guarantee(count3.n() >= orig_count, "Should have restored them all.");
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   472
  JavaThread::dirty_card_queue_set().set_closure(_refine_cte_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   473
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   474
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   475
// Private class members.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   476
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   477
G1CollectedHeap* G1CollectedHeap::_g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   478
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   479
// Private methods.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   480
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   481
HeapRegion*
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   482
G1CollectedHeap::new_region_try_secondary_free_list(size_t word_size) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   483
  MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   484
  while (!_secondary_free_list.is_empty() || free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   485
    if (!_secondary_free_list.is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   486
      if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   487
        gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   488
                               "secondary_free_list has "SIZE_FORMAT" entries",
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   489
                               _secondary_free_list.length());
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   490
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   491
      // It looks as if there are free regions available on the
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   492
      // 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
   493
      // again to allocate from it.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   494
      append_secondary_free_list();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   495
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   496
      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
   497
             "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
   498
      HeapRegion* res = _free_list.remove_head();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   499
      if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   500
        gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   501
                               "allocated "HR_FORMAT" from secondary_free_list",
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   502
                               HR_FORMAT_PARAMS(res));
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   503
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   504
      return res;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   505
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   506
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   507
    // 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
   508
    // 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
   509
    // the secondary_free_list.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   510
    SecondaryFreeList_lock->wait(Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   511
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   512
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   513
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   514
    gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   515
                           "could not allocate from secondary_free_list");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   516
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   517
  return NULL;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   518
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   519
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   520
HeapRegion* G1CollectedHeap::new_region_work(size_t word_size,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   521
                                             bool do_expand) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   522
  assert(!isHumongous(word_size) ||
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   523
                                  word_size <= (size_t) HeapRegion::GrainWords,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   524
         "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
   525
         "when we are allocating a single humongous region");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   526
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   527
  HeapRegion* res;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   528
  if (G1StressConcRegionFreeing) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   529
    if (!_secondary_free_list.is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   530
      if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   531
        gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   532
                               "forced to look at the secondary_free_list");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   533
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   534
      res = new_region_try_secondary_free_list(word_size);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   535
      if (res != NULL) {
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
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   540
  res = _free_list.remove_head_or_null();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   541
  if (res == NULL) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   542
    if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   543
      gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   544
                             "res == NULL, trying the secondary_free_list");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   545
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   546
    res = new_region_try_secondary_free_list(word_size);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   547
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   548
  if (res == NULL && do_expand) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   549
    expand(word_size * HeapWordSize);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   550
    res = _free_list.remove_head_or_null();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   551
  }
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
   552
  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
   553
    if (G1PrintHeapRegions) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   554
      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
   555
                             "top "PTR_FORMAT, res->hrs_index(),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   556
                             res->bottom(), res->end(), res->top());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   557
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   558
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   559
  return res;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   560
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   561
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   562
HeapRegion* G1CollectedHeap::new_gc_alloc_region(int purpose,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   563
                                                 size_t word_size) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   564
  HeapRegion* alloc_region = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   565
  if (_gc_alloc_region_counts[purpose] < g1_policy()->max_regions(purpose)) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   566
    alloc_region = new_region_work(word_size, true /* do_expand */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   567
    if (purpose == GCAllocForSurvived && alloc_region != NULL) {
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   568
      alloc_region->set_survivor();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   569
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   570
    ++_gc_alloc_region_counts[purpose];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   571
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   572
    g1_policy()->note_alloc_region_limit_reached(purpose);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   573
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   574
  return alloc_region;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   575
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   576
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   577
int G1CollectedHeap::humongous_obj_allocate_find_first(size_t num_regions,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   578
                                                       size_t word_size) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   579
  int first = -1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   580
  if (num_regions == 1) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   581
    // 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
   582
    // path. The caller will attempt the expasion if this fails, so
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   583
    // let's not try to expand here too.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   584
    HeapRegion* hr = new_region_work(word_size, false /* do_expand */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   585
    if (hr != NULL) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   586
      first = hr->hrs_index();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   587
    } else {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   588
      first = -1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   589
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   590
  } else {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   591
    // We can't allocate humongous regions while cleanupComplete() is
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   592
    // 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
   593
    // 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
   594
    // 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
   595
    // 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
   596
    // one region to satisfy the current humongous allocation
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   597
    // 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
   598
    // region allocation code (see above).
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   599
    wait_while_free_regions_coming();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   600
    append_secondary_free_list_if_not_empty();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   601
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   602
    if (free_regions() >= num_regions) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   603
      first = _hrs->find_contiguous(num_regions);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   604
      if (first != -1) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   605
        for (int i = first; i < first + (int) num_regions; ++i) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   606
          HeapRegion* hr = _hrs->at(i);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   607
          assert(hr->is_empty(), "sanity");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   608
          assert(is_on_free_list(hr), "sanity");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   609
          hr->set_pending_removal(true);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   610
        }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   611
        _free_list.remove_all_pending(num_regions);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   612
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   613
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   614
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   615
  return first;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   616
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   617
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   618
// If could fit into free regions w/o expansion, try.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   619
// Otherwise, if can expand, do so.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   620
// 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
   621
HeapWord* G1CollectedHeap::humongous_obj_allocate(size_t word_size) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   622
  assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   623
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   624
  verify_region_sets_optional();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   625
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   626
  size_t num_regions =
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   627
         round_to(word_size, HeapRegion::GrainWords) / HeapRegion::GrainWords;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   628
  size_t x_size = expansion_regions();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   629
  size_t fs = _hrs->free_suffix();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   630
  int first = humongous_obj_allocate_find_first(num_regions, word_size);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   631
  if (first == -1) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   632
    // The only thing we can do now is attempt expansion.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   633
    if (fs + x_size >= num_regions) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   634
      expand((num_regions - fs) * HeapRegion::GrainBytes);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   635
      first = humongous_obj_allocate_find_first(num_regions, word_size);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   636
      assert(first != -1, "this should have worked");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   637
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   638
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   639
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   640
  if (first != -1) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   641
    // Index of last region in the series + 1.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   642
    int last = first + (int) num_regions;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   643
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   644
    // We need to initialize the region(s) we just discovered. This is
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   645
    // a bit tricky given that it can happen concurrently with
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   646
    // refinement threads refining cards on these regions and
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   647
    // potentially wanting to refine the BOT as they are scanning
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   648
    // those cards (this can happen shortly after a cleanup; see CR
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   649
    // 6991377). So we have to set up the region(s) carefully and in
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   650
    // a specific order.
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
    // The word size sum of all the regions we will allocate.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   653
    size_t word_size_sum = num_regions * HeapRegion::GrainWords;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   654
    assert(word_size <= word_size_sum, "sanity");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   655
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   656
    // This will be the "starts humongous" region.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   657
    HeapRegion* first_hr = _hrs->at(first);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   658
    // The header of the new object will be placed at the bottom of
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   659
    // the first region.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   660
    HeapWord* new_obj = first_hr->bottom();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   661
    // This will be the new end of the first region in the series that
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   662
    // should also match the end of the last region in the seriers.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   663
    HeapWord* new_end = new_obj + word_size_sum;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   664
    // This will be the new top of the first region that will reflect
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   665
    // this allocation.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   666
    HeapWord* new_top = new_obj + word_size;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   667
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   668
    // First, we need to zero the header of the space that we will be
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   669
    // allocating. When we update top further down, some refinement
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   670
    // threads might try to scan the region. By zeroing the header we
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   671
    // ensure that any thread that will try to scan the region will
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   672
    // come across the zero klass word and bail out.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   673
    //
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   674
    // NOTE: It would not have been correct to have used
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   675
    // CollectedHeap::fill_with_object() and make the space look like
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   676
    // an int array. The thread that is doing the allocation will
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   677
    // later update the object header to a potentially different array
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   678
    // type and, for a very short period of time, the klass and length
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   679
    // fields will be inconsistent. This could cause a refinement
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   680
    // thread to calculate the object size incorrectly.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   681
    Copy::fill_to_words(new_obj, oopDesc::header_size(), 0);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   682
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   683
    // We will set up the first region as "starts humongous". This
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   684
    // will also update the BOT covering all the regions to reflect
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   685
    // that there is a single object that starts at the bottom of the
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   686
    // first region.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   687
    first_hr->set_startsHumongous(new_top, new_end);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   688
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   689
    // Then, if there are any, we will set up the "continues
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   690
    // humongous" regions.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   691
    HeapRegion* hr = NULL;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   692
    for (int i = first + 1; i < last; ++i) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   693
      hr = _hrs->at(i);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   694
      hr->set_continuesHumongous(first_hr);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   695
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   696
    // If we have "continues humongous" regions (hr != NULL), then the
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   697
    // end of the last one should match new_end.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   698
    assert(hr == NULL || hr->end() == new_end, "sanity");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   699
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   700
    // Up to this point no concurrent thread would have been able to
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   701
    // do any scanning on any region in this series. All the top
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   702
    // fields still point to bottom, so the intersection between
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   703
    // [bottom,top] and [card_start,card_end] will be empty. Before we
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   704
    // update the top fields, we'll do a storestore to make sure that
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   705
    // no thread sees the update to top before the zeroing of the
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   706
    // object header and the BOT initialization.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   707
    OrderAccess::storestore();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   708
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   709
    // Now that the BOT and the object header have been initialized,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   710
    // we can update top of the "starts humongous" region.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   711
    assert(first_hr->bottom() < new_top && new_top <= first_hr->end(),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   712
           "new_top should be in this region");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   713
    first_hr->set_top(new_top);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   714
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   715
    // Now, we will update the top fields of the "continues humongous"
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   716
    // regions. The reason we need to do this is that, otherwise,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   717
    // these regions would look empty and this will confuse parts of
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   718
    // G1. For example, the code that looks for a consecutive number
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   719
    // of empty regions will consider them empty and try to
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   720
    // re-allocate them. We can extend is_empty() to also include
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   721
    // !continuesHumongous(), but it is easier to just update the top
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   722
    // fields here. The way we set top for all regions (i.e., top ==
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   723
    // end for all regions but the last one, top == new_top for the
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   724
    // last one) is actually used when we will free up the humongous
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   725
    // region in free_humongous_region().
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   726
    hr = NULL;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   727
    for (int i = first + 1; i < last; ++i) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   728
      hr = _hrs->at(i);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   729
      if ((i + 1) == last) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   730
        // last continues humongous region
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   731
        assert(hr->bottom() < new_top && new_top <= hr->end(),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   732
               "new_top should fall on this region");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   733
        hr->set_top(new_top);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   734
      } else {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   735
        // not last one
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   736
        assert(new_top > hr->end(), "new_top should be above this region");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   737
        hr->set_top(hr->end());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   738
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   739
    }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   740
    // If we have continues humongous regions (hr != NULL), then the
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   741
    // end of the last one should match new_end and its top should
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   742
    // match new_top.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   743
    assert(hr == NULL ||
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   744
           (hr->end() == new_end && hr->top() == new_top), "sanity");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   745
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   746
    assert(first_hr->used() == word_size * HeapWordSize, "invariant");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   747
    _summary_bytes_used += first_hr->used();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   748
    _humongous_set.add(first_hr);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   749
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   750
    return new_obj;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   751
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   752
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   753
  verify_region_sets_optional();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   754
  return NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   755
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   756
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   757
void
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   758
G1CollectedHeap::retire_cur_alloc_region(HeapRegion* cur_alloc_region) {
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   759
  // Other threads might still be trying to allocate using CASes out
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   760
  // of the region we are retiring, as they can do so without holding
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   761
  // the Heap_lock. So we first have to make sure that noone else can
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   762
  // allocate in it by doing a maximal allocation. Even if our CAS
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   763
  // attempt fails a few times, we'll succeed sooner or later given
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   764
  // that a failed CAS attempt mean that the region is getting closed
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   765
  // to being full (someone else succeeded in allocating into it).
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   766
  size_t free_word_size = cur_alloc_region->free() / HeapWordSize;
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   767
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   768
  // This is the minimum free chunk we can turn into a dummy
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   769
  // object. If the free space falls below this, then noone can
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   770
  // allocate in this region anyway (all allocation requests will be
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   771
  // of a size larger than this) so we won't have to perform the dummy
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   772
  // allocation.
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   773
  size_t min_word_size_to_fill = CollectedHeap::min_fill_size();
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   774
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   775
  while (free_word_size >= min_word_size_to_fill) {
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   776
    HeapWord* dummy =
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   777
      cur_alloc_region->par_allocate_no_bot_updates(free_word_size);
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   778
    if (dummy != NULL) {
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   779
      // If the allocation was successful we should fill in the space.
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   780
      CollectedHeap::fill_with_object(dummy, free_word_size);
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   781
      break;
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   782
    }
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   783
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   784
    free_word_size = cur_alloc_region->free() / HeapWordSize;
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   785
    // It's also possible that someone else beats us to the
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   786
    // allocation and they fill up the region. In that case, we can
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   787
    // just get out of the loop
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   788
  }
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   789
  assert(cur_alloc_region->free() / HeapWordSize < min_word_size_to_fill,
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   790
         "sanity");
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   791
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   792
  retire_cur_alloc_region_common(cur_alloc_region);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   793
  assert(_cur_alloc_region == NULL, "post-condition");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   794
}
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   795
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   796
// See the comment in the .hpp file about the locking protocol and
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   797
// assumptions of this method (and other related ones).
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   798
HeapWord*
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   799
G1CollectedHeap::replace_cur_alloc_region_and_allocate(size_t word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   800
                                                       bool at_safepoint,
7416
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   801
                                                       bool do_dirtying,
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   802
                                                       bool can_expand) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   803
  assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   804
  assert(_cur_alloc_region == NULL,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   805
         "replace_cur_alloc_region_and_allocate() should only be called "
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   806
         "after retiring the previous current alloc region");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   807
  assert(SafepointSynchronize::is_at_safepoint() == at_safepoint,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   808
         "at_safepoint and is_at_safepoint() should be a tautology");
7416
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   809
  assert(!can_expand || g1_policy()->can_expand_young_list(),
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   810
         "we should not call this method with can_expand == true if "
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   811
         "we are not allowed to expand the young gen");
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   812
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   813
  if (can_expand || !g1_policy()->is_young_list_full()) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   814
    HeapRegion* new_cur_alloc_region = new_alloc_region(word_size);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   815
    if (new_cur_alloc_region != NULL) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   816
      assert(new_cur_alloc_region->is_empty(),
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   817
             "the newly-allocated region should be empty, "
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   818
             "as right now we only allocate new regions out of the free list");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   819
      g1_policy()->update_region_num(true /* next_is_young */);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   820
      set_region_short_lived_locked(new_cur_alloc_region);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   821
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   822
      assert(!new_cur_alloc_region->isHumongous(),
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   823
             "Catch a regression of this bug.");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   824
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   825
      // We need to ensure that the stores to _cur_alloc_region and,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   826
      // subsequently, to top do not float above the setting of the
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   827
      // young type.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   828
      OrderAccess::storestore();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   829
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   830
      // Now, perform the allocation out of the region we just
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   831
      // allocated. Note that noone else can access that region at
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   832
      // this point (as _cur_alloc_region has not been updated yet),
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   833
      // so we can just go ahead and do the allocation without any
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   834
      // atomics (and we expect this allocation attempt to
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   835
      // suceeded). Given that other threads can attempt an allocation
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   836
      // with a CAS and without needing the Heap_lock, if we assigned
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   837
      // the new region to _cur_alloc_region before first allocating
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   838
      // into it other threads might have filled up the new region
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   839
      // before we got a chance to do the allocation ourselves. In
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   840
      // that case, we would have needed to retire the region, grab a
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   841
      // new one, and go through all this again. Allocating out of the
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   842
      // new region before assigning it to _cur_alloc_region avoids
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   843
      // all this.
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   844
      HeapWord* result =
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   845
                     new_cur_alloc_region->allocate_no_bot_updates(word_size);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   846
      assert(result != NULL, "we just allocate out of an empty region "
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   847
             "so allocation should have been successful");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   848
      assert(is_in(result), "result should be in the heap");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   849
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   850
      // Now make sure that the store to _cur_alloc_region does not
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   851
      // float above the store to top.
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   852
      OrderAccess::storestore();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   853
      _cur_alloc_region = new_cur_alloc_region;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   854
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   855
      if (!at_safepoint) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   856
        Heap_lock->unlock();
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
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   859
      // do the dirtying, if necessary, after we release the Heap_lock
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   860
      if (do_dirtying) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   861
        dirty_young_block(result, word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   862
      }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   863
      return result;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   864
    }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   865
  }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   866
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   867
  assert(_cur_alloc_region == NULL, "we failed to allocate a new current "
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   868
         "alloc region, it should still be NULL");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   869
  assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   870
  return NULL;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   871
}
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   872
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   873
// See the comment in the .hpp file about the locking protocol and
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   874
// assumptions of this method (and other related ones).
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   875
HeapWord*
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   876
G1CollectedHeap::attempt_allocation_slow(size_t word_size) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   877
  assert_heap_locked_and_not_at_safepoint();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   878
  assert(!isHumongous(word_size), "attempt_allocation_slow() should not be "
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   879
         "used for humongous allocations");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   880
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   881
  // We should only reach here when we were unable to allocate
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   882
  // otherwise. So, we should have not active current alloc region.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   883
  assert(_cur_alloc_region == NULL, "current alloc region should be NULL");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   884
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   885
  // We will loop while succeeded is false, which means that we tried
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   886
  // to do a collection, but the VM op did not succeed. So, when we
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   887
  // exit the loop, either one of the allocation attempts was
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   888
  // successful, or we succeeded in doing the VM op but which was
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   889
  // unable to allocate after the collection.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   890
  for (int try_count = 1; /* we'll return or break */; try_count += 1) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   891
    bool succeeded = true;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   892
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   893
    // Every time we go round the loop we should be holding the Heap_lock.
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   894
    assert_heap_locked();
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   895
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   896
    if (GC_locker::is_active_and_needs_gc()) {
7416
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   897
      // We are locked out of GC because of the GC locker. We can
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   898
      // allocate a new region only if we can expand the young gen.
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   899
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   900
      if (g1_policy()->can_expand_young_list()) {
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   901
        // Yes, we are allowed to expand the young gen. Let's try to
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   902
        // allocate a new current alloc region.
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   903
        HeapWord* result =
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   904
          replace_cur_alloc_region_and_allocate(word_size,
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   905
                                                false, /* at_safepoint */
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   906
                                                true,  /* do_dirtying */
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   907
                                                true   /* can_expand */);
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   908
        if (result != NULL) {
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   909
          assert_heap_not_locked();
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   910
          return result;
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   911
        }
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   912
      }
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   913
      // We could not expand the young gen further (or we could but we
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   914
      // failed to allocate a new region). We'll stall until the GC
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
   915
      // locker forces a GC.
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   916
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   917
      // If this thread is not in a jni critical section, we stall
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   918
      // the requestor until the critical section has cleared and
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   919
      // GC allowed. When the critical section clears, a GC is
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   920
      // initiated by the last thread exiting the critical section; so
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   921
      // we retry the allocation sequence from the beginning of the loop,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   922
      // rather than causing more, now probably unnecessary, GC attempts.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   923
      JavaThread* jthr = JavaThread::current();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   924
      assert(jthr != NULL, "sanity");
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   925
      if (jthr->in_critical()) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   926
        if (CheckJNICalls) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   927
          fatal("Possible deadlock due to allocating while"
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   928
                " in jni critical section");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   929
        }
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   930
        // We are returning NULL so the protocol is that we're still
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   931
        // holding the Heap_lock.
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   932
        assert_heap_locked();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   933
        return NULL;
6068
80ef41e75a2d 6956639: G1: assert(cached_ptr != card_ptr) failed: shouldn't be, concurrentG1Refine.cpp:307
johnc
parents: 6058
diff changeset
   934
      }
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   935
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   936
      Heap_lock->unlock();
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   937
      GC_locker::stall_until_clear();
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   938
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   939
      // No need to relock the Heap_lock. We'll fall off to the code
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   940
      // below the else-statement which assumes that we are not
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   941
      // holding the Heap_lock.
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   942
    } else {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   943
      // We are not locked out. So, let's try to do a GC. The VM op
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   944
      // will retry the allocation before it completes.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   945
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   946
      // Read the GC count while holding the Heap_lock
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   947
      unsigned int gc_count_before = SharedHeap::heap()->total_collections();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   948
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   949
      Heap_lock->unlock();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   950
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   951
      HeapWord* result =
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   952
        do_collection_pause(word_size, gc_count_before, &succeeded);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   953
      assert_heap_not_locked();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   954
      if (result != NULL) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   955
        assert(succeeded, "the VM op should have succeeded");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   956
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   957
        // Allocations that take place on VM operations do not do any
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   958
        // card dirtying and we have to do it here.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   959
        dirty_young_block(result, word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   960
        return result;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   961
      }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   962
    }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   963
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   964
    // Both paths that get us here from above unlock the Heap_lock.
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
   965
    assert_heap_not_locked();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   966
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   967
    // We can reach here when we were unsuccessful in doing a GC,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   968
    // because another thread beat us to it, or because we were locked
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   969
    // out of GC due to the GC locker. In either case a new alloc
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   970
    // region might be available so we will retry the allocation.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   971
    HeapWord* result = attempt_allocation(word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   972
    if (result != NULL) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   973
      assert_heap_not_locked();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   974
      return result;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   975
    }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   976
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   977
    // So far our attempts to allocate failed. The only time we'll go
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   978
    // around the loop and try again is if we tried to do a GC and the
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   979
    // VM op that we tried to schedule was not successful because
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   980
    // another thread beat us to it. If that happened it's possible
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   981
    // that by the time we grabbed the Heap_lock again and tried to
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   982
    // allocate other threads filled up the young generation, which
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   983
    // means that the allocation attempt after the GC also failed. So,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   984
    // it's worth trying to schedule another GC pause.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   985
    if (succeeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   986
      break;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   987
    }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   988
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   989
    // Give a warning if we seem to be looping forever.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   990
    if ((QueuedAllocationWarningCount > 0) &&
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   991
        (try_count % QueuedAllocationWarningCount == 0)) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   992
      warning("G1CollectedHeap::attempt_allocation_slow() "
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   993
              "retries %d times", try_count);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   994
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   995
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   996
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   997
  assert_heap_locked();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   998
  return NULL;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   999
}
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1000
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1001
// See the comment in the .hpp file about the locking protocol and
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1002
// assumptions of this method (and other related ones).
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1003
HeapWord*
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1004
G1CollectedHeap::attempt_allocation_humongous(size_t word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1005
                                              bool at_safepoint) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1006
  // This is the method that will allocate a humongous object. All
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1007
  // allocation paths that attempt to allocate a humongous object
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1008
  // should eventually reach here. Currently, the only paths are from
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1009
  // mem_allocate() and attempt_allocation_at_safepoint().
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1010
  assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1011
  assert(isHumongous(word_size), "attempt_allocation_humongous() "
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1012
         "should only be used for humongous allocations");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1013
  assert(SafepointSynchronize::is_at_safepoint() == at_safepoint,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1014
         "at_safepoint and is_at_safepoint() should be a tautology");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1015
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1016
  HeapWord* result = NULL;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1017
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1018
  // We will loop while succeeded is false, which means that we tried
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1019
  // to do a collection, but the VM op did not succeed. So, when we
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1020
  // exit the loop, either one of the allocation attempts was
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1021
  // successful, or we succeeded in doing the VM op but which was
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1022
  // unable to allocate after the collection.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1023
  for (int try_count = 1; /* we'll return or break */; try_count += 1) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1024
    bool succeeded = true;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1025
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1026
    // Given that humongous objects are not allocated in young
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1027
    // regions, we'll first try to do the allocation without doing a
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1028
    // collection hoping that there's enough space in the heap.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1029
    result = humongous_obj_allocate(word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1030
    assert(_cur_alloc_region == NULL || !_cur_alloc_region->isHumongous(),
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1031
           "catch a regression of this bug.");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1032
    if (result != NULL) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1033
      if (!at_safepoint) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1034
        // If we're not at a safepoint, unlock the Heap_lock.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1035
        Heap_lock->unlock();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1036
      }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1037
      return result;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1038
    }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1039
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1040
    // If we failed to allocate the humongous object, we should try to
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1041
    // do a collection pause (if we're allowed) in case it reclaims
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1042
    // enough space for the allocation to succeed after the pause.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1043
    if (!at_safepoint) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1044
      // Read the GC count while holding the Heap_lock
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1045
      unsigned int gc_count_before = SharedHeap::heap()->total_collections();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1046
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1047
      // If we're allowed to do a collection we're not at a
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1048
      // safepoint, so it is safe to unlock the Heap_lock.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1049
      Heap_lock->unlock();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1050
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1051
      result = do_collection_pause(word_size, gc_count_before, &succeeded);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1052
      assert_heap_not_locked();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1053
      if (result != NULL) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1054
        assert(succeeded, "the VM op should have succeeded");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1055
        return result;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1056
      }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1057
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1058
      // If we get here, the VM operation either did not succeed
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1059
      // (i.e., another thread beat us to it) or it succeeded but
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1060
      // failed to allocate the object.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1061
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1062
      // If we're allowed to do a collection we're not at a
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1063
      // safepoint, so it is safe to lock the Heap_lock.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1064
      Heap_lock->lock();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1065
    }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1066
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1067
    assert(result == NULL, "otherwise we should have exited the loop earlier");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1068
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1069
    // So far our attempts to allocate failed. The only time we'll go
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1070
    // around the loop and try again is if we tried to do a GC and the
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1071
    // VM op that we tried to schedule was not successful because
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1072
    // another thread beat us to it. That way it's possible that some
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1073
    // space was freed up by the thread that successfully scheduled a
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1074
    // GC. So it's worth trying to allocate again.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1075
    if (succeeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1076
      break;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1077
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1078
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1079
    // Give a warning if we seem to be looping forever.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1080
    if ((QueuedAllocationWarningCount > 0) &&
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1081
        (try_count % QueuedAllocationWarningCount == 0)) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1082
      warning("G1CollectedHeap::attempt_allocation_humongous "
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1083
              "retries %d times", try_count);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1084
    }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1085
  }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1086
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1087
  assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1088
  return NULL;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1089
}
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1090
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1091
HeapWord* G1CollectedHeap::attempt_allocation_at_safepoint(size_t word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1092
                                           bool expect_null_cur_alloc_region) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1093
  assert_at_safepoint(true /* should_be_vm_thread */);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1094
  assert(_cur_alloc_region == NULL || !expect_null_cur_alloc_region,
7400
39b4f2314833 7003860: G1: assert(_cur_alloc_region == NULL || !expect_null_cur_alloc_region) fails
tonyp
parents: 7399
diff changeset
  1095
         err_msg("the current alloc region was unexpectedly found "
39b4f2314833 7003860: G1: assert(_cur_alloc_region == NULL || !expect_null_cur_alloc_region) fails
tonyp
parents: 7399
diff changeset
  1096
                 "to be non-NULL, cur alloc region: "PTR_FORMAT" "
39b4f2314833 7003860: G1: assert(_cur_alloc_region == NULL || !expect_null_cur_alloc_region) fails
tonyp
parents: 7399
diff changeset
  1097
                 "expect_null_cur_alloc_region: %d word_size: "SIZE_FORMAT,
39b4f2314833 7003860: G1: assert(_cur_alloc_region == NULL || !expect_null_cur_alloc_region) fails
tonyp
parents: 7399
diff changeset
  1098
                 _cur_alloc_region, expect_null_cur_alloc_region, word_size));
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1099
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1100
  if (!isHumongous(word_size)) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1101
    if (!expect_null_cur_alloc_region) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1102
      HeapRegion* cur_alloc_region = _cur_alloc_region;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1103
      if (cur_alloc_region != NULL) {
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
  1104
        // We are at a safepoint so no reason to use the MT-safe version.
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
  1105
        HeapWord* result = cur_alloc_region->allocate_no_bot_updates(word_size);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1106
        if (result != NULL) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1107
          assert(is_in(result), "result should be in the heap");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1108
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1109
          // We will not do any dirtying here. This is guaranteed to be
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1110
          // called during a safepoint and the thread that scheduled the
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1111
          // pause will do the dirtying if we return a non-NULL result.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1112
          return result;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1113
        }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1114
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1115
        retire_cur_alloc_region_common(cur_alloc_region);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1116
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1117
    }
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1118
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1119
    assert(_cur_alloc_region == NULL,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1120
           "at this point we should have no cur alloc region");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1121
    return replace_cur_alloc_region_and_allocate(word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1122
                                                 true, /* at_safepoint */
7416
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
  1123
                                                 false /* do_dirtying */,
cfe3bfab7d48 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 7400
diff changeset
  1124
                                                 false /* can_expand */);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1125
  } else {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1126
    return attempt_allocation_humongous(word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1127
                                        true /* at_safepoint */);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1128
  }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1129
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1130
  ShouldNotReachHere();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1131
}
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1132
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1133
HeapWord* G1CollectedHeap::allocate_new_tlab(size_t word_size) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1134
  assert_heap_not_locked_and_not_at_safepoint();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1135
  assert(!isHumongous(word_size), "we do not allow TLABs of humongous size");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1136
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
  1137
  // First attempt: Try allocating out of the current alloc region
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
  1138
  // using a CAS. If that fails, take the Heap_lock and retry the
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
  1139
  // allocation, potentially replacing the current alloc region.
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1140
  HeapWord* result = attempt_allocation(word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1141
  if (result != NULL) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1142
    assert_heap_not_locked();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1143
    return result;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1144
  }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1145
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
  1146
  // Second attempt: Go to the slower path where we might try to
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
  1147
  // schedule a collection.
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1148
  result = attempt_allocation_slow(word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1149
  if (result != NULL) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1150
    assert_heap_not_locked();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1151
    return result;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1152
  }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1153
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1154
  assert_heap_locked();
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
  1155
  // Need to unlock the Heap_lock before returning.
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1156
  Heap_lock->unlock();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1157
  return NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1158
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1159
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1160
HeapWord*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1161
G1CollectedHeap::mem_allocate(size_t word_size,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1162
                              bool   is_noref,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1163
                              bool   is_tlab,
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1164
                              bool*  gc_overhead_limit_was_exceeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1165
  assert_heap_not_locked_and_not_at_safepoint();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1166
  assert(!is_tlab, "mem_allocate() this should not be called directly "
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1167
         "to allocate TLABs");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1168
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1169
  // Loop until the allocation is satisified,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1170
  // or unsatisfied after GC.
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1171
  for (int try_count = 1; /* we'll return */; try_count += 1) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1172
    unsigned int gc_count_before;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1173
    {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1174
      if (!isHumongous(word_size)) {
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
  1175
        // First attempt: Try allocating out of the current alloc region
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
  1176
        // using a CAS. If that fails, take the Heap_lock and retry the
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
  1177
        // allocation, potentially replacing the current alloc region.
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1178
        HeapWord* result = attempt_allocation(word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1179
        if (result != NULL) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1180
          assert_heap_not_locked();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1181
          return result;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1182
        }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1183
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1184
        assert_heap_locked();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1185
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
  1186
        // Second attempt: Go to the slower path where we might try to
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
  1187
        // schedule a collection.
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1188
        result = attempt_allocation_slow(word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1189
        if (result != NULL) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1190
          assert_heap_not_locked();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1191
          return result;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1192
        }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1193
      } else {
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
  1194
        // attempt_allocation_humongous() requires the Heap_lock to be held.
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
  1195
        Heap_lock->lock();
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
  1196
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1197
        HeapWord* result = attempt_allocation_humongous(word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1198
                                                     false /* at_safepoint */);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1199
        if (result != NULL) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1200
          assert_heap_not_locked();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1201
          return result;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1202
        }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1203
      }
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1204
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1205
      assert_heap_locked();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1206
      // Read the gc count while the heap lock is held.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1207
      gc_count_before = SharedHeap::heap()->total_collections();
7905
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
  1208
cc7740616b03 6994297: G1: do first-level slow-path allocations with a CAS
tonyp
parents: 7904
diff changeset
  1209
      // Release the Heap_lock before attempting the collection.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1210
      Heap_lock->unlock();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1211
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1212
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1213
    // Create the garbage collection operation...
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1214
    VM_G1CollectForAllocation op(gc_count_before, word_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1215
    // ...and get the VM thread to execute it.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1216
    VMThread::execute(&op);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1217
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1218
    assert_heap_not_locked();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1219
    if (op.prologue_succeeded() && op.pause_succeeded()) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1220
      // If the operation was successful we'll return the result even
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1221
      // if it is NULL. If the allocation attempt failed immediately
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1222
      // 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
  1223
      HeapWord* result = op.result();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1224
      if (result != NULL && !isHumongous(word_size)) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1225
        // Allocations that take place on VM operations do not do any
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1226
        // 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
  1227
        // this for non-humongous allocations, though.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1228
        dirty_young_block(result, word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1229
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1230
      return result;
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1231
    } else {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1232
      assert(op.result() == NULL,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1233
             "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
  1234
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1235
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1236
    // Give a warning if we seem to be looping forever.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1237
    if ((QueuedAllocationWarningCount > 0) &&
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1238
        (try_count % QueuedAllocationWarningCount == 0)) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1239
      warning("G1CollectedHeap::mem_allocate retries %d times", try_count);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1240
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1241
  }
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1242
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1243
  ShouldNotReachHere();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1244
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1245
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1246
void G1CollectedHeap::abandon_cur_alloc_region() {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1247
  assert_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1248
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1249
  HeapRegion* cur_alloc_region = _cur_alloc_region;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1250
  if (cur_alloc_region != NULL) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1251
    assert(!cur_alloc_region->is_empty(),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1252
           "the current alloc region can never be empty");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1253
    assert(cur_alloc_region->is_young(),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1254
           "the current alloc region should be young");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1255
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1256
    retire_cur_alloc_region_common(cur_alloc_region);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1257
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1258
  assert(_cur_alloc_region == NULL, "post-condition");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1259
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1260
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1261
void G1CollectedHeap::abandon_gc_alloc_regions() {
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1262
  // 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
  1263
  assert(_gc_alloc_region_list == NULL, "invariant");
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1264
  release_gc_alloc_regions(true /* totally */);
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1265
}
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1266
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1267
class PostMCRemSetClearClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1268
  ModRefBarrierSet* _mr_bs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1269
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1270
  PostMCRemSetClearClosure(ModRefBarrierSet* mr_bs) : _mr_bs(mr_bs) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1271
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1272
    r->reset_gc_time_stamp();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1273
    if (r->continuesHumongous())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1274
      return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1275
    HeapRegionRemSet* hrrs = r->rem_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1276
    if (hrrs != NULL) hrrs->clear();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1277
    // You might think here that we could clear just the cards
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1278
    // 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
  1279
    // 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
  1280
    // from being enqueued, and cause it to be missed.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1281
    // 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
  1282
    _mr_bs->clear(MemRegion(r->bottom(), r->end()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1283
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1284
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1285
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1286
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1287
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1288
class PostMCRemSetInvalidateClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1289
  ModRefBarrierSet* _mr_bs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1290
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1291
  PostMCRemSetInvalidateClosure(ModRefBarrierSet* mr_bs) : _mr_bs(mr_bs) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1292
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1293
    if (r->continuesHumongous()) return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1294
    if (r->used_region().word_size() != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1295
      _mr_bs->invalidate(r->used_region(), true /*whole heap*/);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1296
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1297
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1298
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1299
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1300
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1301
class RebuildRSOutOfRegionClosure: public HeapRegionClosure {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1302
  G1CollectedHeap*   _g1h;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1303
  UpdateRSOopClosure _cl;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1304
  int                _worker_i;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1305
public:
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1306
  RebuildRSOutOfRegionClosure(G1CollectedHeap* g1, int worker_i = 0) :
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  1307
    _cl(g1->g1_rem_set(), worker_i),
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1308
    _worker_i(worker_i),
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1309
    _g1h(g1)
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1310
  { }
7385
eaca4b61b374 6978187: G1: assert(ParallelGCThreads> 1 || n_yielded() == _hrrs->occupied()) strikes again
johnc
parents: 6980
diff changeset
  1311
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1312
  bool doHeapRegion(HeapRegion* r) {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1313
    if (!r->continuesHumongous()) {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1314
      _cl.set_from(r);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1315
      r->oop_iterate(&_cl);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1316
    }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1317
    return false;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1318
  }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1319
};
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1320
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1321
class ParRebuildRSTask: public AbstractGangTask {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1322
  G1CollectedHeap* _g1;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1323
public:
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1324
  ParRebuildRSTask(G1CollectedHeap* g1)
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1325
    : AbstractGangTask("ParRebuildRSTask"),
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1326
      _g1(g1)
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1327
  { }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1328
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1329
  void work(int i) {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1330
    RebuildRSOutOfRegionClosure rebuild_rs(_g1, i);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1331
    _g1->heap_region_par_iterate_chunked(&rebuild_rs, i,
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1332
                                         HeapRegion::RebuildRSClaimValue);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1333
  }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1334
};
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1335
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1336
bool G1CollectedHeap::do_collection(bool explicit_gc,
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1337
                                    bool clear_all_soft_refs,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1338
                                    size_t word_size) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1339
  assert_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1340
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  1341
  if (GC_locker::check_active_before_gc()) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1342
    return false;
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  1343
  }
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  1344
7896
08aadd7aa3ee 6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents: 7659
diff changeset
  1345
  SvcGCMarker sgcm(SvcGCMarker::FULL);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1346
  ResourceMark rm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1347
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1348
  if (PrintHeapAtGC) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1349
    Universe::print_heap_before_gc();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1350
  }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1351
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1352
  verify_region_sets_optional();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1353
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1354
  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
  1355
                           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
  1356
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1357
  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
  1358
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1359
  {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1360
    IsGCActiveMark x;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1361
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1362
    // Timing
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1363
    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
  1364
    assert(!system_gc || explicit_gc, "invariant");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1365
    gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1366
    TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1367
    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
  1368
                PrintGC, true, gclog_or_tty);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1369
4459
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  1370
    TraceMemoryManagerStats tms(true /* fullGC */);
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  1371
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1372
    double start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1373
    g1_policy()->record_full_collection_start();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1374
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1375
    wait_while_free_regions_coming();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1376
    append_secondary_free_list_if_not_empty();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1377
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1378
    gc_prologue(true);
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1379
    increment_total_collections(true /* full gc */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1380
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1381
    size_t g1h_prev_used = used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1382
    assert(used() == recalculate_used(), "Should be equal");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1383
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1384
    if (VerifyBeforeGC && total_collections() >= VerifyGCStartAt) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1385
      HandleMark hm;  // Discard invalid handles created during verification
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1386
      prepare_for_verify();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1387
      gclog_or_tty->print(" VerifyBeforeGC:");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1388
      Universe::verify(true);
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1391
    COMPILER2_PRESENT(DerivedPointerTable::clear());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1392
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1393
    // We want to discover references, but not process them yet.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1394
    // This mode is disabled in
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1395
    // instanceRefKlass::process_discovered_references if the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1396
    // generation does some collection work, or
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1397
    // instanceRefKlass::enqueue_discovered_references if the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1398
    // generation returns without doing any work.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1399
    ref_processor()->disable_discovery();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1400
    ref_processor()->abandon_partial_discovery();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1401
    ref_processor()->verify_no_references_recorded();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1402
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1403
    // Abandon current iterations of concurrent marking and concurrent
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1404
    // refinement, if any are in progress.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1405
    concurrent_mark()->abort();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1406
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1407
    // Make sure we'll choose a new allocation region afterwards.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1408
    abandon_cur_alloc_region();
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1409
    abandon_gc_alloc_regions();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1410
    assert(_cur_alloc_region == NULL, "Invariant.");
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  1411
    g1_rem_set()->cleanupHRRS();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1412
    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
  1413
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1414
    // 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
  1415
    // 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
  1416
    // 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
  1417
    // after this full GC.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1418
    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
  1419
    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
  1420
    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
  1421
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1422
    if (g1_policy()->in_young_gc_mode()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1423
      empty_young_list();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1424
      g1_policy()->set_full_young_gcs(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1425
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1426
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  1427
    // 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
  1428
    // how reference processing currently works in G1.
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  1429
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1430
    // Temporarily make reference _discovery_ single threaded (non-MT).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1431
    ReferenceProcessorMTMutator rp_disc_ser(ref_processor(), false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1432
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1433
    // Temporarily make refs discovery atomic
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1434
    ReferenceProcessorAtomicMutator rp_disc_atomic(ref_processor(), true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1435
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1436
    // Temporarily clear _is_alive_non_header
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1437
    ReferenceProcessorIsAliveMutator rp_is_alive_null(ref_processor(), NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1438
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1439
    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
  1440
    ref_processor()->setup_policy(do_clear_all_soft_refs);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1441
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1442
    // Do collection work
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1443
    {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1444
      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
  1445
      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
  1446
    }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1447
    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
  1448
    rebuild_region_lists();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1449
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1450
    _summary_bytes_used = recalculate_used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1451
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1452
    ref_processor()->enqueue_discovered_references();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1453
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1454
    COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1455
4459
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  1456
    MemoryService::track_memory_usage();
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  1457
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1458
    if (VerifyAfterGC && total_collections() >= VerifyGCStartAt) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1459
      HandleMark hm;  // Discard invalid handles created during verification
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1460
      gclog_or_tty->print(" VerifyAfterGC:");
2249
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  1461
      prepare_for_verify();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1462
      Universe::verify(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1463
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1464
    NOT_PRODUCT(ref_processor()->verify_no_references_recorded());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1465
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1466
    reset_gc_time_stamp();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1467
    // Since everything potentially moved, we will clear all remembered
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1468
    // sets, and clear all cards.  Later we will rebuild remebered
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1469
    // 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
  1470
    PostMCRemSetClearClosure rs_clear(mr_bs());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1471
    heap_region_iterate(&rs_clear);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1472
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1473
    // Resize the heap if necessary.
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1474
    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
  1475
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1476
    if (_cg1r->use_cache()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1477
      _cg1r->clear_and_record_card_counts();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1478
      _cg1r->clear_hot_cache();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1479
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1480
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1481
    // Rebuild remembered sets of all regions.
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  1482
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  1483
    if (G1CollectedHeap::use_parallel_gc_threads()) {
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1484
      ParRebuildRSTask rebuild_rs_task(this);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1485
      assert(check_heap_region_claim_values(
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1486
             HeapRegion::InitialClaimValue), "sanity check");
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1487
      set_par_threads(workers()->total_workers());
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1488
      workers()->run_task(&rebuild_rs_task);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1489
      set_par_threads(0);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1490
      assert(check_heap_region_claim_values(
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1491
             HeapRegion::RebuildRSClaimValue), "sanity check");
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1492
      reset_heap_region_claim_values();
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1493
    } else {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1494
      RebuildRSOutOfRegionClosure rebuild_rs(this);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1495
      heap_region_iterate(&rebuild_rs);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1496
    }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1497
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1498
    if (PrintGC) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1499
      print_size_transition(gclog_or_tty, g1h_prev_used, used(), capacity());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1500
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1501
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1502
    if (true) { // FIXME
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1503
      // Ask the permanent generation to adjust size for full collections
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1504
      perm()->compute_new_size();
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
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1507
    // 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
  1508
    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
  1509
    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
  1510
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1511
    // 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
  1512
    // 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
  1513
    // evacuation pause.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1514
    clear_cset_fast_test();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  1515
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1516
    double end = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1517
    g1_policy()->record_full_collection_end();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1518
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  1519
#ifdef TRACESPINNING
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  1520
    ParallelTaskTerminator::print_termination_counts();
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  1521
#endif
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  1522
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1523
    gc_epilogue(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1524
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  1525
    // Discard all rset updates
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  1526
    JavaThread::dirty_card_queue_set().abandon_logs();
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  1527
    assert(!G1DeferredRSUpdate
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  1528
           || (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
  1529
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1530
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1531
  if (g1_policy()->in_young_gc_mode()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1532
    _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
  1533
    // 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
  1534
    // 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
  1535
    assert( check_young_list_empty(true /* check_heap */),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1536
            "young list should be empty at this point");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1537
  }
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1538
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1539
  // 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
  1540
  increment_full_collections_completed(false /* concurrent */);
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1541
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1542
  verify_region_sets_optional();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1543
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1544
  if (PrintHeapAtGC) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1545
    Universe::print_heap_after_gc();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1546
  }
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1547
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1548
  return true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1549
}
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
void G1CollectedHeap::do_full_collection(bool clear_all_soft_refs) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1552
  // do_collection() will return whether it succeeded in performing
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1553
  // the GC. Currently, there is no facility on the
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1554
  // do_full_collection() API to notify the caller than the collection
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1555
  // 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
  1556
  // locker). So, right now, we'll ignore the return value.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1557
  bool dummy = do_collection(true,                /* explicit_gc */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1558
                             clear_all_soft_refs,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1559
                             0                    /* word_size */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1560
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1561
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1562
// This code is mostly copied from TenuredGeneration.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1563
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1564
G1CollectedHeap::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1565
resize_if_necessary_after_full_collection(size_t word_size) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1566
  assert(MinHeapFreeRatio <= MaxHeapFreeRatio, "sanity check");
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
  // Include the current allocation, if any, and bytes that will be
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1569
  // pre-allocated to support collections, as "used".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1570
  const size_t used_after_gc = used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1571
  const size_t capacity_after_gc = capacity();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1572
  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
  1573
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1574
  // This is enforced in arguments.cpp.
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1575
  assert(MinHeapFreeRatio <= MaxHeapFreeRatio,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1576
         "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
  1577
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1578
  // 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
  1579
  const double minimum_free_percentage = (double) MinHeapFreeRatio / 100.0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1580
  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
  1581
  const double maximum_free_percentage = (double) MaxHeapFreeRatio / 100.0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1582
  const double minimum_used_percentage = 1.0 - maximum_free_percentage;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1583
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1584
  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
  1585
  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
  1586
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1587
  // 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
  1588
  // 32-bit size_t's.
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1589
  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
  1590
  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
  1591
  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
  1592
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1593
  // 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
  1594
  // 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
  1595
  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
  1596
  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
  1597
                                    desired_capacity_upper_bound);
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1598
  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
  1599
                                    desired_capacity_upper_bound);
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1600
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1601
  // 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
  1602
  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
  1603
  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
  1604
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1605
  // 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
  1606
  // 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
  1607
  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
  1608
         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
  1609
                 "maximum_desired_capacity = "SIZE_FORMAT,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1610
                 minimum_desired_capacity, maximum_desired_capacity));
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1611
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1612
  // 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
  1613
  // 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
  1614
  // 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
  1615
  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
  1616
  // 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
  1617
  // 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
  1618
  // 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
  1619
  maximum_desired_capacity =  MAX2(maximum_desired_capacity, min_heap_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1620
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1621
  if (PrintGC && Verbose) {
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1622
    const double free_percentage =
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1623
      (double) free_after_gc / (double) capacity_after_gc;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1624
    gclog_or_tty->print_cr("Computing new size after full GC ");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1625
    gclog_or_tty->print_cr("  "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1626
                           "  minimum_free_percentage: %6.2f",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1627
                           minimum_free_percentage);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1628
    gclog_or_tty->print_cr("  "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1629
                           "  maximum_free_percentage: %6.2f",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1630
                           maximum_free_percentage);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1631
    gclog_or_tty->print_cr("  "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1632
                           "  capacity: %6.1fK"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1633
                           "  minimum_desired_capacity: %6.1fK"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1634
                           "  maximum_desired_capacity: %6.1fK",
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1635
                           (double) capacity_after_gc / (double) K,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1636
                           (double) minimum_desired_capacity / (double) K,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1637
                           (double) maximum_desired_capacity / (double) K);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1638
    gclog_or_tty->print_cr("  "
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1639
                           "  free_after_gc: %6.1fK"
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1640
                           "  used_after_gc: %6.1fK",
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1641
                           (double) free_after_gc / (double) K,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1642
                           (double) used_after_gc / (double) K);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1643
    gclog_or_tty->print_cr("  "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1644
                           "   free_percentage: %6.2f",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1645
                           free_percentage);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1646
  }
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1647
  if (capacity_after_gc < minimum_desired_capacity) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1648
    // Don't expand unless it's significant
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1649
    size_t expand_bytes = minimum_desired_capacity - capacity_after_gc;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1650
    expand(expand_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1651
    if (PrintGC && Verbose) {
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1652
      gclog_or_tty->print_cr("  "
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1653
                             "  expanding:"
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1654
                             "  max_heap_size: %6.1fK"
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1655
                             "  minimum_desired_capacity: %6.1fK"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1656
                             "  expand_bytes: %6.1fK",
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1657
                             (double) max_heap_size / (double) K,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1658
                             (double) minimum_desired_capacity / (double) K,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1659
                             (double) expand_bytes / (double) K);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1660
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1661
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1662
    // 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
  1663
  } else if (capacity_after_gc > maximum_desired_capacity) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1664
    // Capacity too large, compute shrinking size
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1665
    size_t shrink_bytes = capacity_after_gc - maximum_desired_capacity;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1666
    shrink(shrink_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1667
    if (PrintGC && Verbose) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1668
      gclog_or_tty->print_cr("  "
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1669
                             "  shrinking:"
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1670
                             "  min_heap_size: %6.1fK"
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1671
                             "  maximum_desired_capacity: %6.1fK"
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1672
                             "  shrink_bytes: %6.1fK",
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1673
                             (double) min_heap_size / (double) K,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1674
                             (double) maximum_desired_capacity / (double) K,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1675
                             (double) shrink_bytes / (double) K);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1676
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1677
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1678
}
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1681
HeapWord*
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1682
G1CollectedHeap::satisfy_failed_allocation(size_t word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1683
                                           bool* succeeded) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1684
  assert_at_safepoint(true /* should_be_vm_thread */);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1685
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1686
  *succeeded = true;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1687
  // Let's attempt the allocation first.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1688
  HeapWord* result = attempt_allocation_at_safepoint(word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1689
                                     false /* expect_null_cur_alloc_region */);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1690
  if (result != NULL) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1691
    assert(*succeeded, "sanity");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1692
    return result;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1693
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1694
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1695
  // 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
  1696
  // incremental pauses.  Therefore, at least for now, we'll favor
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1697
  // 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
  1698
  // do something smarter than full collection to satisfy a failed alloc.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1699
  result = expand_and_allocate(word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1700
  if (result != NULL) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1701
    assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1702
    return result;
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
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1705
  // 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
  1706
  bool gc_succeeded = do_collection(false, /* explicit_gc */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1707
                                    false, /* clear_all_soft_refs */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1708
                                    word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1709
  if (!gc_succeeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1710
    *succeeded = false;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1711
    return NULL;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1712
  }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1713
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1714
  // Retry the allocation
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1715
  result = attempt_allocation_at_safepoint(word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1716
                                      true /* expect_null_cur_alloc_region */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1717
  if (result != NULL) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1718
    assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1719
    return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1720
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1721
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1722
  // Then, try a Full GC that will collect all soft references.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1723
  gc_succeeded = do_collection(false, /* explicit_gc */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1724
                               true,  /* clear_all_soft_refs */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1725
                               word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1726
  if (!gc_succeeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1727
    *succeeded = false;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1728
    return NULL;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1729
  }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1730
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1731
  // Retry the allocation once more
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1732
  result = attempt_allocation_at_safepoint(word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1733
                                      true /* expect_null_cur_alloc_region */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1734
  if (result != NULL) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1735
    assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1736
    return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1737
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1738
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1739
  assert(!collector_policy()->should_clear_all_soft_refs(),
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1740
         "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
  1741
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1742
  // What else?  We might try synchronous finalization later.  If the total
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1743
  // space available is large enough for the allocation, then a more
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1744
  // complete compaction phase than we've tried so far might be
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1745
  // appropriate.
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1746
  assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1747
  return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1748
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1749
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1750
// Attempting to expand the heap sufficiently
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1751
// to support an allocation of the given "word_size".  If
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1752
// successful, perform the allocation and return the address of the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1753
// allocated block, or else "NULL".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1754
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1755
HeapWord* G1CollectedHeap::expand_and_allocate(size_t word_size) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1756
  assert_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1757
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1758
  verify_region_sets_optional();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1759
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1760
  size_t expand_bytes = word_size * HeapWordSize;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1761
  if (expand_bytes < MinHeapDeltaBytes) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1762
    expand_bytes = MinHeapDeltaBytes;
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
  expand(expand_bytes);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1765
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1766
  verify_region_sets_optional();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1767
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1768
  return attempt_allocation_at_safepoint(word_size,
7400
39b4f2314833 7003860: G1: assert(_cur_alloc_region == NULL || !expect_null_cur_alloc_region) fails
tonyp
parents: 7399
diff changeset
  1769
                                     false /* expect_null_cur_alloc_region */);
1374
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1772
// FIXME: both this and shrink could probably be more efficient by
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1773
// doing one "VirtualSpace::expand_by" call rather than several.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1774
void G1CollectedHeap::expand(size_t expand_bytes) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1775
  size_t old_mem_size = _g1_storage.committed_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1776
  // We expand by a minimum of 1K.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1777
  expand_bytes = MAX2(expand_bytes, (size_t)K);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1778
  size_t aligned_expand_bytes =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1779
    ReservedSpace::page_align_size_up(expand_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1780
  aligned_expand_bytes = align_size_up(aligned_expand_bytes,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1781
                                       HeapRegion::GrainBytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1782
  expand_bytes = aligned_expand_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1783
  while (expand_bytes > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1784
    HeapWord* base = (HeapWord*)_g1_storage.high();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1785
    // Commit more storage.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1786
    bool successful = _g1_storage.expand_by(HeapRegion::GrainBytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1787
    if (!successful) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1788
        expand_bytes = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1789
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1790
      expand_bytes -= HeapRegion::GrainBytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1791
      // Expand the committed region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1792
      HeapWord* high = (HeapWord*) _g1_storage.high();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1793
      _g1_committed.set_end(high);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1794
      // Create a new HeapRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1795
      MemRegion mr(base, high);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1796
      bool is_zeroed = !_g1_max_committed.contains(base);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1797
      HeapRegion* hr = new HeapRegion(_bot_shared, mr, is_zeroed);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1798
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1799
      // Now update max_committed if necessary.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1800
      _g1_max_committed.set_end(MAX2(_g1_max_committed.end(), high));
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
      // Add it to the HeapRegionSeq.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1803
      _hrs->insert(hr);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1804
      _free_list.add_as_tail(hr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1805
      // And we used up an expansion region to create it.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1806
      _expansion_regions--;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1807
      // Tell the cardtable about it.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1808
      Universe::heap()->barrier_set()->resize_covered_region(_g1_committed);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1809
      // And the offset table as well.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1810
      _bot_shared->resize(_g1_committed.word_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
  }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1813
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1814
  if (Verbose && PrintGC) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1815
    size_t new_mem_size = _g1_storage.committed_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1816
    gclog_or_tty->print_cr("Expanding garbage-first heap from %ldK by %ldK to %ldK",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1817
                           old_mem_size/K, aligned_expand_bytes/K,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1818
                           new_mem_size/K);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1819
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1820
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1821
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1822
void G1CollectedHeap::shrink_helper(size_t shrink_bytes)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1823
{
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1824
  size_t old_mem_size = _g1_storage.committed_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1825
  size_t aligned_shrink_bytes =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1826
    ReservedSpace::page_align_size_down(shrink_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1827
  aligned_shrink_bytes = align_size_down(aligned_shrink_bytes,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1828
                                         HeapRegion::GrainBytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1829
  size_t num_regions_deleted = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1830
  MemRegion mr = _hrs->shrink_by(aligned_shrink_bytes, num_regions_deleted);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1831
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1832
  assert(mr.end() == (HeapWord*)_g1_storage.high(), "Bad shrink!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1833
  if (mr.byte_size() > 0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1834
    _g1_storage.shrink_by(mr.byte_size());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1835
  assert(mr.start() == (HeapWord*)_g1_storage.high(), "Bad shrink!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1836
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1837
  _g1_committed.set_end(mr.start());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1838
  _expansion_regions += num_regions_deleted;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1839
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1840
  // Tell the cardtable about it.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1841
  Universe::heap()->barrier_set()->resize_covered_region(_g1_committed);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1842
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1843
  // And the offset table as well.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1844
  _bot_shared->resize(_g1_committed.word_size());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1845
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1846
  HeapRegionRemSet::shrink_heap(n_regions());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1847
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1848
  if (Verbose && PrintGC) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1849
    size_t new_mem_size = _g1_storage.committed_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1850
    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
  1851
                           old_mem_size/K, aligned_shrink_bytes/K,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1852
                           new_mem_size/K);
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1856
void G1CollectedHeap::shrink(size_t shrink_bytes) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1857
  verify_region_sets_optional();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1858
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1859
  release_gc_alloc_regions(true /* totally */);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1860
  // Instead of tearing down / rebuilding the free lists here, we
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1861
  // 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
  1862
  // remove only the ones that we need to remove.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1863
  tear_down_region_lists();  // We will rebuild them in a moment.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1864
  shrink_helper(shrink_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1865
  rebuild_region_lists();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1866
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1867
  verify_region_sets_optional();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1868
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1869
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1870
// Public methods.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1871
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1872
#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
  1873
#pragma warning( disable:4355 ) // 'this' : used in base member initializer list
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1874
#endif // _MSC_VER
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1875
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1876
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1877
G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1878
  SharedHeap(policy_),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1879
  _g1_policy(policy_),
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  1880
  _dirty_card_queue_set(false),
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  1881
  _into_cset_dirty_card_queue_set(false),
7657
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7455
diff changeset
  1882
  _is_alive_closure(this),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1883
  _ref_processor(NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1884
  _process_strong_tasks(new SubTasksDone(G1H_PS_NumElements)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1885
  _bot_shared(NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1886
  _objs_with_preserved_marks(NULL), _preserved_marks_of_objs(NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1887
  _evac_failure_scan_stack(NULL) ,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1888
  _mark_in_progress(false),
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1889
  _cg1r(NULL), _summary_bytes_used(0),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1890
  _cur_alloc_region(NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1891
  _refine_cte_cl(NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1892
  _full_collection(false),
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1893
  _free_list("Master Free List"),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1894
  _secondary_free_list("Secondary Free List"),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1895
  _humongous_set("Master Humongous Set"),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1896
  _free_regions_coming(false),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1897
  _young_list(new YoungList(this)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1898
  _gc_time_stamp(0),
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  1899
  _surviving_young_words(NULL),
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1900
  _full_collections_completed(0),
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  1901
  _in_cset_fast_test(NULL),
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  1902
  _in_cset_fast_test_base(NULL),
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  1903
  _dirty_cards_region_list(NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1904
  _g1h = this; // To catch bugs.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1905
  if (_process_strong_tasks == NULL || !_process_strong_tasks->valid()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1906
    vm_exit_during_initialization("Failed necessary allocation.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1907
  }
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  1908
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  1909
  _humongous_object_threshold_in_words = HeapRegion::GrainWords / 2;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  1910
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1911
  int n_queues = MAX2((int)ParallelGCThreads, 1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1912
  _task_queues = new RefToScanQueueSet(n_queues);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1913
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1914
  int n_rem_sets = HeapRegionRemSet::num_par_rem_sets();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1915
  assert(n_rem_sets > 0, "Invariant.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1916
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1917
  HeapRegionRemSetIterator** iter_arr =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1918
    NEW_C_HEAP_ARRAY(HeapRegionRemSetIterator*, n_queues);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1919
  for (int i = 0; i < n_queues; i++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1920
    iter_arr[i] = new HeapRegionRemSetIterator();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1921
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1922
  _rem_set_iterator = iter_arr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1923
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1924
  for (int i = 0; i < n_queues; i++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1925
    RefToScanQueue* q = new RefToScanQueue();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1926
    q->initialize();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1927
    _task_queues->register_queue(i, q);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1928
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1929
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1930
  for (int ap = 0; ap < GCAllocPurposeCount; ++ap) {
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1931
    _gc_alloc_regions[ap]          = NULL;
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1932
    _gc_alloc_region_counts[ap]    = 0;
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1933
    _retained_gc_alloc_regions[ap] = NULL;
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1934
    // 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
  1935
    // we'll override this, when appropriate, below
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1936
    _retain_gc_alloc_region[ap]    = false;
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1937
  }
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1938
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1939
  // 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
  1940
  // 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
  1941
  // during the next collection.
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1942
  _retain_gc_alloc_region[GCAllocForTenured]  = true;
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  1943
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1944
  guarantee(_task_queues != NULL, "task_queues allocation failure.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1945
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1946
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1947
jint G1CollectedHeap::initialize() {
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4481
diff changeset
  1948
  CollectedHeap::pre_initialize();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1949
  os::enable_vtime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1950
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1951
  // Necessary to satisfy locking discipline assertions.
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
  MutexLocker x(Heap_lock);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1954
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1955
  // While there are no constraints in the GC code that HeapWordSize
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1956
  // be any particular value, there are multiple other areas in the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1957
  // 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
  1958
  // cases incorrectly returns the size in wordSize units rather than
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1959
  // HeapWordSize).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1960
  guarantee(HeapWordSize == wordSize, "HeapWordSize must equal wordSize");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1961
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1962
  size_t init_byte_size = collector_policy()->initial_heap_byte_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1963
  size_t max_byte_size = collector_policy()->max_heap_byte_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1964
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1965
  // Ensure that the sizes are properly aligned.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1966
  Universe::check_alignment(init_byte_size, HeapRegion::GrainBytes, "g1 heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1967
  Universe::check_alignment(max_byte_size, HeapRegion::GrainBytes, "g1 heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1968
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1969
  _cg1r = new ConcurrentG1Refine();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1970
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1971
  // Reserve the maximum.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1972
  PermanentGenerationSpec* pgs = collector_policy()->permanent_generation();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1973
  // Includes the perm-gen.
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1974
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1975
  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
  1976
  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
  1977
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1978
  ReservedSpace heap_rs(max_byte_size + pgs->max_size(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1979
                        HeapRegion::GrainBytes,
7906
2e43f97e05f7 6941122: G1: UseLargePages does not work with G1 garbage collector
brutisso
parents: 7905
diff changeset
  1980
                        UseLargePages, addr);
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1981
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1982
  if (UseCompressedOops) {
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1983
    if (addr != NULL && !heap_rs.is_reserved()) {
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1984
      // 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
  1985
      // 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
  1986
      // Try again to reserver heap higher.
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1987
      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
  1988
      ReservedSpace heap_rs0(total_reserved, HeapRegion::GrainBytes,
7906
2e43f97e05f7 6941122: G1: UseLargePages does not work with G1 garbage collector
brutisso
parents: 7905
diff changeset
  1989
                             UseLargePages, addr);
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1990
      if (addr != NULL && !heap_rs0.is_reserved()) {
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1991
        // 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
  1992
        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
  1993
        assert(addr == NULL, "");
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1994
        ReservedSpace heap_rs1(total_reserved, HeapRegion::GrainBytes,
7906
2e43f97e05f7 6941122: G1: UseLargePages does not work with G1 garbage collector
brutisso
parents: 7905
diff changeset
  1995
                               UseLargePages, addr);
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1996
        heap_rs = heap_rs1;
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1997
      } else {
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1998
        heap_rs = heap_rs0;
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  1999
      }
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  2000
    }
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  2001
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2002
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2003
  if (!heap_rs.is_reserved()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2004
    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
  2005
    return JNI_ENOMEM;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2006
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2007
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2008
  // 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
  2009
  // temporarily think somethings in the heap.  (I've actually seen this
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2010
  // happen in asserts: DLD.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2011
  _reserved.set_word_size(0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2012
  _reserved.set_start((HeapWord*)heap_rs.base());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2013
  _reserved.set_end((HeapWord*)(heap_rs.base() + heap_rs.size()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2014
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2015
  _expansion_regions = max_byte_size/HeapRegion::GrainBytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2016
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2017
  // 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
  2018
  _rem_set = collector_policy()->create_rem_set(_reserved, 2);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2019
  set_barrier_set(rem_set()->bs());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2020
  if (barrier_set()->is_a(BarrierSet::ModRef)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2021
    _mr_bs = (ModRefBarrierSet*)_barrier_set;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2022
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2023
    vm_exit_during_initialization("G1 requires a mod ref bs.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2024
    return JNI_ENOMEM;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2025
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2026
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2027
  // Also create a G1 rem set.
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  2028
  if (mr_bs()->is_a(BarrierSet::CardTableModRef)) {
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  2029
    _g1_rem_set = new G1RemSet(this, (CardTableModRefBS*)mr_bs());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2030
  } else {
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  2031
    vm_exit_during_initialization("G1 requires a cardtable mod ref bs.");
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  2032
    return JNI_ENOMEM;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2033
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2034
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2035
  // Carve out the G1 part of the heap.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2036
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2037
  ReservedSpace g1_rs   = heap_rs.first_part(max_byte_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2038
  _g1_reserved = MemRegion((HeapWord*)g1_rs.base(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2039
                           g1_rs.size()/HeapWordSize);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2040
  ReservedSpace perm_gen_rs = heap_rs.last_part(max_byte_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2041
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2042
  _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
  2043
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2044
  _g1_storage.initialize(g1_rs, 0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2045
  _g1_committed = MemRegion((HeapWord*)_g1_storage.low(), (size_t) 0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2046
  _g1_max_committed = _g1_committed;
1425
ec7818f129f8 6758633: G1: SEGV with GCOld on Linux
iveresov
parents: 1422
diff changeset
  2047
  _hrs = new HeapRegionSeq(_expansion_regions);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2048
  guarantee(_hrs != NULL, "Couldn't allocate HeapRegionSeq");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2049
  guarantee(_cur_alloc_region == NULL, "from constructor");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2050
2996
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  2051
  // 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
  2052
  // in the remembered set structures.
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  2053
  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
  2054
  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
  2055
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  2056
  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
  2057
  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
  2058
  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
  2059
            "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
  2060
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2061
  HeapRegionSet::set_unrealistically_long_length(max_regions() + 1);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2062
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2063
  _bot_shared = new G1BlockOffsetSharedArray(_reserved,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2064
                                             heap_word_size(init_byte_size));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2065
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2066
  _g1h = this;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2067
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2068
   _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
  2069
   _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
  2070
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2071
   // 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
  2072
   // 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
  2073
   // 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
  2074
   _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
  2075
                ((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
  2076
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2077
   // 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
  2078
   // 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
  2079
   // evacuation pause.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2080
   clear_cset_fast_test();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2081
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2082
  // Create the ConcurrentMark data structure and thread.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2083
  // (Must do this late, so that "max_regions" is defined.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2084
  _cm       = new ConcurrentMark(heap_rs, (int) max_regions());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2085
  _cmThread = _cm->cmThread();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2086
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2087
  // Initialize the from_card cache structure of HeapRegionRemSet.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2088
  HeapRegionRemSet::init_heap(max_regions());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2089
2344
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2259
diff changeset
  2090
  // Now expand into the initial heap size.
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2259
diff changeset
  2091
  expand(init_byte_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2092
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2093
  // Perform any initialization actions delegated to the policy.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2094
  g1_policy()->init();
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
  g1_policy()->note_start_of_mark_thread();
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
  _refine_cte_cl =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2099
    new RefineCardTableEntryClosure(ConcurrentG1RefineThread::sts(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2100
                                    g1_rem_set(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2101
                                    concurrent_g1_refine());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2102
  JavaThread::dirty_card_queue_set().set_closure(_refine_cte_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2103
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2104
  JavaThread::satb_mark_queue_set().initialize(SATB_Q_CBL_mon,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2105
                                               SATB_Q_FL_lock,
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2106
                                               G1SATBProcessCompletedThreshold,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2107
                                               Shared_SATB_Q_lock);
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2108
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2109
  JavaThread::dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2110
                                                DirtyCardQ_FL_lock,
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2111
                                                concurrent_g1_refine()->yellow_zone(),
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2112
                                                concurrent_g1_refine()->red_zone(),
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2113
                                                Shared_DirtyCardQ_lock);
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2114
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2115
  if (G1DeferredRSUpdate) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2116
    dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2117
                                      DirtyCardQ_FL_lock,
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2118
                                      -1, // never trigger processing
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2119
                                      -1, // no limit on length
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2120
                                      Shared_DirtyCardQ_lock,
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2121
                                      &JavaThread::dirty_card_queue_set());
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2122
  }
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2123
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2124
  // Initialize the card queue set used to hold cards containing
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2125
  // references into the collection set.
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2126
  _into_cset_dirty_card_queue_set.initialize(DirtyCardQ_CBL_mon,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2127
                                             DirtyCardQ_FL_lock,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2128
                                             -1, // never trigger processing
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2129
                                             -1, // no limit on length
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2130
                                             Shared_DirtyCardQ_lock,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2131
                                             &JavaThread::dirty_card_queue_set());
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2132
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2133
  // In case we're keeping closure specialization stats, initialize those
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2134
  // counts and that mechanism.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2135
  SpecializationStats::clear();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2136
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2137
  _gc_alloc_region_list = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2138
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2139
  // Do later initialization work for concurrent refinement.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2140
  _cg1r->init();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2141
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2142
  return JNI_OK;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2143
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2144
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2145
void G1CollectedHeap::ref_processing_init() {
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2146
  // Reference processing in G1 currently works as follows:
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2147
  //
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2148
  // * There is only one reference processor instance that
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2149
  //   '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
  2150
  //   below.
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2151
  // * Reference discovery is not enabled during an incremental
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2152
  //   pause (see 6484982).
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2153
  // * 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
  2154
  //   during an incremental pause (see 6484982).
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2155
  // * Reference discovery is enabled at initial marking.
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2156
  // * Reference discovery is disabled and the discovered
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2157
  //   references processed etc during remarking.
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2158
  // * Reference discovery is MT (see below).
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2159
  // * Reference discovery requires a barrier (see below).
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2160
  // * Reference processing is currently not MT (see 6608385).
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2161
  // * 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
  2162
  //   processes any discovered references.
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2163
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2164
  SharedHeap::ref_processing_init();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2165
  MemRegion mr = reserved_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2166
  _ref_processor = ReferenceProcessor::create_ref_processor(
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2167
                                         mr,    // span
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2168
                                         false, // Reference discovery is not atomic
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2169
                                         true,  // mt_discovery
7657
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7455
diff changeset
  2170
                                         &_is_alive_closure, // is alive closure
a80e571c3d96 7006113: G1: Initialize ReferenceProcessor::_is_alive_non_header field
johnc
parents: 7455
diff changeset
  2171
                                                             // for efficiency
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2172
                                         ParallelGCThreads,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2173
                                         ParallelRefProcEnabled,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2174
                                         true); // Setting next fields of discovered
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2175
                                                // lists requires a barrier.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2176
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2177
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2178
size_t G1CollectedHeap::capacity() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2179
  return _g1_committed.byte_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2180
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2181
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2182
void G1CollectedHeap::iterate_dirty_card_closure(CardTableEntryClosure* cl,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2183
                                                 DirtyCardQueue* into_cset_dcq,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2184
                                                 bool concurrent,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2185
                                                 int worker_i) {
3589
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  2186
  // Clean cards in the hot card cache
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2187
  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
  2188
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2189
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2190
  int n_completed_buffers = 0;
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2191
  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
  2192
    n_completed_buffers++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2193
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2194
  g1_policy()->record_update_rs_processed_buffers(worker_i,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2195
                                                  (double) n_completed_buffers);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2196
  dcqs.clear_n_completed_buffers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2197
  assert(!dcqs.completed_buffers_exist_dirty(), "Completed buffers exist!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2198
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2199
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2200
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2201
// Computes the sum of the storage used by the various regions.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2202
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2203
size_t G1CollectedHeap::used() const {
3279
1af8fdb08664 6863216: Clean up debugging debris inadvertently pushed with 6700789
ysr
parents: 3278
diff changeset
  2204
  assert(Heap_lock->owner() != NULL,
1af8fdb08664 6863216: Clean up debugging debris inadvertently pushed with 6700789
ysr
parents: 3278
diff changeset
  2205
         "Should be owned on this thread's behalf.");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2206
  size_t result = _summary_bytes_used;
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2207
  // Read only once in case it is set to NULL concurrently
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2208
  HeapRegion* hr = _cur_alloc_region;
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2209
  if (hr != NULL)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2210
    result += hr->used();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2211
  return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2212
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2213
3263
23d2d46c6d08 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 3262
diff changeset
  2214
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
  2215
  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
  2216
  return result;
23d2d46c6d08 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 3262
diff changeset
  2217
}
23d2d46c6d08 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 3262
diff changeset
  2218
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2219
class SumUsedClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2220
  size_t _used;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2221
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2222
  SumUsedClosure() : _used(0) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2223
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2224
    if (!r->continuesHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2225
      _used += r->used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2226
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2227
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2228
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2229
  size_t result() { return _used; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2230
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2231
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2232
size_t G1CollectedHeap::recalculate_used() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2233
  SumUsedClosure blk;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2234
  _hrs->iterate(&blk);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2235
  return blk.result();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2236
}
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
#ifndef PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2239
class SumUsedRegionsClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2240
  size_t _num;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2241
public:
2344
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2259
diff changeset
  2242
  SumUsedRegionsClosure() : _num(0) {}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2243
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2244
    if (r->continuesHumongous() || r->used() > 0 || r->is_gc_alloc_region()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2245
      _num += 1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2246
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2247
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2248
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2249
  size_t result() { return _num; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2250
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2251
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2252
size_t G1CollectedHeap::recalculate_used_regions() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2253
  SumUsedRegionsClosure blk;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2254
  _hrs->iterate(&blk);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2255
  return blk.result();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2256
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2257
#endif // PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2258
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2259
size_t G1CollectedHeap::unsafe_max_alloc() {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2260
  if (free_regions() > 0) return HeapRegion::GrainBytes;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2261
  // otherwise, is there space in the current allocation region?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2262
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2263
  // 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
  2264
  // 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
  2265
  // there may be other threads which overwrite the current allocation
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2266
  // region field. attempt_allocation(), for example, sets it to NULL
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2267
  // 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
  2268
  // 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
  2269
  // 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
  2270
  // current allocation region field are optimized away.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2271
  HeapRegion* car = _cur_alloc_region;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2272
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2273
  // FIXME: should iterate over all regions?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2274
  if (car == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2275
    return 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2276
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2277
  return car->free();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2278
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2279
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2280
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
  2281
  return
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2282
    ((cause == GCCause::_gc_locker           && GCLockerInvokesConcurrent) ||
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2283
     (cause == GCCause::_java_lang_system_gc && ExplicitGCInvokesConcurrent));
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2284
}
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2285
7455
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2286
void G1CollectedHeap::increment_full_collections_completed(bool concurrent) {
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2287
  MonitorLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2288
7455
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2289
  // 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
  2290
  // 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
  2291
  // 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
  2292
  // assert here.
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2293
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2294
  // 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
  2295
  // 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
  2296
  // collections have been started.
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2297
  unsigned int full_collections_started = total_full_collections();
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2298
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2299
  // 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
  2300
  // 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
  2301
  // interrupt a concurrent cycle), the number of full collections
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2302
  // 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
  2303
  // 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
  2304
  // behind the number of full collections started.
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2305
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2306
  // 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
  2307
  assert(concurrent ||
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2308
         (full_collections_started == _full_collections_completed + 1) ||
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2309
         (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
  2310
         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
  2311
                 "is inconsistent with _full_collections_completed = %u",
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2312
                 full_collections_started, _full_collections_completed));
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2313
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2314
  // 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
  2315
  assert(!concurrent ||
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2316
         (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
  2317
         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
  2318
                 "full_collections_started = %u "
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2319
                 "is inconsistent with _full_collections_completed = %u",
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2320
                 full_collections_started, _full_collections_completed));
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2321
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2322
  _full_collections_completed += 1;
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2323
6766
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2324
  // 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
  2325
  // we wake up any waiters (especially when ExplicitInvokesConcurrent
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2326
  // 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
  2327
  // 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
  2328
  if (concurrent) {
6766
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2329
    _cmThread->clear_in_progress();
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2330
  }
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2331
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2332
  // 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
  2333
  // System.gc() with (with ExplicitGCInvokesConcurrent set or not)
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2334
  // 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
  2335
  // waiting in VM_G1IncCollectionPause::doit_epilogue().
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2336
  FullGCCount_lock->notify_all();
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2337
}
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2338
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2339
void G1CollectedHeap::collect_as_vm_thread(GCCause::Cause cause) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2340
  assert_at_safepoint(true /* should_be_vm_thread */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2341
  GCCauseSetter gcs(this, cause);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2342
  switch (cause) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2343
    case GCCause::_heap_inspection:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2344
    case GCCause::_heap_dump: {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2345
      HandleMark hm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2346
      do_full_collection(false);         // don't clear all soft refs
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2347
      break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2348
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2349
    default: // XXX FIX ME
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2350
      ShouldNotReachHere(); // Unexpected use of this function
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
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2354
void G1CollectedHeap::collect(GCCause::Cause cause) {
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2355
  // 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
  2356
  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
  2357
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2358
  unsigned int gc_count_before;
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2359
  unsigned int full_gc_count_before;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2360
  {
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2361
    MutexLocker ml(Heap_lock);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2362
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2363
    // 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
  2364
    gc_count_before = SharedHeap::heap()->total_collections();
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2365
    full_gc_count_before = SharedHeap::heap()->total_full_collections();
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2366
  }
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2367
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2368
  if (should_do_concurrent_full_gc(cause)) {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2369
    // Schedule an initial-mark evacuation pause that will start a
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2370
    // 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
  2371
    // we are not requesting a post-GC allocation.
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2372
    VM_G1IncCollectionPause op(gc_count_before,
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2373
                               0,     /* word_size */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2374
                               true,  /* should_initiate_conc_mark */
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2375
                               g1_policy()->max_pause_time_ms(),
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2376
                               cause);
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2377
    VMThread::execute(&op);
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2378
  } else {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2379
    if (cause == GCCause::_gc_locker
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2380
        DEBUG_ONLY(|| cause == GCCause::_scavenge_alot)) {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2381
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2382
      // Schedule a standard evacuation pause. We're setting word_size
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2383
      // 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
  2384
      VM_G1IncCollectionPause op(gc_count_before,
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2385
                                 0,     /* word_size */
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2386
                                 false, /* should_initiate_conc_mark */
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2387
                                 g1_policy()->max_pause_time_ms(),
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2388
                                 cause);
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2389
      VMThread::execute(&op);
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2390
    } else {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2391
      // Schedule a Full GC.
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2392
      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
  2393
      VMThread::execute(&op);
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2394
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2395
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2396
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2397
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2398
bool G1CollectedHeap::is_in(const void* p) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2399
  if (_g1_committed.contains(p)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2400
    HeapRegion* hr = _hrs->addr_to_region(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2401
    return hr->is_in(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2402
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2403
    return _perm_gen->as_gen()->is_in(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2404
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2405
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2406
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2407
// Iteration functions.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2408
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2409
// Iterates an OopClosure over all ref-containing fields of objects
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2410
// within a HeapRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2411
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2412
class IterateOopClosureRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2413
  MemRegion _mr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2414
  OopClosure* _cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2415
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2416
  IterateOopClosureRegionClosure(MemRegion mr, OopClosure* cl)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2417
    : _mr(mr), _cl(cl) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2418
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2419
    if (! r->continuesHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2420
      r->oop_iterate(_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2421
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2422
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2423
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2424
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2425
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2426
void G1CollectedHeap::oop_iterate(OopClosure* cl, bool do_perm) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2427
  IterateOopClosureRegionClosure blk(_g1_committed, cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2428
  _hrs->iterate(&blk);
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2429
  if (do_perm) {
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2430
    perm_gen()->oop_iterate(cl);
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2431
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2432
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2433
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2434
void G1CollectedHeap::oop_iterate(MemRegion mr, OopClosure* cl, bool do_perm) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2435
  IterateOopClosureRegionClosure blk(mr, cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2436
  _hrs->iterate(&blk);
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2437
  if (do_perm) {
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2438
    perm_gen()->oop_iterate(cl);
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2439
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2440
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2441
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2442
// Iterates an ObjectClosure over all objects within a HeapRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2443
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2444
class IterateObjectClosureRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2445
  ObjectClosure* _cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2446
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2447
  IterateObjectClosureRegionClosure(ObjectClosure* cl) : _cl(cl) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2448
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2449
    if (! r->continuesHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2450
      r->object_iterate(_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2451
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2452
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2453
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2454
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2455
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2456
void G1CollectedHeap::object_iterate(ObjectClosure* cl, bool do_perm) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2457
  IterateObjectClosureRegionClosure blk(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2458
  _hrs->iterate(&blk);
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2459
  if (do_perm) {
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2460
    perm_gen()->object_iterate(cl);
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  2461
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2462
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2463
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2464
void G1CollectedHeap::object_iterate_since_last_GC(ObjectClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2465
  // FIXME: is this right?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2466
  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
  2467
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2468
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2469
// Calls a SpaceClosure on a HeapRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2470
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2471
class SpaceClosureRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2472
  SpaceClosure* _cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2473
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2474
  SpaceClosureRegionClosure(SpaceClosure* cl) : _cl(cl) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2475
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2476
    _cl->do_space(r);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2477
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2478
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2479
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2480
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2481
void G1CollectedHeap::space_iterate(SpaceClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2482
  SpaceClosureRegionClosure blk(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2483
  _hrs->iterate(&blk);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2484
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2485
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2486
void G1CollectedHeap::heap_region_iterate(HeapRegionClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2487
  _hrs->iterate(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2488
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2489
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2490
void G1CollectedHeap::heap_region_iterate_from(HeapRegion* r,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2491
                                               HeapRegionClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2492
  _hrs->iterate_from(r, cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2493
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2494
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2495
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2496
G1CollectedHeap::heap_region_iterate_from(int idx, HeapRegionClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2497
  _hrs->iterate_from(idx, cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2498
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2499
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2500
HeapRegion* G1CollectedHeap::region_at(size_t idx) { return _hrs->at(idx); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2501
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2502
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2503
G1CollectedHeap::heap_region_par_iterate_chunked(HeapRegionClosure* cl,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2504
                                                 int worker,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2505
                                                 jint claim_value) {
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2506
  const size_t regions = n_regions();
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  2507
  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
  2508
  // 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
  2509
  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
  2510
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2511
  // each worker will actually look at all regions
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2512
  for (size_t count = 0; count < regions; ++count) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2513
    const size_t index = (start_index + count) % regions;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2514
    assert(0 <= index && index < regions, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2515
    HeapRegion* r = region_at(index);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2516
    // 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
  2517
    // when we come across their corresponding "start humongous"
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2518
    // region) and regions already claimed
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2519
    if (r->claim_value() == claim_value || r->continuesHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2520
      continue;
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
    // OK, try to claim it
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2523
    if (r->claimHeapRegion(claim_value)) {
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2524
      // success!
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2525
      assert(!r->continuesHumongous(), "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2526
      if (r->startsHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2527
        // 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
  2528
        // "continues humongous" first; in fact we'll do them
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2529
        // 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
  2530
        // closure on the "starts humongous" region might de-allocate
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2531
        // 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
  2532
        // 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
  2533
        // 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
  2534
        // then we'll do the "starts humongous" region.
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2535
        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
  2536
          HeapRegion* chr = region_at(ch_index);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2537
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2538
          // 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
  2539
          // "continues humongous" we're done
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2540
          if (chr->claim_value() == claim_value ||
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2541
              !chr->continuesHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2542
            break;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2543
          }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2544
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2545
          // Noone should have claimed it directly. We can given
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2546
          // that we claimed its "starts humongous" region.
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2547
          assert(chr->claim_value() != claim_value, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2548
          assert(chr->humongous_start_region() == r, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2549
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2550
          if (chr->claimHeapRegion(claim_value)) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2551
            // 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
  2552
            // be trying to claim this region
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2553
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2554
            bool res2 = cl->doHeapRegion(chr);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2555
            assert(!res2, "Should not abort");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2556
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2557
            // 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
  2558
            // does something with "continues humongous" regions
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2559
            // 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
  2560
            // 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
  2561
            assert(chr->continuesHumongous(), "should still be the case");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2562
            assert(chr->humongous_start_region() == r, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2563
          } else {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2564
            guarantee(false, "we should not reach here");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2565
          }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2566
        }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2567
      }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2568
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2569
      assert(!r->continuesHumongous(), "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2570
      bool res = cl->doHeapRegion(r);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2571
      assert(!res, "Should not abort");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2572
    }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2573
  }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2574
}
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2575
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2576
class ResetClaimValuesClosure: public HeapRegionClosure {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2577
public:
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2578
  bool doHeapRegion(HeapRegion* r) {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2579
    r->set_claim_value(HeapRegion::InitialClaimValue);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2580
    return false;
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2581
  }
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2582
};
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2583
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2584
void
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2585
G1CollectedHeap::reset_heap_region_claim_values() {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2586
  ResetClaimValuesClosure blk;
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2587
  heap_region_iterate(&blk);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2588
}
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2589
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2590
#ifdef ASSERT
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2591
// 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
  2592
// 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
  2593
// humongous_start_region() information on "continues humongous"
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2594
// regions is correct.
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2595
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2596
class CheckClaimValuesClosure : public HeapRegionClosure {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2597
private:
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2598
  jint _claim_value;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2599
  size_t _failures;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2600
  HeapRegion* _sh_region;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2601
public:
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2602
  CheckClaimValuesClosure(jint claim_value) :
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2603
    _claim_value(claim_value), _failures(0), _sh_region(NULL) { }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2604
  bool doHeapRegion(HeapRegion* r) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2605
    if (r->claim_value() != _claim_value) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2606
      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
  2607
                             "claim value = %d, should be %d",
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2608
                             r->bottom(), r->end(), r->claim_value(),
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2609
                             _claim_value);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2610
      ++_failures;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2611
    }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2612
    if (!r->isHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2613
      _sh_region = NULL;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2614
    } else if (r->startsHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2615
      _sh_region = r;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2616
    } else if (r->continuesHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2617
      if (r->humongous_start_region() != _sh_region) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2618
        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
  2619
                               "HS = "PTR_FORMAT", should be "PTR_FORMAT,
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2620
                               r->bottom(), r->end(),
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2621
                               r->humongous_start_region(),
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2622
                               _sh_region);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2623
        ++_failures;
1374
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
    }
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2626
    return false;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2627
  }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2628
  size_t failures() {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2629
    return _failures;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2630
  }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2631
};
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2632
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2633
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
  2634
  CheckClaimValuesClosure cl(claim_value);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2635
  heap_region_iterate(&cl);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2636
  return cl.failures() == 0;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2637
}
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2638
#endif // ASSERT
1374
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::collection_set_iterate(HeapRegionClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2641
  HeapRegion* r = g1_policy()->collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2642
  while (r != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2643
    HeapRegion* next = r->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2644
    if (cl->doHeapRegion(r)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2645
      cl->incomplete();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2646
      return;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2647
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2648
    r = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2649
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2650
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2651
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2652
void G1CollectedHeap::collection_set_iterate_from(HeapRegion* r,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2653
                                                  HeapRegionClosure *cl) {
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2654
  if (r == NULL) {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2655
    // 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
  2656
    return;
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2657
  }
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2658
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2659
  assert(r->in_collection_set(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2660
         "Start region must be a member of the collection set.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2661
  HeapRegion* cur = r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2662
  while (cur != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2663
    HeapRegion* next = cur->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2664
    if (cl->doHeapRegion(cur) && false) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2665
      cl->incomplete();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2666
      return;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2667
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2668
    cur = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2669
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2670
  cur = g1_policy()->collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2671
  while (cur != r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2672
    HeapRegion* next = cur->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2673
    if (cl->doHeapRegion(cur) && false) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2674
      cl->incomplete();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2675
      return;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2676
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2677
    cur = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2678
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2679
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2680
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2681
CompactibleSpace* G1CollectedHeap::first_compactible_space() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2682
  return _hrs->length() > 0 ? _hrs->at(0) : NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2683
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2684
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
Space* G1CollectedHeap::space_containing(const void* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2687
  Space* res = heap_region_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2688
  if (res == NULL)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2689
    res = perm_gen()->space_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2690
  return res;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2691
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2692
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2693
HeapWord* G1CollectedHeap::block_start(const void* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2694
  Space* sp = space_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2695
  if (sp != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2696
    return sp->block_start(addr);
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
  return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2699
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2700
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2701
size_t G1CollectedHeap::block_size(const HeapWord* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2702
  Space* sp = space_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2703
  assert(sp != NULL, "block_size of address outside of heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2704
  return sp->block_size(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2705
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2706
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2707
bool G1CollectedHeap::block_is_obj(const HeapWord* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2708
  Space* sp = space_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2709
  return sp->block_is_obj(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2710
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2711
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2712
bool G1CollectedHeap::supports_tlab_allocation() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2713
  return true;
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
size_t G1CollectedHeap::tlab_capacity(Thread* ignored) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2717
  return HeapRegion::GrainBytes;
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2720
size_t G1CollectedHeap::unsafe_max_tlab_alloc(Thread* ignored) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2721
  // 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
  2722
  // the min TLAB size.
5078
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2723
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2724
  // 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
  2725
  // 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
  2726
  // humongous objects.
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2727
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2728
  // We need to store the cur alloc region locally, since it might change
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2729
  // between when we test for NULL and when we use it later.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2730
  ContiguousSpace* cur_alloc_space = _cur_alloc_region;
5078
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2731
  size_t max_tlab_size = _humongous_object_threshold_in_words * wordSize;
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2732
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2733
  if (cur_alloc_space == NULL) {
5078
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2734
    return max_tlab_size;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2735
  } else {
5078
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2736
    return MIN2(MAX2(cur_alloc_space->free(), (size_t)MinTLABSize),
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2737
                max_tlab_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2738
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2739
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2740
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2741
size_t G1CollectedHeap::large_typearray_limit() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2742
  // FIXME
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2743
  return HeapRegion::GrainBytes/HeapWordSize;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2744
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2745
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2746
size_t G1CollectedHeap::max_capacity() const {
4462
6e2f8a9544f0 6880903: G1: G1 reports incorrect Runtime.maxMemory()
tonyp
parents: 4459
diff changeset
  2747
  return g1_reserved_obj_bytes();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2748
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2749
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2750
jlong G1CollectedHeap::millis_since_last_gc() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2751
  // assert(false, "NYI");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2752
  return 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2753
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2754
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2755
void G1CollectedHeap::prepare_for_verify() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2756
  if (SafepointSynchronize::is_at_safepoint() || ! UseTLAB) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2757
    ensure_parsability(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2758
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2759
  g1_rem_set()->prepare_for_verify();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2760
}
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
class VerifyLivenessOopClosure: public OopClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2763
  G1CollectedHeap* g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2764
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2765
  VerifyLivenessOopClosure(G1CollectedHeap* _g1h) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2766
    g1h = _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2767
  }
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2768
  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
  2769
  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
  2770
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2771
  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
  2772
    oop obj = oopDesc::load_decode_heap_oop(p);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2773
    guarantee(obj == NULL || !g1h->is_obj_dead(obj),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2774
              "Dead object referenced by a not dead object");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2775
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2776
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2777
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2778
class VerifyObjsInRegionClosure: public ObjectClosure {
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2779
private:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2780
  G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2781
  size_t _live_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2782
  HeapRegion *_hr;
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2783
  bool _use_prev_marking;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2784
public:
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2785
  // use_prev_marking == true  -> use "prev" marking information,
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2786
  // use_prev_marking == false -> use "next" marking information
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2787
  VerifyObjsInRegionClosure(HeapRegion *hr, bool use_prev_marking)
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2788
    : _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
  2789
    _g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2790
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2791
  void do_object(oop o) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2792
    VerifyLivenessOopClosure isLive(_g1h);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2793
    assert(o != NULL, "Huh?");
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2794
    if (!_g1h->is_obj_dead_cond(o, _use_prev_marking)) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2795
      o->oop_iterate(&isLive);
5345
d3bd6e8757d8 6943926: G1: Integer overflow during heap region verification
johnc
parents: 5344
diff changeset
  2796
      if (!_hr->obj_allocated_since_prev_marking(o)) {
d3bd6e8757d8 6943926: G1: Integer overflow during heap region verification
johnc
parents: 5344
diff changeset
  2797
        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
  2798
        _live_bytes += (obj_size * HeapWordSize);
d3bd6e8757d8 6943926: G1: Integer overflow during heap region verification
johnc
parents: 5344
diff changeset
  2799
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2800
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2801
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2802
  size_t live_bytes() { return _live_bytes; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2803
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2804
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2805
class PrintObjsInRegionClosure : public ObjectClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2806
  HeapRegion *_hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2807
  G1CollectedHeap *_g1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2808
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2809
  PrintObjsInRegionClosure(HeapRegion *hr) : _hr(hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2810
    _g1 = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2811
  };
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2812
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2813
  void do_object(oop o) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2814
    if (o != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2815
      HeapWord *start = (HeapWord *) o;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2816
      size_t word_sz = o->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2817
      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
  2818
                          " isMarkedPrev %d isMarkedNext %d isAllocSince %d\n",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2819
                          (void*) o, word_sz,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2820
                          _g1->isMarkedPrev(o),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2821
                          _g1->isMarkedNext(o),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2822
                          _hr->obj_allocated_since_prev_marking(o));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2823
      HeapWord *end = start + word_sz;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2824
      HeapWord *cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2825
      int *val;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2826
      for (cur = start; cur < end; cur++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2827
        val = (int *) cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2828
        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
  2829
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2830
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2831
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2832
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2833
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2834
class VerifyRegionClosure: public HeapRegionClosure {
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2835
private:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2836
  bool _allow_dirty;
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2837
  bool _par;
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2838
  bool _use_prev_marking;
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2839
  bool _failures;
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2840
public:
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2841
  // use_prev_marking == true  -> use "prev" marking information,
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2842
  // use_prev_marking == false -> use "next" marking information
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2843
  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
  2844
    : _allow_dirty(allow_dirty),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2845
      _par(par),
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2846
      _use_prev_marking(use_prev_marking),
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2847
      _failures(false) {}
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2848
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2849
  bool failures() {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2850
    return _failures;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2851
  }
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2852
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2853
  bool doHeapRegion(HeapRegion* r) {
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2854
    guarantee(_par || r->claim_value() == HeapRegion::InitialClaimValue,
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2855
              "Should be unclaimed at verify points.");
2249
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  2856
    if (!r->continuesHumongous()) {
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2857
      bool failures = false;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2858
      r->verify(_allow_dirty, _use_prev_marking, &failures);
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2859
      if (failures) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2860
        _failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2861
      } else {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2862
        VerifyObjsInRegionClosure not_dead_yet_cl(r, _use_prev_marking);
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2863
        r->object_iterate(&not_dead_yet_cl);
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2864
        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
  2865
          gclog_or_tty->print_cr("["PTR_FORMAT","PTR_FORMAT"] "
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2866
                                 "max_live_bytes "SIZE_FORMAT" "
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2867
                                 "< calculated "SIZE_FORMAT,
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2868
                                 r->bottom(), r->end(),
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2869
                                 r->max_live_bytes(),
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2870
                                 not_dead_yet_cl.live_bytes());
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2871
          _failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2872
        }
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2873
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2874
    }
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2875
    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
  2876
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2877
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2878
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2879
class VerifyRootsClosure: public OopsInGenClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2880
private:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2881
  G1CollectedHeap* _g1h;
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2882
  bool             _use_prev_marking;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2883
  bool             _failures;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2884
public:
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2885
  // use_prev_marking == true  -> use "prev" marking information,
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2886
  // use_prev_marking == false -> use "next" marking information
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2887
  VerifyRootsClosure(bool use_prev_marking) :
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2888
    _g1h(G1CollectedHeap::heap()),
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2889
    _use_prev_marking(use_prev_marking),
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2890
    _failures(false) { }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2891
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2892
  bool failures() { return _failures; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2893
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2894
  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
  2895
    T heap_oop = oopDesc::load_heap_oop(p);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2896
    if (!oopDesc::is_null(heap_oop)) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2897
      oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2898
      if (_g1h->is_obj_dead_cond(obj, _use_prev_marking)) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2899
        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
  2900
                              "points to dead obj "PTR_FORMAT, p, (void*) obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2901
        obj->print_on(gclog_or_tty);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2902
        _failures = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2903
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2904
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2905
  }
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2906
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2907
  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
  2908
  void do_oop(narrowOop* p) { do_oop_nv(p); }
1374
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
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2911
// This is the task used for parallel heap verification.
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2912
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2913
class G1ParVerifyTask: public AbstractGangTask {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2914
private:
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2915
  G1CollectedHeap* _g1h;
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2916
  bool _allow_dirty;
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2917
  bool _use_prev_marking;
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2918
  bool _failures;
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2919
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2920
public:
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2921
  // use_prev_marking == true  -> use "prev" marking information,
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2922
  // use_prev_marking == false -> use "next" marking information
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2923
  G1ParVerifyTask(G1CollectedHeap* g1h, bool allow_dirty,
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2924
                  bool use_prev_marking) :
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2925
    AbstractGangTask("Parallel verify task"),
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2926
    _g1h(g1h),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2927
    _allow_dirty(allow_dirty),
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2928
    _use_prev_marking(use_prev_marking),
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2929
    _failures(false) { }
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2930
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2931
  bool failures() {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2932
    return _failures;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2933
  }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2934
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2935
  void work(int worker_i) {
2249
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  2936
    HandleMark hm;
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2937
    VerifyRegionClosure blk(_allow_dirty, true, _use_prev_marking);
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2938
    _g1h->heap_region_par_iterate_chunked(&blk, worker_i,
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2939
                                          HeapRegion::ParVerifyClaimValue);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2940
    if (blk.failures()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2941
      _failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2942
    }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2943
  }
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2944
};
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2945
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2946
void G1CollectedHeap::verify(bool allow_dirty, bool silent) {
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2947
  verify(allow_dirty, silent, /* use_prev_marking */ true);
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2948
}
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2949
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2950
void G1CollectedHeap::verify(bool allow_dirty,
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2951
                             bool silent,
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2952
                             bool use_prev_marking) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2953
  if (SafepointSynchronize::is_at_safepoint() || ! UseTLAB) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2954
    if (!silent) { gclog_or_tty->print("roots "); }
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2955
    VerifyRootsClosure rootsCl(use_prev_marking);
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  2956
    CodeBlobToOopClosure blobsCl(&rootsCl, /*do_marking=*/ false);
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  2957
    process_strong_roots(true,  // activate StrongRootsScope
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  2958
                         false,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2959
                         SharedHeap::SO_AllClasses,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2960
                         &rootsCl,
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  2961
                         &blobsCl,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2962
                         &rootsCl);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2963
    bool failures = rootsCl.failures();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2964
    rem_set()->invalidate(perm_gen()->used_region(), false);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2965
    if (!silent) { gclog_or_tty->print("HeapRegionSets "); }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2966
    verify_region_sets();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2967
    if (!silent) { gclog_or_tty->print("HeapRegions "); }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2968
    if (GCParallelVerificationEnabled && ParallelGCThreads > 1) {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2969
      assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2970
             "sanity check");
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2971
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2972
      G1ParVerifyTask task(this, allow_dirty, use_prev_marking);
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2973
      int n_workers = workers()->total_workers();
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2974
      set_par_threads(n_workers);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2975
      workers()->run_task(&task);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2976
      set_par_threads(0);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2977
      if (task.failures()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2978
        failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2979
      }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2980
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2981
      assert(check_heap_region_claim_values(HeapRegion::ParVerifyClaimValue),
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2982
             "sanity check");
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2983
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2984
      reset_heap_region_claim_values();
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2985
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2986
      assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2987
             "sanity check");
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2988
    } else {
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  2989
      VerifyRegionClosure blk(allow_dirty, false, use_prev_marking);
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2990
      _hrs->iterate(&blk);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2991
      if (blk.failures()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2992
        failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2993
      }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2994
    }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2995
    if (!silent) gclog_or_tty->print("RemSet ");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2996
    rem_set()->verify();
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2997
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2998
    if (failures) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  2999
      gclog_or_tty->print_cr("Heap:");
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3000
      print_on(gclog_or_tty, true /* extended */);
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3001
      gclog_or_tty->print_cr("");
5542
be05c5ffe905 6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents: 5540
diff changeset
  3002
#ifndef PRODUCT
4099
77d31ea5a439 6890137: G1: revamp reachable object dump
tonyp
parents: 4023
diff changeset
  3003
      if (VerifyDuringGC && G1VerifyDuringGCPrintReachable) {
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5343
diff changeset
  3004
        concurrent_mark()->print_reachable("at-verification-failure",
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5343
diff changeset
  3005
                                           use_prev_marking, false /* all */);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3006
      }
5542
be05c5ffe905 6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents: 5540
diff changeset
  3007
#endif
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3008
      gclog_or_tty->flush();
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3009
    }
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3010
    guarantee(!failures, "there should not have been any failures");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3011
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3012
    if (!silent) gclog_or_tty->print("(SKIPPING roots, heapRegions, remset) ");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3013
  }
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
class PrintRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3017
  outputStream* _st;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3018
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3019
  PrintRegionClosure(outputStream* st) : _st(st) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3020
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3021
    r->print_on(_st);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3022
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3023
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3024
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3025
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3026
void G1CollectedHeap::print() const { print_on(tty); }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3027
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3028
void G1CollectedHeap::print_on(outputStream* st) const {
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3029
  print_on(st, PrintHeapAtGCExtended);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3030
}
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3031
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3032
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
  3033
  st->print(" %-20s", "garbage-first heap");
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3034
  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
  3035
            capacity()/K, used_unlocked()/K);
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3036
  st->print(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", " INTPTR_FORMAT ")",
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3037
            _g1_storage.low_boundary(),
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3038
            _g1_storage.high(),
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3039
            _g1_storage.high_boundary());
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3040
  st->cr();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3041
  st->print("  region size " SIZE_FORMAT "K, ",
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3042
            HeapRegion::GrainBytes/K);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3043
  size_t young_regions = _young_list->length();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3044
  st->print(SIZE_FORMAT " young (" SIZE_FORMAT "K), ",
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3045
            young_regions, young_regions * HeapRegion::GrainBytes / K);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3046
  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
  3047
  st->print(SIZE_FORMAT " survivors (" SIZE_FORMAT "K)",
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3048
            survivor_regions, survivor_regions * HeapRegion::GrainBytes / K);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3049
  st->cr();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3050
  perm()->as_gen()->print_on(st);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3051
  if (extended) {
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3052
    st->cr();
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3053
    print_on_extended(st);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3054
  }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3055
}
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3056
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3057
void G1CollectedHeap::print_on_extended(outputStream* st) const {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3058
  PrintRegionClosure blk(st);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3059
  _hrs->iterate(&blk);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3060
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3061
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3062
void G1CollectedHeap::print_gc_threads_on(outputStream* st) const {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  3063
  if (G1CollectedHeap::use_parallel_gc_threads()) {
4022
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3064
    workers()->print_worker_threads_on(st);
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3065
  }
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3066
  _cmThread->print_on(st);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3067
  st->cr();
4022
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3068
  _cm->print_worker_threads_on(st);
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3069
  _cg1r->print_worker_threads_on(st);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3070
  st->cr();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3071
}
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
void G1CollectedHeap::gc_threads_do(ThreadClosure* tc) const {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  3074
  if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3075
    workers()->threads_do(tc);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3076
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3077
  tc->do_thread(_cmThread);
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  3078
  _cg1r->threads_do(tc);
1374
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3081
void G1CollectedHeap::print_tracing_info() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3082
  // We'll overload this to mean "trace GC pause statistics."
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3083
  if (TraceGen0Time || TraceGen1Time) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3084
    // The "G1CollectorPolicy" is keeping track of these stats, so delegate
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3085
    // to that.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3086
    g1_policy()->print_tracing_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3087
  }
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2345
diff changeset
  3088
  if (G1SummarizeRSetStats) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3089
    g1_rem_set()->print_summary_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3090
  }
5033
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
  3091
  if (G1SummarizeConcMark) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3092
    concurrent_mark()->print_summary_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3093
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3094
  g1_policy()->print_yg_surv_rate_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3095
  SpecializationStats::print();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3096
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3097
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3098
int G1CollectedHeap::addr_to_arena_id(void* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3099
  HeapRegion* hr = heap_region_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3100
  if (hr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3101
    return 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3102
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3103
    return 1;
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3107
G1CollectedHeap* G1CollectedHeap::heap() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3108
  assert(_sh->kind() == CollectedHeap::G1CollectedHeap,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3109
         "not a garbage-first heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3110
  return _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3111
}
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
void G1CollectedHeap::gc_prologue(bool full /* Ignored */) {
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4637
diff changeset
  3114
  // always_do_update_barrier = false;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3115
  assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3116
  // Call allocation profiler
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3117
  AllocationProfiler::iterate_since_last_gc();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3118
  // Fill TLAB's and such
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3119
  ensure_parsability(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3120
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3121
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3122
void G1CollectedHeap::gc_epilogue(bool full /* Ignored */) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3123
  // FIXME: what is this about?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3124
  // I'm ignoring the "fill_newgen()" call if "alloc_event_enabled"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3125
  // is set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3126
  COMPILER2_PRESENT(assert(DerivedPointerTable::is_empty(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3127
                        "derived pointer present"));
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4637
diff changeset
  3128
  // always_do_update_barrier = true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3129
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3130
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3131
HeapWord* G1CollectedHeap::do_collection_pause(size_t word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3132
                                               unsigned int gc_count_before,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3133
                                               bool* succeeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3134
  assert_heap_not_locked_and_not_at_safepoint();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3135
  g1_policy()->record_stop_world_start();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3136
  VM_G1IncCollectionPause op(gc_count_before,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3137
                             word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3138
                             false, /* should_initiate_conc_mark */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3139
                             g1_policy()->max_pause_time_ms(),
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3140
                             GCCause::_g1_inc_collection_pause);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3141
  VMThread::execute(&op);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3142
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3143
  HeapWord* result = op.result();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3144
  bool ret_succeeded = op.prologue_succeeded() && op.pause_succeeded();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3145
  assert(result == NULL || ret_succeeded,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3146
         "the result should be NULL if the VM did not succeed");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3147
  *succeeded = ret_succeeded;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3148
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3149
  assert_heap_not_locked();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3150
  return result;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3151
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3152
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3153
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3154
G1CollectedHeap::doConcurrentMark() {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3155
  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
  3156
  if (!_cmThread->in_progress()) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3157
    _cmThread->set_started();
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3158
    CGC_lock->notify();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3159
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3160
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3161
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3162
class VerifyMarkedObjsClosure: public ObjectClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3163
    G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3164
    public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3165
    VerifyMarkedObjsClosure(G1CollectedHeap* g1h) : _g1h(g1h) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3166
    void do_object(oop obj) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3167
      assert(obj->mark()->is_marked() ? !_g1h->is_obj_dead(obj) : true,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3168
             "markandsweep mark should agree with concurrent deadness");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3169
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3170
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3171
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3172
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3173
G1CollectedHeap::checkConcurrentMark() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3174
    VerifyMarkedObjsClosure verifycl(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3175
    //    MutexLockerEx x(getMarkBitMapLock(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3176
    //              Mutex::_no_safepoint_check_flag);
2345
3098a48a7240 6822263: G1: JVMTI heap iteration fails
iveresov
parents: 2344
diff changeset
  3177
    object_iterate(&verifycl, false);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3178
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3179
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3180
void G1CollectedHeap::do_sync_mark() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3181
  _cm->checkpointRootsInitial();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3182
  _cm->markFromRoots();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3183
  _cm->checkpointRootsFinal(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3184
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3185
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3186
// <NEW PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3187
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3188
double G1CollectedHeap::predict_region_elapsed_time_ms(HeapRegion *hr,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3189
                                                       bool young) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3190
  return _g1_policy->predict_region_elapsed_time_ms(hr, young);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3191
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3192
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3193
void G1CollectedHeap::check_if_region_is_too_expensive(double
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3194
                                                           predicted_time_ms) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3195
  _g1_policy->check_if_region_is_too_expensive(predicted_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3196
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3197
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3198
size_t G1CollectedHeap::pending_card_num() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3199
  size_t extra_cards = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3200
  JavaThread *curr = Threads::first();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3201
  while (curr != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3202
    DirtyCardQueue& dcq = curr->dirty_card_queue();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3203
    extra_cards += dcq.size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3204
    curr = curr->next();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3205
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3206
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3207
  size_t buffer_size = dcqs.buffer_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3208
  size_t buffer_num = dcqs.completed_buffers_num();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3209
  return buffer_size * buffer_num + extra_cards;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3210
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3211
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3212
size_t G1CollectedHeap::max_pending_card_num() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3213
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3214
  size_t buffer_size = dcqs.buffer_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3215
  size_t buffer_num  = dcqs.completed_buffers_num();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3216
  int thread_num  = Threads::number_of_threads();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3217
  return (buffer_num + thread_num) * buffer_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3218
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3219
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3220
size_t G1CollectedHeap::cards_scanned() {
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  3221
  return g1_rem_set()->cardsScanned();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3222
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3223
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3224
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3225
G1CollectedHeap::setup_surviving_young_words() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3226
  guarantee( _surviving_young_words == NULL, "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3227
  size_t array_length = g1_policy()->young_cset_length();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3228
  _surviving_young_words = NEW_C_HEAP_ARRAY(size_t, array_length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3229
  if (_surviving_young_words == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3230
    vm_exit_out_of_memory(sizeof(size_t) * array_length,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3231
                          "Not enough space for young surv words summary.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3232
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3233
  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
  3234
#ifdef ASSERT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3235
  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
  3236
    assert( _surviving_young_words[i] == 0, "memset above" );
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3237
  }
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3238
#endif // !ASSERT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3239
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3240
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3241
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3242
G1CollectedHeap::update_surviving_young_words(size_t* surv_young_words) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3243
  MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3244
  size_t array_length = g1_policy()->young_cset_length();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3245
  for (size_t i = 0; i < array_length; ++i)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3246
    _surviving_young_words[i] += surv_young_words[i];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3247
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3248
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3249
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3250
G1CollectedHeap::cleanup_surviving_young_words() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3251
  guarantee( _surviving_young_words != NULL, "pre-condition" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3252
  FREE_C_HEAP_ARRAY(size_t, _surviving_young_words);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3253
  _surviving_young_words = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3254
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3255
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3256
// </NEW PREDICTION>
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3257
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3258
struct PrepareForRSScanningClosure : public HeapRegionClosure {
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3259
  bool doHeapRegion(HeapRegion *r) {
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3260
    r->rem_set()->set_iter_claimed(0);
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3261
    return false;
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3262
  }
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3263
};
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3264
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3265
#if TASKQUEUE_STATS
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3266
void G1CollectedHeap::print_taskqueue_stats_hdr(outputStream* const st) {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3267
  st->print_raw_cr("GC Task Stats");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3268
  st->print_raw("thr "); TaskQueueStats::print_header(1, st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3269
  st->print_raw("--- "); TaskQueueStats::print_header(2, st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3270
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3271
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3272
void G1CollectedHeap::print_taskqueue_stats(outputStream* const st) const {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3273
  print_taskqueue_stats_hdr(st);
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3274
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3275
  TaskQueueStats totals;
6425
206fd9fee2cf 6978300: G1: debug builds crash if ParallelGCThreads==0
jcoomes
parents: 6261
diff changeset
  3276
  const int n = workers() != NULL ? workers()->total_workers() : 1;
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3277
  for (int i = 0; i < n; ++i) {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3278
    st->print("%3d ", i); task_queue(i)->stats.print(st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3279
    totals += task_queue(i)->stats;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3280
  }
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3281
  st->print_raw("tot "); totals.print(st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3282
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3283
  DEBUG_ONLY(totals.verify());
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3284
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3285
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3286
void G1CollectedHeap::reset_taskqueue_stats() {
6425
206fd9fee2cf 6978300: G1: debug builds crash if ParallelGCThreads==0
jcoomes
parents: 6261
diff changeset
  3287
  const int n = workers() != NULL ? workers()->total_workers() : 1;
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3288
  for (int i = 0; i < n; ++i) {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3289
    task_queue(i)->stats.reset();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3290
  }
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3291
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3292
#endif // TASKQUEUE_STATS
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3293
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3294
bool
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3295
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
  3296
  assert_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3297
  guarantee(!is_gc_active(), "collection is not reentrant");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3298
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3299
  if (GC_locker::check_active_before_gc()) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3300
    return false;
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3301
  }
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3302
7896
08aadd7aa3ee 6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents: 7659
diff changeset
  3303
  SvcGCMarker sgcm(SvcGCMarker::MINOR);
7659
1d92613a1e8a 6896624: G1: hotspot:::gc and hotspot:::mem-pool-gc probes are not fired
tonyp
parents: 7658
diff changeset
  3304
  ResourceMark rm;
1d92613a1e8a 6896624: G1: hotspot:::gc and hotspot:::mem-pool-gc probes are not fired
tonyp
parents: 7658
diff changeset
  3305
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3306
  if (PrintHeapAtGC) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3307
    Universe::print_heap_before_gc();
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
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3310
  verify_region_sets_optional();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3311
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3312
  {
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3313
    // 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
  3314
    // 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
  3315
    // for the duration of this pause.
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3316
    g1_policy()->decide_on_conc_mark_initiation();
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3317
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3318
    char verbose_str[128];
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3319
    sprintf(verbose_str, "GC pause ");
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3320
    if (g1_policy()->in_young_gc_mode()) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3321
      if (g1_policy()->full_young_gcs())
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3322
        strcat(verbose_str, "(young)");
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3323
      else
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3324
        strcat(verbose_str, "(partial)");
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3325
    }
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3326
    if (g1_policy()->during_initial_mark_pause()) {
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3327
      strcat(verbose_str, " (initial-mark)");
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3328
      // 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
  3329
      // full collection counter.
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3330
      increment_total_full_collections();
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3331
    }
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3332
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3333
    // 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
  3334
    // 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
  3335
    // is messy if we do.
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3336
    gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3337
    TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3338
    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
  3339
4459
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  3340
    TraceMemoryManagerStats tms(false /* fullGC */);
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  3341
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3342
    // If there are any free regions available on the secondary_free_list
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3343
    // make sure we append them to the free_list. However, we don't
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3344
    // have to wait for the rest of the cleanup operation to
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3345
    // finish. If it's still going on that's OK. If we run out of
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3346
    // regions, the region allocation code will check the
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3347
    // secondary_free_list and potentially wait if more free regions
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3348
    // are coming (see new_region_try_secondary_free_list()).
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3349
    if (!G1StressConcRegionFreeing) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3350
      append_secondary_free_list_if_not_empty();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3351
    }
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3352
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3353
    increment_gc_time_stamp();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3354
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3355
    if (g1_policy()->in_young_gc_mode()) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3356
      assert(check_young_list_well_formed(),
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3357
             "young list should be well formed");
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3358
    }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3359
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3360
    { // 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
  3361
      IsGCActiveMark x;
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3362
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3363
      gc_prologue(false);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3364
      increment_total_collections(false /* full gc */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3365
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3366
#if G1_REM_SET_LOGGING
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3367
      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
  3368
      print();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3369
#endif
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3370
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3371
      if (VerifyBeforeGC && total_collections() >= VerifyGCStartAt) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3372
        HandleMark hm;  // Discard invalid handles created during verification
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3373
        prepare_for_verify();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3374
        gclog_or_tty->print(" VerifyBeforeGC:");
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3375
        Universe::verify(false);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3376
      }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3377
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3378
      COMPILER2_PRESENT(DerivedPointerTable::clear());
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3379
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  3380
      // Please see comment in G1CollectedHeap::ref_processing_init()
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  3381
      // 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
  3382
      //
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3383
      // 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
  3384
      // 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
  3385
      bool was_enabled = ref_processor()->discovery_enabled();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3386
      if (was_enabled) ref_processor()->disable_discovery();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3387
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3388
      // 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
  3389
      // of the collection set!).
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3390
      abandon_cur_alloc_region();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3391
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3392
      // 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
  3393
      // the possible verification above.
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3394
      double start_time_sec = os::elapsedTime();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3395
      size_t start_used_bytes = used();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3396
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3397
#if YOUNG_LIST_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3398
      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
  3399
      _young_list->print();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3400
      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
  3401
#endif // YOUNG_LIST_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3402
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3403
      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
  3404
                                                 start_used_bytes);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3405
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3406
#if YOUNG_LIST_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3407
      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
  3408
      _young_list->print();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3409
#endif // YOUNG_LIST_VERBOSE
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3410
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3411
      if (g1_policy()->during_initial_mark_pause()) {
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3412
        concurrent_mark()->checkpointRootsInitialPre();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3413
      }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3414
      save_marks();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3415
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3416
      // 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
  3417
      // marks.
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3418
      if (mark_in_progress()) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3419
        double start_time_sec = os::elapsedTime();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3420
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3421
        _cm->drainAllSATBBuffers();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3422
        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
  3423
        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
  3424
      }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3425
      // 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
  3426
      // 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
  3427
      // 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
  3428
      // progress, this will be zero.
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3429
      _cm->set_oops_do_bound();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3430
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3431
      if (mark_in_progress())
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3432
        concurrent_mark()->newCSet();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3433
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3434
#if YOUNG_LIST_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3435
      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
  3436
      _young_list->print();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3437
      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
  3438
#endif // YOUNG_LIST_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3439
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3440
      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
  3441
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3442
      // 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
  3443
#if G1_REM_SET_LOGGING
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3444
      gclog_or_tty->print_cr("\nAfter pause, heap:");
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3445
      print();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3446
#endif
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3447
      PrepareForRSScanningClosure prepare_for_rs_scan;
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3448
      collection_set_iterate(&prepare_for_rs_scan);
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3449
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3450
      setup_surviving_young_words();
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3451
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3452
      // Set up the gc allocation regions.
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3453
      get_gc_alloc_regions();
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3454
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3455
      // Actually do the work...
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3456
      evacuate_collection_set();
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3457
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3458
      free_collection_set(g1_policy()->collection_set());
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3459
      g1_policy()->clear_collection_set();
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3460
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3461
      cleanup_surviving_young_words();
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3462
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3463
      // Start a new incremental collection set for the next pause.
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3464
      g1_policy()->start_incremental_cset_building();
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3465
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3466
      // Clear the _cset_fast_test bitmap in anticipation of adding
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3467
      // regions to the incremental collection set for the next
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3468
      // evacuation pause.
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3469
      clear_cset_fast_test();
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3470
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3471
      if (g1_policy()->in_young_gc_mode()) {
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3472
        _young_list->reset_sampled_info();
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3473
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3474
        // 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
  3475
        // GC alloc regions from this pause have been tagged
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3476
        // as survivors and moved on to the survivor list.
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3477
        // Survivor regions will fail the !is_young() check.
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3478
        assert(check_young_list_empty(false /* check_heap */),
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3479
               "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
  3480
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3481
#if YOUNG_LIST_VERBOSE
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3482
        gclog_or_tty->print_cr("Before recording survivors.\nYoung List:");
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3483
        _young_list->print();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3484
#endif // YOUNG_LIST_VERBOSE
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3485
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3486
        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
  3487
                                          _young_list->first_survivor_region(),
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3488
                                          _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
  3489
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3490
        _young_list->reset_auxilary_lists();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3491
      }
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3492
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3493
      if (evacuation_failed()) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3494
        _summary_bytes_used = recalculate_used();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3495
      } else {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3496
        // 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
  3497
        // 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
  3498
        _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
  3499
      }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3500
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3501
      if (g1_policy()->in_young_gc_mode() &&
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3502
          g1_policy()->during_initial_mark_pause()) {
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3503
        concurrent_mark()->checkpointRootsInitialPost();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3504
        set_marking_started();
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3505
        // CAUTION: after the doConcurrentMark() call below,
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3506
        // the concurrent marking thread(s) could be running
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3507
        // concurrently with us. Make sure that anything after
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3508
        // 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
  3509
        // 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
  3510
        // 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
  3511
        // ConcurrentGCThread::safepoint_desynchronize().
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3512
        doConcurrentMark();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3513
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3514
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3515
#if YOUNG_LIST_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3516
      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
  3517
      _young_list->print();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3518
      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
  3519
#endif // YOUNG_LIST_VERBOSE
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3520
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3521
      double end_time_sec = os::elapsedTime();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3522
      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
  3523
      g1_policy()->record_pause_time_ms(pause_time_ms);
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3524
      g1_policy()->record_collection_pause_end();
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3525
4459
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  3526
      MemoryService::track_memory_usage();
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  3527
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3528
      if (VerifyAfterGC && total_collections() >= VerifyGCStartAt) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3529
        HandleMark hm;  // Discard invalid handles created during verification
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3530
        gclog_or_tty->print(" VerifyAfterGC:");
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3531
        prepare_for_verify();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3532
        Universe::verify(false);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3533
      }
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3534
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3535
      if (was_enabled) ref_processor()->enable_discovery();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3536
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3537
      {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3538
        size_t expand_bytes = g1_policy()->expansion_amount();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3539
        if (expand_bytes > 0) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3540
          size_t bytes_before = capacity();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3541
          expand(expand_bytes);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3542
        }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3543
      }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3544
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3545
      if (mark_in_progress()) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3546
        concurrent_mark()->update_g1_committed();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3547
      }
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  3548
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  3549
#ifdef TRACESPINNING
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3550
      ParallelTaskTerminator::print_termination_counts();
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  3551
#endif
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3552
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3553
      gc_epilogue(false);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3554
    }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3555
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3556
    if (ExitAfterGCNum > 0 && total_collections() == ExitAfterGCNum) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3557
      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
  3558
      print_tracing_info();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3559
      vm_exit(-1);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3560
    }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3561
  }
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3562
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3563
  verify_region_sets_optional();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3564
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3565
  TASKQUEUE_STATS_ONLY(if (ParallelGCVerbose) print_taskqueue_stats());
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3566
  TASKQUEUE_STATS_ONLY(reset_taskqueue_stats());
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3567
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3568
  if (PrintHeapAtGC) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3569
    Universe::print_heap_after_gc();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3570
  }
3584
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  3571
  if (G1SummarizeRSetStats &&
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  3572
      (G1SummarizeRSetStatsPeriod > 0) &&
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  3573
      (total_collections() % G1SummarizeRSetStatsPeriod == 0)) {
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  3574
    g1_rem_set()->print_summary_info();
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  3575
  }
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3576
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3577
  return true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3578
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3579
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3580
size_t G1CollectedHeap::desired_plab_sz(GCAllocPurpose purpose)
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3581
{
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3582
  size_t gclab_word_size;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3583
  switch (purpose) {
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3584
    case GCAllocForSurvived:
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3585
      gclab_word_size = YoungPLABSize;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3586
      break;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3587
    case GCAllocForTenured:
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3588
      gclab_word_size = OldPLABSize;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3589
      break;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3590
    default:
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3591
      assert(false, "unknown GCAllocPurpose");
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3592
      gclab_word_size = OldPLABSize;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3593
      break;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3594
  }
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3595
  return gclab_word_size;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3596
}
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3597
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  3598
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3599
void G1CollectedHeap::set_gc_alloc_region(int purpose, HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3600
  assert(purpose >= 0 && purpose < GCAllocPurposeCount, "invalid purpose");
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3601
  // 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
  3602
  // the same region
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3603
  assert(r == NULL || !r->is_gc_alloc_region(),
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3604
         "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
  3605
  assert(r == NULL || !r->isHumongous(),
1ac8ab19bedb 6940894: G1: assert(new_obj != 0 || ... "should be forwarded") for compaction tests
johnc
parents: 5243
diff changeset
  3606
         "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
  3607
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3608
  HeapWord* original_top = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3609
  if (r != NULL)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3610
    original_top = r->top();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3611
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3612
  // 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
  3613
  // 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
  3614
  // So record it now and use it later.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3615
  size_t r_used = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3616
  if (r != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3617
    r_used = r->used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3618
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  3619
    if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3620
      // need to take the lock to guard against two threads calling
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3621
      // get_gc_alloc_region concurrently (very unlikely but...)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3622
      MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3623
      r->save_marks();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3624
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3625
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3626
  HeapRegion* old_alloc_region = _gc_alloc_regions[purpose];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3627
  _gc_alloc_regions[purpose] = r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3628
  if (old_alloc_region != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3629
    // Replace aliases too.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3630
    for (int ap = 0; ap < GCAllocPurposeCount; ++ap) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3631
      if (_gc_alloc_regions[ap] == old_alloc_region) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3632
        _gc_alloc_regions[ap] = r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3633
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3634
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3635
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3636
  if (r != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3637
    push_gc_alloc_region(r);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3638
    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
  3639
      // 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
  3640
      // as a mutator allocation region during the current marking cycle.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3641
      // The mutator-allocated objects are currently implicitly marked, but
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3642
      // 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
  3643
      // 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
  3644
      // the "gap".  We do this object-by-object, since marking densely
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3645
      // does not currently work right with marking bitmap iteration.  This
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3646
      // 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
  3647
      // "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
  3648
      // to fix the marking bitmap iteration.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3649
      HeapWord* curhw = r->next_top_at_mark_start();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3650
      HeapWord* t = original_top;
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
      while (curhw < t) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3653
        oop cur = (oop)curhw;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3654
        // We'll assume parallel for generality.  This is rare code.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3655
        concurrent_mark()->markAndGrayObjectIfNecessary(cur); // can't we just mark them?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3656
        curhw = curhw + cur->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3657
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3658
      assert(curhw == t, "Should have parsed correctly.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3659
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3660
    if (G1PolicyVerbose > 1) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3661
      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
  3662
                          "for survivors:", r->bottom(), original_top, r->end());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3663
      r->print();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3664
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3665
    g1_policy()->record_before_bytes(r_used);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3666
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3667
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3668
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3669
void G1CollectedHeap::push_gc_alloc_region(HeapRegion* hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3670
  assert(Thread::current()->is_VM_thread() ||
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3671
         FreeList_lock->owned_by_self(), "Precondition");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3672
  assert(!hr->is_gc_alloc_region() && !hr->in_collection_set(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3673
         "Precondition.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3674
  hr->set_is_gc_alloc_region(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3675
  hr->set_next_gc_alloc_region(_gc_alloc_region_list);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3676
  _gc_alloc_region_list = hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3677
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3678
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3679
#ifdef G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3680
class FindGCAllocRegion: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3681
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3682
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3683
    if (r->is_gc_alloc_region()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3684
      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
  3685
                             r->hrs_index(), r->bottom());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3686
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3687
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3688
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3689
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3690
#endif // G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3691
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3692
void G1CollectedHeap::forget_alloc_region_list() {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3693
  assert_at_safepoint(true /* should_be_vm_thread */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3694
  while (_gc_alloc_region_list != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3695
    HeapRegion* r = _gc_alloc_region_list;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3696
    assert(r->is_gc_alloc_region(), "Invariant.");
2249
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  3697
    // 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
  3698
    // 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
  3699
    // 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
  3700
    // G1HRRSFlushLogBuffersOnVerify). It's safe thing to do after the
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  3701
    // collection.
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  3702
    r->ContiguousSpace::set_saved_mark();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3703
    _gc_alloc_region_list = r->next_gc_alloc_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3704
    r->set_next_gc_alloc_region(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3705
    r->set_is_gc_alloc_region(false);
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  3706
    if (r->is_survivor()) {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  3707
      if (r->is_empty()) {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  3708
        r->set_not_young();
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  3709
      } else {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  3710
        _young_list->add_survivor_region(r);
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  3711
      }
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  3712
    }
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
#ifdef G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3715
  FindGCAllocRegion fa;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3716
  heap_region_iterate(&fa);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3717
#endif // G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3718
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3719
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
bool G1CollectedHeap::check_gc_alloc_regions() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3722
  // TODO: allocation regions check
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3723
  return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3724
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3725
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3726
void G1CollectedHeap::get_gc_alloc_regions() {
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3727
  // 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
  3728
  assert(_gc_alloc_region_list == NULL, "invariant");
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3729
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3730
  for (int ap = 0; ap < GCAllocPurposeCount; ++ap) {
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3731
    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
  3732
    assert(_gc_alloc_region_counts[ap] == 0, "invariant");
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3733
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3734
    // Create new GC alloc regions.
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3735
    HeapRegion* alloc_region = _retained_gc_alloc_regions[ap];
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3736
    _retained_gc_alloc_regions[ap] = NULL;
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3737
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3738
    if (alloc_region != NULL) {
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3739
      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
  3740
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3741
      // 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
  3742
      // outside a GC operation
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3743
      assert(!alloc_region->is_gc_alloc_region(), "sanity");
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 (alloc_region->in_collection_set() ||
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3746
          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
  3747
          alloc_region->top() == alloc_region->bottom() ||
1ac8ab19bedb 6940894: G1: assert(new_obj != 0 || ... "should be forwarded") for compaction tests
johnc
parents: 5243
diff changeset
  3748
          alloc_region->isHumongous()) {
1ac8ab19bedb 6940894: G1: assert(new_obj != 0 || ... "should be forwarded") for compaction tests
johnc
parents: 5243
diff changeset
  3749
        // 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
  3750
        // * 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
  3751
        // * 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
  3752
        // * 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
  3753
        // 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
  3754
        // * 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
  3755
        // 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
  3756
        // 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
  3757
        // object that may be less than the region size).
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3758
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3759
        alloc_region = NULL;
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3760
      }
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3761
    }
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3762
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3763
    if (alloc_region == NULL) {
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3764
      // we will get a new GC alloc region
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3765
      alloc_region = new_gc_alloc_region(ap, 0);
3278
652f923606a4 6862661: G1: _gc_alloc_region_counts is not updated properly after 6604422
apetrusenko
parents: 3263
diff changeset
  3766
    } else {
652f923606a4 6862661: G1: _gc_alloc_region_counts is not updated properly after 6604422
apetrusenko
parents: 3263
diff changeset
  3767
      // 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
  3768
      ++_gc_alloc_region_counts[ap];
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5343
diff changeset
  3769
      if (G1PrintHeapRegions) {
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5343
diff changeset
  3770
        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
  3771
                               "top "PTR_FORMAT,
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5343
diff changeset
  3772
                               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
  3773
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3774
    }
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3775
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3776
    if (alloc_region != NULL) {
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3777
      assert(_gc_alloc_regions[ap] == NULL, "pre-condition");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3778
      set_gc_alloc_region(ap, alloc_region);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3779
    }
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3780
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3781
    assert(_gc_alloc_regions[ap] == NULL ||
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3782
           _gc_alloc_regions[ap]->is_gc_alloc_region(),
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3783
           "the GC alloc region should be tagged as such");
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3784
    assert(_gc_alloc_regions[ap] == NULL ||
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3785
           _gc_alloc_regions[ap] == _gc_alloc_region_list,
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3786
           "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
  3787
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3788
  // Set alternative regions for allocation purposes that have reached
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3789
  // their limit.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3790
  for (int ap = 0; ap < GCAllocPurposeCount; ++ap) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3791
    GCAllocPurpose alt_purpose = g1_policy()->alternative_purpose(ap);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3792
    if (_gc_alloc_regions[ap] == NULL && alt_purpose != ap) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3793
      _gc_alloc_regions[ap] = _gc_alloc_regions[alt_purpose];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3794
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3795
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3796
  assert(check_gc_alloc_regions(), "alloc regions messed up");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3797
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3798
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3799
void G1CollectedHeap::release_gc_alloc_regions(bool totally) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3800
  // 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
  3801
  // the current collection pause. Forget that now. This method will
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3802
  // 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
  3803
  // 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
  3804
  // outside GCs.
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  3805
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3806
  forget_alloc_region_list();
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
  // The current alloc regions contain objs that have survived
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3809
  // collection. Make them no longer GC alloc regions.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3810
  for (int ap = 0; ap < GCAllocPurposeCount; ++ap) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3811
    HeapRegion* r = _gc_alloc_regions[ap];
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3812
    _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
  3813
    _gc_alloc_region_counts[ap] = 0;
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3814
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3815
    if (r != NULL) {
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3816
      // we retain nothing on _gc_alloc_regions between GCs
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3817
      set_gc_alloc_region(ap, NULL);
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3818
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3819
      if (r->is_empty()) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3820
        // 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
  3821
        // it back on the free list.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3822
        _free_list.add_as_tail(r);
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3823
      } else if (_retain_gc_alloc_region[ap] && !totally) {
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3824
        // 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
  3825
        _retained_gc_alloc_regions[ap] = r;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3826
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3827
    }
2248
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3828
  }
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3829
}
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3830
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3831
#ifndef PRODUCT
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3832
// Useful for debugging
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3833
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3834
void G1CollectedHeap::print_gc_alloc_regions() {
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3835
  gclog_or_tty->print_cr("GC alloc regions");
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3836
  for (int ap = 0; ap < GCAllocPurposeCount; ++ap) {
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3837
    HeapRegion* r = _gc_alloc_regions[ap];
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3838
    if (r == NULL) {
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3839
      gclog_or_tty->print_cr("  %2d : "PTR_FORMAT, ap, NULL);
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3840
    } else {
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3841
      gclog_or_tty->print_cr("  %2d : "PTR_FORMAT" "SIZE_FORMAT,
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3842
                             ap, r->bottom(), r->used());
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3843
    }
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3844
  }
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3845
}
ce45d1a075d3 6604422: G1: re-use half-promoted regions
tonyp
parents: 2152
diff changeset
  3846
#endif // PRODUCT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3847
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3848
void G1CollectedHeap::init_for_evac_failure(OopsInHeapRegionClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3849
  _drain_in_progress = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3850
  set_evac_failure_closure(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3851
  _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
  3852
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3853
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3854
void G1CollectedHeap::finalize_for_evac_failure() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3855
  assert(_evac_failure_scan_stack != NULL &&
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3856
         _evac_failure_scan_stack->length() == 0,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3857
         "Postcondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3858
  assert(!_drain_in_progress, "Postcondition");
4100
4f43ba12619a 6870843: G1: G1 GC memory leak
apetrusenko
parents: 4099
diff changeset
  3859
  delete _evac_failure_scan_stack;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3860
  _evac_failure_scan_stack = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3861
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3862
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3863
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3864
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3865
// *** Sequential G1 Evacuation
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3866
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3867
class G1IsAliveClosure: public BoolObjectClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3868
  G1CollectedHeap* _g1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3869
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3870
  G1IsAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3871
  void do_object(oop p) { assert(false, "Do not call."); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3872
  bool do_object_b(oop p) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3873
    // 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
  3874
    // and forwarded.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3875
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3876
#ifdef G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3877
    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
  3878
                           (void*) p, _g1->obj_in_cs(p), p->is_forwarded(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3879
                           !_g1->obj_in_cs(p) || p->is_forwarded());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3880
#endif // G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3881
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3882
    return !_g1->obj_in_cs(p) || p->is_forwarded();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3883
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3884
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3885
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3886
class G1KeepAliveClosure: public OopClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3887
  G1CollectedHeap* _g1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3888
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3889
  G1KeepAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3890
  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
  3891
  void do_oop(      oop* p) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3892
    oop obj = *p;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3893
#ifdef G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3894
    if (PrintGC && Verbose) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3895
      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
  3896
                             p, (void*) obj, (void*) *p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3897
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3898
#endif // G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3899
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3900
    if (_g1->obj_in_cs(obj)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3901
      assert( obj->is_forwarded(), "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3902
      *p = obj->forwardee();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3903
#ifdef G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3904
      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
  3905
                             (void*) obj, (void*) *p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3906
#endif // G1_DEBUG
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3907
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3908
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3909
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3910
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3911
class UpdateRSetDeferred : public OopsInHeapRegionClosure {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3912
private:
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3913
  G1CollectedHeap* _g1;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3914
  DirtyCardQueue *_dcq;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3915
  CardTableModRefBS* _ct_bs;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3916
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3917
public:
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3918
  UpdateRSetDeferred(G1CollectedHeap* g1, DirtyCardQueue* dcq) :
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3919
    _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
  3920
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3921
  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
  3922
  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
  3923
  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
  3924
    assert(_from->is_in_reserved(p), "paranoia");
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3925
    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
  3926
        !_from->is_survivor()) {
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3927
      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
  3928
      if (_ct_bs->mark_card_deferred(card_index)) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3929
        _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
  3930
      }
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3931
    }
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3932
  }
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3933
};
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3934
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3935
class RemoveSelfPointerClosure: public ObjectClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3936
private:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3937
  G1CollectedHeap* _g1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3938
  ConcurrentMark* _cm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3939
  HeapRegion* _hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3940
  size_t _prev_marked_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3941
  size_t _next_marked_bytes;
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  3942
  OopsInHeapRegionClosure *_cl;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3943
public:
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3944
  RemoveSelfPointerClosure(G1CollectedHeap* g1, HeapRegion* hr,
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3945
                           OopsInHeapRegionClosure* cl) :
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3946
    _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
  3947
    _next_marked_bytes(0), _cl(cl) {}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3948
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3949
  size_t prev_marked_bytes() { return _prev_marked_bytes; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3950
  size_t next_marked_bytes() { return _next_marked_bytes; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3951
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3952
  // <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
  3953
  // 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
  3954
  // 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
  3955
  // 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
  3956
  // |----- 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
  3957
  // 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
  3958
  // 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
  3959
  // 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
  3960
  // would point into middle of the filler object.
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3961
  // 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
  3962
  // </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
  3963
  //
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3964
  // 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
  3965
  // 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
  3966
  // 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
  3967
  // 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
  3968
  void do_object(oop obj) {
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3969
    HeapWord* obj_addr = (HeapWord*) obj;
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3970
    assert(_hr->is_in(obj_addr), "sanity");
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3971
    size_t obj_size = obj->size();
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3972
    _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
  3973
    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
  3974
      // 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
  3975
      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
  3976
      _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
  3977
      assert(_cm->isPrevMarked(obj), "Should be marked!");
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  3978
      _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
  3979
      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
  3980
        _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
  3981
      }
163a4d4fa951 6702387: G1: assertion failure: assert(p == current_top || oop(p)->is_oop(),"p is not a block start")
iveresov
parents: 1374
diff changeset
  3982
      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
  3983
      // 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
  3984
      // 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
  3985
      // 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
  3986
      // 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
  3987
      // 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
  3988
      // 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
  3989
      // 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
  3990
      // 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
  3991
      // 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
  3992
      // 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
  3993
      // 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
  3994
      // 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
  3995
      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
  3996
      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
  3997
    } 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
  3998
      // 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
  3999
      // dummy object.
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  4000
      MemRegion mr((HeapWord*)obj, obj_size);
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  4001
      CollectedHeap::fill_with_object(mr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4002
      _cm->clearRangeBothMaps(mr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4003
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4004
  }
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::remove_self_forwarding_pointers() {
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  4008
  UpdateRSetImmediate immediate_update(_g1h->g1_rem_set());
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4009
  DirtyCardQueue dcq(&_g1h->dirty_card_queue_set());
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4010
  UpdateRSetDeferred deferred_update(_g1h, &dcq);
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4011
  OopsInHeapRegionClosure *cl;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4012
  if (G1DeferredRSUpdate) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4013
    cl = &deferred_update;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4014
  } else {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4015
    cl = &immediate_update;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4016
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4017
  HeapRegion* cur = g1_policy()->collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4018
  while (cur != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4019
    assert(g1_policy()->assertMarkedBytesDataOK(), "Should be!");
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  4020
    assert(!cur->isHumongous(), "sanity");
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  4021
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4022
    if (cur->evacuation_failed()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4023
      assert(cur->in_collection_set(), "bad CS");
7904
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  4024
      RemoveSelfPointerClosure rspc(_g1h, cur, cl);
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  4025
e90e097fced4 7007068: G1: refine the BOT during evac failure handling
tonyp
parents: 7659
diff changeset
  4026
      cur->reset_bot();
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4027
      cl->set_region(cur);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4028
      cur->object_iterate(&rspc);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4029
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4030
      // 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
  4031
      // and the marked bytes be the ones observed in the iteration.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4032
      if (_g1h->concurrent_mark()->at_least_one_mark_complete()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4033
        // The comments below are the postconditions achieved by the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4034
        // calls.  Note especially the last such condition, which says that
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4035
        // the count of marked bytes has been properly restored.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4036
        cur->note_start_of_marking(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4037
        // _next_top_at_mark_start == top, _next_marked_bytes == 0
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4038
        cur->add_to_marked_bytes(rspc.prev_marked_bytes());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4039
        // _next_marked_bytes == prev_marked_bytes.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4040
        cur->note_end_of_marking();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4041
        // _prev_top_at_mark_start == top(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4042
        // _prev_marked_bytes == prev_marked_bytes
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4043
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4044
      // 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
  4045
      // above needlessly, but harmlessly.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4046
      if (_g1h->mark_in_progress()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4047
        cur->note_start_of_marking(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4048
        // _next_top_at_mark_start == top, _next_marked_bytes == 0
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4049
        // _next_marked_bytes == next_marked_bytes.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4050
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4051
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4052
      // 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
  4053
      g1_policy()->note_change_in_marked_bytes(cur);
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
    cur = cur->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4056
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4057
  assert(g1_policy()->assertMarkedBytesDataOK(), "Should be!");
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
  // Now restore saved marks, if any.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4060
  if (_objs_with_preserved_marks != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4061
    assert(_preserved_marks_of_objs != NULL, "Both or none.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4062
    guarantee(_objs_with_preserved_marks->length() ==
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4063
              _preserved_marks_of_objs->length(), "Both or none.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4064
    for (int i = 0; i < _objs_with_preserved_marks->length(); i++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4065
      oop obj   = _objs_with_preserved_marks->at(i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4066
      markOop m = _preserved_marks_of_objs->at(i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4067
      obj->set_mark(m);
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
    // Delete the preserved marks growable arrays (allocated on the C heap).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4070
    delete _objs_with_preserved_marks;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4071
    delete _preserved_marks_of_objs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4072
    _objs_with_preserved_marks = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4073
    _preserved_marks_of_objs = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4074
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4075
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4076
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4077
void G1CollectedHeap::push_on_evac_failure_scan_stack(oop obj) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4078
  _evac_failure_scan_stack->push(obj);
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::drain_evac_failure_scan_stack() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4082
  assert(_evac_failure_scan_stack != NULL, "precondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4083
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4084
  while (_evac_failure_scan_stack->length() > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4085
     oop obj = _evac_failure_scan_stack->pop();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4086
     _evac_failure_closure->set_region(heap_region_containing(obj));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4087
     obj->oop_iterate_backwards(_evac_failure_closure);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4088
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4089
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4090
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4091
oop
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4092
G1CollectedHeap::handle_evacuation_failure_par(OopsInHeapRegionClosure* cl,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4093
                                               oop old) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4094
  markOop m = old->mark();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4095
  oop forward_ptr = old->forward_to_atomic(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4096
  if (forward_ptr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4097
    // Forward-to-self succeeded.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4098
    if (_evac_failure_closure != cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4099
      MutexLockerEx x(EvacFailureStack_lock, Mutex::_no_safepoint_check_flag);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4100
      assert(!_drain_in_progress,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4101
             "Should only be true while someone holds the lock.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4102
      // Set the global evac-failure closure to the current thread's.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4103
      assert(_evac_failure_closure == NULL, "Or locking has failed.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4104
      set_evac_failure_closure(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4105
      // Now do the common part.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4106
      handle_evacuation_failure_common(old, m);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4107
      // Reset to NULL.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4108
      set_evac_failure_closure(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4109
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4110
      // The lock is already held, and this is recursive.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4111
      assert(_drain_in_progress, "This should only be the recursive case.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4112
      handle_evacuation_failure_common(old, m);
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 old;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4115
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4116
    // Someone else had a place to copy it.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4117
    return forward_ptr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4118
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4119
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4120
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4121
void G1CollectedHeap::handle_evacuation_failure_common(oop old, markOop m) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4122
  set_evacuation_failed(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4123
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4124
  preserve_mark_if_necessary(old, m);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4125
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4126
  HeapRegion* r = heap_region_containing(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4127
  if (!r->evacuation_failed()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4128
    r->set_evacuation_failed(true);
5033
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
  4129
    if (G1PrintHeapRegions) {
6261
1fe3e07abdb4 6975964: G1: print out a more descriptive message for evacuation failure when +PrintGCDetails is set
tonyp
parents: 6260
diff changeset
  4130
      gclog_or_tty->print("overflow in heap region "PTR_FORMAT" "
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4131
                          "["PTR_FORMAT","PTR_FORMAT")\n",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4132
                          r, r->bottom(), r->end());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4133
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4134
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4135
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4136
  push_on_evac_failure_scan_stack(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4137
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4138
  if (!_drain_in_progress) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4139
    // prevent recursion in copy_to_survivor_space()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4140
    _drain_in_progress = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4141
    drain_evac_failure_scan_stack();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4142
    _drain_in_progress = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4143
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4144
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4145
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4146
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
  4147
  assert(evacuation_failed(), "Oversaving!");
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7657
diff changeset
  4148
  // 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
  4149
  // case of a promotion failure.
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7657
diff changeset
  4150
  if (m->must_be_preserved_for_promotion_failure(obj)) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4151
    if (_objs_with_preserved_marks == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4152
      assert(_preserved_marks_of_objs == NULL, "Both or none.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4153
      _objs_with_preserved_marks =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4154
        new (ResourceObj::C_HEAP) GrowableArray<oop>(40, true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4155
      _preserved_marks_of_objs =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4156
        new (ResourceObj::C_HEAP) GrowableArray<markOop>(40, true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4157
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4158
    _objs_with_preserved_marks->push(obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4159
    _preserved_marks_of_objs->push(m);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4160
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4161
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4162
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4163
// *** Parallel G1 Evacuation
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4164
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4165
HeapWord* G1CollectedHeap::par_allocate_during_gc(GCAllocPurpose purpose,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4166
                                                  size_t word_size) {
6260
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6259
diff changeset
  4167
  assert(!isHumongous(word_size),
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6259
diff changeset
  4168
         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
  4169
                 "during GC, word_size = "SIZE_FORMAT, word_size));
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6259
diff changeset
  4170
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4171
  HeapRegion* alloc_region = _gc_alloc_regions[purpose];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4172
  // let the caller handle alloc failure
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4173
  if (alloc_region == NULL) return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4174
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4175
  HeapWord* block = alloc_region->par_allocate(word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4176
  if (block == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4177
    block = allocate_during_gc_slow(purpose, alloc_region, true, word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4178
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4179
  return block;
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
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4182
void G1CollectedHeap::retire_alloc_region(HeapRegion* alloc_region,
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4183
                                            bool par) {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4184
  // Another thread might have obtained alloc_region for the given
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4185
  // purpose, and might be attempting to allocate in it, and might
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4186
  // succeed.  Therefore, we can't do the "finalization" stuff on the
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4187
  // region below until we're sure the last allocation has happened.
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4188
  // We ensure this by allocating the remaining space with a garbage
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4189
  // object.
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4190
  if (par) par_allocate_remaining_space(alloc_region);
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4191
  // Now we can do the post-GC stuff on the region.
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4192
  alloc_region->note_end_of_copying();
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4193
  g1_policy()->record_after_bytes(alloc_region->used());
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4194
}
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4195
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4196
HeapWord*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4197
G1CollectedHeap::allocate_during_gc_slow(GCAllocPurpose purpose,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4198
                                         HeapRegion*    alloc_region,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4199
                                         bool           par,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4200
                                         size_t         word_size) {
6260
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6259
diff changeset
  4201
  assert(!isHumongous(word_size),
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6259
diff changeset
  4202
         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
  4203
                 "during GC, word_size = "SIZE_FORMAT, word_size));
fba83fd3adc7 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 6259
diff changeset
  4204
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4205
  // 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
  4206
  // that the FreeList_lock guards accesses to the free_list anyway,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4207
  // 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
  4208
  // to protect the whole call.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4209
  MutexLockerEx x(FreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4210
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4211
  HeapWord* block = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4212
  // 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
  4213
  // already assigned a new gc_alloc_region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4214
  if (alloc_region != _gc_alloc_regions[purpose]) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4215
    assert(par, "But should only happen in parallel case.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4216
    alloc_region = _gc_alloc_regions[purpose];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4217
    if (alloc_region == NULL) return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4218
    block = alloc_region->par_allocate(word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4219
    if (block != NULL) return block;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4220
    // Otherwise, continue; this new region is empty, too.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4221
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4222
  assert(alloc_region != NULL, "We better have an allocation region");
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4223
  retire_alloc_region(alloc_region, par);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4224
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4225
  if (_gc_alloc_region_counts[purpose] >= g1_policy()->max_regions(purpose)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4226
    // Cannot allocate more regions for the given purpose.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4227
    GCAllocPurpose alt_purpose = g1_policy()->alternative_purpose(purpose);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4228
    // Is there an alternative?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4229
    if (purpose != alt_purpose) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4230
      HeapRegion* alt_region = _gc_alloc_regions[alt_purpose];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4231
      // Has not the alternative region been aliased?
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4232
      if (alloc_region != alt_region && alt_region != NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4233
        // Try to allocate in the alternative region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4234
        if (par) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4235
          block = alt_region->par_allocate(word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4236
        } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4237
          block = alt_region->allocate(word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4238
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4239
        // Make an alias.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4240
        _gc_alloc_regions[purpose] = _gc_alloc_regions[alt_purpose];
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4241
        if (block != NULL) {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4242
          return block;
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4243
        }
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4244
        retire_alloc_region(alt_region, par);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4245
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4246
      // Both the allocation region and the alternative one are full
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4247
      // and aliased, replace them with a new allocation region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4248
      purpose = alt_purpose;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4249
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4250
      set_gc_alloc_region(purpose, NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4251
      return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4252
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4253
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4254
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4255
  // Now allocate a new region for allocation.
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4256
  alloc_region = new_gc_alloc_region(purpose, word_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4257
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4258
  // let the caller handle alloc failure
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4259
  if (alloc_region != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4260
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4261
    assert(check_gc_alloc_regions(), "alloc regions messed up");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4262
    assert(alloc_region->saved_mark_at_top(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4263
           "Mark should have been saved already.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4264
    // 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
  4265
    // allocate in it (without holding the lock.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4266
    set_gc_alloc_region(purpose, alloc_region);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4267
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4268
    if (par) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4269
      block = alloc_region->par_allocate(word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4270
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4271
      block = alloc_region->allocate(word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4272
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4273
    // Caller handles alloc failure.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4274
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4275
    // 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
  4276
    set_gc_alloc_region(purpose, NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4277
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4278
  return block;  // May be NULL.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4279
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4280
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4281
void G1CollectedHeap::par_allocate_remaining_space(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4282
  HeapWord* block = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4283
  size_t free_words;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4284
  do {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4285
    free_words = r->free()/HeapWordSize;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4286
    // 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
  4287
    if (free_words < CollectedHeap::min_fill_size()) return;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4288
    // Otherwise, try to claim it.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4289
    block = r->par_allocate(free_words);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4290
  } while (block == NULL);
1668
8ec481b8f514 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 1610
diff changeset
  4291
  fill_with_object(block, free_words);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4292
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4293
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4294
#ifndef PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4295
bool GCLabBitMapClosure::do_bit(size_t offset) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4296
  HeapWord* addr = _bitmap->offsetToHeapWord(offset);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4297
  guarantee(_cm->isMarked(oop(addr)), "it should be!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4298
  return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4299
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4300
#endif // PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4301
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4302
G1ParScanThreadState::G1ParScanThreadState(G1CollectedHeap* g1h, int queue_num)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4303
  : _g1h(g1h),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4304
    _refs(g1h->task_queue(queue_num)),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4305
    _dcq(&g1h->dirty_card_queue_set()),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4306
    _ct_bs((CardTableModRefBS*)_g1h->barrier_set()),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4307
    _g1_rem(g1h->g1_rem_set()),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4308
    _hash_seed(17), _queue_num(queue_num),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4309
    _term_attempts(0),
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4310
    _surviving_alloc_buffer(g1h->desired_plab_sz(GCAllocForSurvived)),
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4311
    _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
  4312
    _age_table(false),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4313
    _strong_roots_time(0), _term_time(0),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4314
    _alloc_buffer_waste(0), _undo_waste(0)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4315
{
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4316
  // we allocate G1YoungSurvRateNumRegions plus one entries, since
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4317
  // 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
  4318
  // non-young regions (where the age is -1)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4319
  // 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
  4320
  // an attempt to eliminate cache contention
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4321
  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
  4322
  size_t array_length = PADDING_ELEM_NUM +
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4323
                        real_length +
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4324
                        PADDING_ELEM_NUM;
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4325
  _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
  4326
  if (_surviving_young_words_base == NULL)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4327
    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
  4328
                          "Not enough space for young surv histo.");
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4329
  _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
  4330
  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
  4331
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4332
  _alloc_buffers[GCAllocForSurvived] = &_surviving_alloc_buffer;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4333
  _alloc_buffers[GCAllocForTenured]  = &_tenured_alloc_buffer;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4334
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4335
  _start = os::elapsedTime();
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4336
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4337
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4338
void
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4339
G1ParScanThreadState::print_termination_stats_hdr(outputStream* const st)
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4340
{
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4341
  st->print_raw_cr("GC Termination Stats");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4342
  st->print_raw_cr("     elapsed  --strong roots-- -------termination-------"
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4343
                   " ------waste (KiB)------");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4344
  st->print_raw_cr("thr     ms        ms      %        ms      %    attempts"
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4345
                   "  total   alloc    undo");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4346
  st->print_raw_cr("--- --------- --------- ------ --------- ------ --------"
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4347
                   " ------- ------- -------");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4348
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4349
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4350
void
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4351
G1ParScanThreadState::print_termination_stats(int i,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4352
                                              outputStream* const st) const
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4353
{
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4354
  const double elapsed_ms = elapsed_time() * 1000.0;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4355
  const double s_roots_ms = strong_roots_time() * 1000.0;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4356
  const double term_ms    = term_time() * 1000.0;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4357
  st->print_cr("%3d %9.2f %9.2f %6.2f "
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4358
               "%9.2f %6.2f " SIZE_FORMAT_W(8) " "
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4359
               SIZE_FORMAT_W(7) " " SIZE_FORMAT_W(7) " " SIZE_FORMAT_W(7),
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4360
               i, elapsed_ms, s_roots_ms, s_roots_ms * 100 / elapsed_ms,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4361
               term_ms, term_ms * 100 / elapsed_ms, term_attempts(),
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4362
               (alloc_buffer_waste() + undo_waste()) * HeapWordSize / K,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4363
               alloc_buffer_waste() * HeapWordSize / K,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4364
               undo_waste() * HeapWordSize / K);
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4365
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4366
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4367
#ifdef ASSERT
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4368
bool G1ParScanThreadState::verify_ref(narrowOop* ref) const {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4369
  assert(ref != NULL, "invariant");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4370
  assert(UseCompressedOops, "sanity");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4371
  assert(!has_partial_array_mask(ref), err_msg("ref=" PTR_FORMAT, ref));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4372
  oop p = oopDesc::load_decode_heap_oop(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4373
  assert(_g1h->is_in_g1_reserved(p),
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4374
         err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4375
  return true;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4376
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4377
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4378
bool G1ParScanThreadState::verify_ref(oop* ref) const {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4379
  assert(ref != NULL, "invariant");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4380
  if (has_partial_array_mask(ref)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4381
    // Must be in the collection set--it's already been copied.
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4382
    oop p = clear_partial_array_mask(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4383
    assert(_g1h->obj_in_cs(p),
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4384
           err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4385
  } else {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4386
    oop p = oopDesc::load_decode_heap_oop(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4387
    assert(_g1h->is_in_g1_reserved(p),
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4388
           err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4389
  }
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4390
  return true;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4391
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4392
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4393
bool G1ParScanThreadState::verify_task(StarTask ref) const {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4394
  if (ref.is_narrow()) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4395
    return verify_ref((narrowOop*) ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4396
  } else {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4397
    return verify_ref((oop*) ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4398
  }
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4399
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4400
#endif // ASSERT
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4401
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4402
void G1ParScanThreadState::trim_queue() {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4403
  StarTask ref;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4404
  do {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4405
    // Drain the overflow stack first, so other threads can steal.
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4406
    while (refs()->pop_overflow(ref)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4407
      deal_with_reference(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4408
    }
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4409
    while (refs()->pop_local(ref)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4410
      deal_with_reference(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4411
    }
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4412
  } while (!refs()->is_empty());
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4413
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4414
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4415
G1ParClosureSuper::G1ParClosureSuper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4416
  _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
  4417
  _par_scan_state(par_scan_state) { }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4418
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4419
template <class T> void G1ParCopyHelper::mark_forwardee(T* p) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4420
  // 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
  4421
  // 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
  4422
  // to its new location.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4423
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4424
  T heap_oop = oopDesc::load_heap_oop(p);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4425
  if (!oopDesc::is_null(heap_oop)) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4426
    oop obj = oopDesc::decode_heap_oop(heap_oop);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4427
    assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj)),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4428
           "shouldn't still be in the CSet if evacuation didn't fail.");
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4429
    HeapWord* addr = (HeapWord*)obj;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4430
    if (_g1->is_in_g1_reserved(addr))
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4431
      _cm->grayRoot(oop(addr));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4432
  }
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4435
oop G1ParCopyHelper::copy_to_survivor_space(oop old) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4436
  size_t    word_sz = old->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4437
  HeapRegion* from_region = _g1->heap_region_containing_raw(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4438
  // +1 to make the -1 indexes valid...
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4439
  int       young_index = from_region->young_index_in_cset()+1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4440
  assert( (from_region->is_young() && young_index > 0) ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4441
          (!from_region->is_young() && young_index == 0), "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4442
  G1CollectorPolicy* g1p = _g1->g1_policy();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4443
  markOop m = old->mark();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4444
  int age = m->has_displaced_mark_helper() ? m->displaced_mark_helper()->age()
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4445
                                           : m->age();
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4446
  GCAllocPurpose alloc_purpose = g1p->evacuation_destination(from_region, age,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4447
                                                             word_sz);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4448
  HeapWord* obj_ptr = _par_scan_state->allocate(alloc_purpose, word_sz);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4449
  oop       obj     = oop(obj_ptr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4450
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4451
  if (obj_ptr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4452
    // 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
  4453
    // installed a forwarding pointer.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4454
    OopsInHeapRegionClosure* cl = _par_scan_state->evac_failure_closure();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4455
    return _g1->handle_evacuation_failure_par(cl, old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4456
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4457
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4458
  // We're going to allocate linearly, so might as well prefetch ahead.
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4459
  Prefetch::write(obj_ptr, PrefetchCopyIntervalInBytes);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4460
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4461
  oop forward_ptr = old->forward_to_atomic(obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4462
  if (forward_ptr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4463
    Copy::aligned_disjoint_words((HeapWord*) old, obj_ptr, word_sz);
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4464
    if (g1p->track_object_age(alloc_purpose)) {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4465
      // We could simply do obj->incr_age(). However, this causes a
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4466
      // performance issue. obj->incr_age() will first check whether
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4467
      // the object has a displaced mark by checking its mark word;
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4468
      // getting the mark word from the new location of the object
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4469
      // stalls. So, given that we already have the mark word and we
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4470
      // are about to install it anyway, it's better to increase the
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4471
      // age on the mark word, when the object does not have a
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4472
      // displaced mark word. We're not expecting many objects to have
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4473
      // a displaced marked word, so that case is not optimized
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4474
      // further (it could be...) and we simply call obj->incr_age().
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4475
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4476
      if (m->has_displaced_mark_helper()) {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4477
        // in this case, we have to install the mark word first,
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4478
        // otherwise obj looks to be forwarded (the old mark word,
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4479
        // which contains the forward pointer, was copied)
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4480
        obj->set_mark(m);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4481
        obj->incr_age();
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4482
      } else {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4483
        m = m->incr_age();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4484
        obj->set_mark(m);
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4485
      }
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4486
      _par_scan_state->age_table()->add(obj, word_sz);
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4487
    } else {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4488
      obj->set_mark(m);
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
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4491
    // preserve "next" mark bit
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4492
    if (_g1->mark_in_progress() && !_g1->is_obj_ill(old)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4493
      if (!use_local_bitmaps ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4494
          !_par_scan_state->alloc_buffer(alloc_purpose)->mark(obj_ptr)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4495
        // 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
  4496
        // 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
  4497
        // the bullet and do the standard parallel mark
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4498
        _cm->markAndGrayObjectIfNecessary(obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4499
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4500
#if 1
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4501
      if (_g1->isMarkedNext(old)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4502
        _cm->nextMarkBitMap()->parClear((HeapWord*)old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4503
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4504
#endif
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4507
    size_t* surv_young_words = _par_scan_state->surviving_young_words();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4508
    surv_young_words[young_index] += word_sz;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4509
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4510
    if (obj->is_objArray() && arrayOop(obj)->length() >= ParGCArrayScanChunk) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4511
      arrayOop(old)->set_length(0);
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4512
      oop* old_p = set_partial_array_mask(old);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4513
      _par_scan_state->push_on_queue(old_p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4514
    } else {
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4515
      // No point in using the slower heap_region_containing() method,
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4516
      // given that we know obj is in the heap.
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4517
      _scanner->set_region(_g1->heap_region_containing_raw(obj));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4518
      obj->oop_iterate_backwards(_scanner);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4519
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4520
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4521
    _par_scan_state->undo_allocation(alloc_purpose, obj_ptr, word_sz);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4522
    obj = forward_ptr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4523
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4524
  return obj;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4525
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4526
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4527
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
  4528
template <class T>
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4529
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
  4530
::do_oop_work(T* p) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4531
  oop obj = oopDesc::load_decode_heap_oop(p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4532
  assert(barrier != G1BarrierRS || obj != NULL,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4533
         "Precondition: G1BarrierRS implies obj is nonNull");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4534
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4535
  // 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
  4536
  if (_g1->in_cset_fast_test(obj)) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4537
#if G1_REM_SET_LOGGING
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4538
    gclog_or_tty->print_cr("Loc "PTR_FORMAT" contains pointer "PTR_FORMAT" "
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4539
                           "into CS.", p, (void*) obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4540
#endif
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4541
    if (obj->is_forwarded()) {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4542
      oopDesc::encode_store_heap_oop(p, obj->forwardee());
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4543
    } else {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4544
      oop copy_oop = copy_to_survivor_space(obj);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4545
      oopDesc::encode_store_heap_oop(p, copy_oop);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4546
    }
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4547
    // When scanning the RS, we only care about objs in CS.
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4548
    if (barrier == G1BarrierRS) {
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4549
      _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
  4550
    }
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4551
  }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4552
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4553
  if (barrier == G1BarrierEvac && obj != NULL) {
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4554
    _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
  4555
  }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4556
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4557
  if (do_gen_barrier && obj != NULL) {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4558
    par_do_barrier(p);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4559
  }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4560
}
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4561
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4562
template void G1ParCopyClosure<false, G1BarrierEvac, false>::do_oop_work(oop* p);
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4563
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
  4564
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4565
template <class T> void G1ParScanPartialArrayClosure::do_oop_nv(T* p) {
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4566
  assert(has_partial_array_mask(p), "invariant");
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4567
  oop old = clear_partial_array_mask(p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4568
  assert(old->is_objArray(), "must be obj array");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4569
  assert(old->is_forwarded(), "must be forwarded");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4570
  assert(Universe::heap()->is_in_reserved(old), "must be in heap.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4571
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4572
  objArrayOop obj = objArrayOop(old->forwardee());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4573
  assert((void*)old != (void*)old->forwardee(), "self forwarding here?");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4574
  // Process ParGCArrayScanChunk elements now
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4575
  // and push the remainder back onto queue
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4576
  int start     = arrayOop(old)->length();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4577
  int end       = obj->length();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4578
  int remainder = end - start;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4579
  assert(start <= end, "just checking");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4580
  if (remainder > 2 * ParGCArrayScanChunk) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4581
    // Test above combines last partial chunk with a full chunk
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4582
    end = start + ParGCArrayScanChunk;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4583
    arrayOop(old)->set_length(end);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4584
    // Push remainder.
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4585
    oop* old_p = set_partial_array_mask(old);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4586
    assert(arrayOop(old)->length() < obj->length(), "Empty push?");
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4587
    _par_scan_state->push_on_queue(old_p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4588
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4589
    // Restore length so that the heap remains parsable in
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4590
    // case of evacuation failure.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4591
    arrayOop(old)->set_length(end);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4592
  }
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4593
  _scanner.set_region(_g1->heap_region_containing_raw(obj));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4594
  // 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
  4595
  obj->oop_iterate_range(&_scanner, start, end);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4596
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4597
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4598
class G1ParEvacuateFollowersClosure : public VoidClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4599
protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4600
  G1CollectedHeap*              _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4601
  G1ParScanThreadState*         _par_scan_state;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4602
  RefToScanQueueSet*            _queues;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4603
  ParallelTaskTerminator*       _terminator;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4604
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4605
  G1ParScanThreadState*   par_scan_state() { return _par_scan_state; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4606
  RefToScanQueueSet*      queues()         { return _queues; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4607
  ParallelTaskTerminator* terminator()     { return _terminator; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4608
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4609
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4610
  G1ParEvacuateFollowersClosure(G1CollectedHeap* g1h,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4611
                                G1ParScanThreadState* par_scan_state,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4612
                                RefToScanQueueSet* queues,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4613
                                ParallelTaskTerminator* terminator)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4614
    : _g1h(g1h), _par_scan_state(par_scan_state),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4615
      _queues(queues), _terminator(terminator) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4616
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4617
  void do_void();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4618
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4619
private:
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4620
  inline bool offer_termination();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4621
};
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4622
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4623
bool G1ParEvacuateFollowersClosure::offer_termination() {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4624
  G1ParScanThreadState* const pss = par_scan_state();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4625
  pss->start_term_time();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4626
  const bool res = terminator()->offer_termination();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4627
  pss->end_term_time();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4628
  return res;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4629
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4630
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4631
void G1ParEvacuateFollowersClosure::do_void() {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4632
  StarTask stolen_task;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4633
  G1ParScanThreadState* const pss = par_scan_state();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4634
  pss->trim_queue();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4635
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4636
  do {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4637
    while (queues()->steal(pss->queue_num(), pss->hash_seed(), stolen_task)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4638
      assert(pss->verify_task(stolen_task), "sanity");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4639
      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
  4640
        pss->deal_with_reference((narrowOop*) stolen_task);
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4641
      } else {
6980
d19831e79825 6990359: G1: don't push a stolen entry on the taskqueue, deal with it directly
tonyp
parents: 6959
diff changeset
  4642
        pss->deal_with_reference((oop*) stolen_task);
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4643
      }
6980
d19831e79825 6990359: G1: don't push a stolen entry on the taskqueue, deal with it directly
tonyp
parents: 6959
diff changeset
  4644
d19831e79825 6990359: G1: don't push a stolen entry on the taskqueue, deal with it directly
tonyp
parents: 6959
diff changeset
  4645
      // 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
  4646
      // 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
  4647
      // we drain the queues as necessary.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4648
      pss->trim_queue();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4649
    }
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4650
  } while (!offer_termination());
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4651
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4652
  pss->retire_alloc_buffers();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4653
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4654
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4655
class G1ParTask : public AbstractGangTask {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4656
protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4657
  G1CollectedHeap*       _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4658
  RefToScanQueueSet      *_queues;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4659
  ParallelTaskTerminator _terminator;
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4660
  int _n_workers;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4661
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4662
  Mutex _stats_lock;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4663
  Mutex* stats_lock() { return &_stats_lock; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4664
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4665
  size_t getNCards() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4666
    return (_g1h->capacity() + G1BlockOffsetSharedArray::N_bytes - 1)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4667
      / G1BlockOffsetSharedArray::N_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4668
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4669
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4670
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4671
  G1ParTask(G1CollectedHeap* g1h, int workers, RefToScanQueueSet *task_queues)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4672
    : AbstractGangTask("G1 collection"),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4673
      _g1h(g1h),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4674
      _queues(task_queues),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4675
      _terminator(workers, _queues),
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4676
      _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
  4677
      _n_workers(workers)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4678
  {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4679
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4680
  RefToScanQueueSet* queues() { return _queues; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4681
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4682
  RefToScanQueue *work_queue(int i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4683
    return queues()->queue(i);
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4686
  void work(int i) {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4687
    if (i >= _n_workers) return;  // no work needed this round
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4688
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4689
    double start_time_ms = os::elapsedTime() * 1000.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4690
    _g1h->g1_policy()->record_gc_worker_start_time(i, start_time_ms);
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4691
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4692
    ResourceMark rm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4693
    HandleMark   hm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4694
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4695
    G1ParScanThreadState            pss(_g1h, i);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4696
    G1ParScanHeapEvacClosure        scan_evac_cl(_g1h, &pss);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4697
    G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4698
    G1ParScanPartialArrayClosure    partial_scan_cl(_g1h, &pss);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4699
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4700
    pss.set_evac_closure(&scan_evac_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4701
    pss.set_evac_failure_closure(&evac_failure_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4702
    pss.set_partial_scan_closure(&partial_scan_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4703
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4704
    G1ParScanExtRootClosure         only_scan_root_cl(_g1h, &pss);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4705
    G1ParScanPermClosure            only_scan_perm_cl(_g1h, &pss);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4706
    G1ParScanHeapRSClosure          only_scan_heap_rs_cl(_g1h, &pss);
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4707
    G1ParPushHeapRSClosure          push_heap_rs_cl(_g1h, &pss);
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4708
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4709
    G1ParScanAndMarkExtRootClosure  scan_mark_root_cl(_g1h, &pss);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4710
    G1ParScanAndMarkPermClosure     scan_mark_perm_cl(_g1h, &pss);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4711
    G1ParScanAndMarkHeapRSClosure   scan_mark_heap_rs_cl(_g1h, &pss);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4712
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4713
    OopsInHeapRegionClosure        *scan_root_cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4714
    OopsInHeapRegionClosure        *scan_perm_cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4715
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  4716
    if (_g1h->g1_policy()->during_initial_mark_pause()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4717
      scan_root_cl = &scan_mark_root_cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4718
      scan_perm_cl = &scan_mark_perm_cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4719
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4720
      scan_root_cl = &only_scan_root_cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4721
      scan_perm_cl = &only_scan_perm_cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4722
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4723
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4724
    pss.start_strong_roots();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4725
    _g1h->g1_process_strong_roots(/* not collecting perm */ false,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4726
                                  SharedHeap::SO_AllClasses,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4727
                                  scan_root_cl,
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4728
                                  &push_heap_rs_cl,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4729
                                  scan_perm_cl,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4730
                                  i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4731
    pss.end_strong_roots();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4732
    {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4733
      double start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4734
      G1ParEvacuateFollowersClosure evac(_g1h, &pss, _queues, &_terminator);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4735
      evac.do_void();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4736
      double elapsed_ms = (os::elapsedTime()-start)*1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4737
      double term_ms = pss.term_time()*1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4738
      _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
  4739
      _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
  4740
    }
5033
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
  4741
    _g1h->g1_policy()->record_thread_age_table(pss.age_table());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4742
    _g1h->update_surviving_young_words(pss.surviving_young_words()+1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4743
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4744
    // Clean up any par-expanded rem sets.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4745
    HeapRegionRemSet::par_cleanup();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4746
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4747
    if (ParallelGCVerbose) {
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4748
      MutexLocker x(stats_lock());
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4749
      pss.print_termination_stats(i);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4750
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4751
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4752
    assert(pss.refs()->is_empty(), "should be empty");
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4753
    double end_time_ms = os::elapsedTime() * 1000.0;
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4754
    _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
  4755
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4756
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4757
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4758
// *** Common G1 Evacuation Stuff
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4759
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  4760
// This method is run in a GC worker.
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  4761
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4762
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4763
G1CollectedHeap::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4764
g1_process_strong_roots(bool collecting_perm_gen,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4765
                        SharedHeap::ScanningOption so,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4766
                        OopClosure* scan_non_heap_roots,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4767
                        OopsInHeapRegionClosure* scan_rs,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4768
                        OopsInGenClosure* scan_perm,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4769
                        int worker_i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4770
  // First scan the strong roots, including the perm gen.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4771
  double ext_roots_start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4772
  double closure_app_time_sec = 0.0;
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
  BufferingOopClosure buf_scan_non_heap_roots(scan_non_heap_roots);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4775
  BufferingOopsInGenClosure buf_scan_perm(scan_perm);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4776
  buf_scan_perm.set_generation(perm_gen());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4777
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4778
  // 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
  4779
  // unaligned oop locations.
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4780
  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
  4781
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4782
  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
  4783
                       collecting_perm_gen, so,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4784
                       &buf_scan_non_heap_roots,
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4785
                       &eager_scan_code_roots,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4786
                       &buf_scan_perm);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  4787
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4788
  // Finish up any enqueued closure apps.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4789
  buf_scan_non_heap_roots.done();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4790
  buf_scan_perm.done();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4791
  double ext_roots_end = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4792
  g1_policy()->reset_obj_copy_time(worker_i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4793
  double obj_copy_time_sec =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4794
    buf_scan_non_heap_roots.closure_app_seconds() +
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4795
    buf_scan_perm.closure_app_seconds();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4796
  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
  4797
  double ext_root_time_ms =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4798
    ((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
  4799
  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
  4800
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4801
  // Scan strong roots in mark stack.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4802
  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
  4803
    concurrent_mark()->oops_do(scan_non_heap_roots);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4804
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4805
  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
  4806
  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
  4807
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4808
  // XXX What should this be doing in the parallel case?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4809
  g1_policy()->record_collection_pause_end_CH_strong_roots();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4810
  // Now scan the complement of the collection set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4811
  if (scan_rs != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4812
    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
  4813
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4814
  // Finish with the ref_processor roots.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4815
  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
  4816
    // 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
  4817
    // 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
  4818
    // 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
  4819
    ref_processor()->weak_oops_do(scan_non_heap_roots);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4820
    ref_processor()->oops_do(scan_non_heap_roots);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4821
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4822
  g1_policy()->record_collection_pause_end_G1_strong_roots();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4823
  _process_strong_tasks->all_tasks_completed();
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4826
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4827
G1CollectedHeap::g1_process_weak_roots(OopClosure* root_closure,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4828
                                       OopClosure* non_root_closure) {
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4829
  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
  4830
  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
  4831
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4832
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4833
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4834
class SaveMarksClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4835
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4836
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4837
    r->save_marks();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4838
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4839
  }
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4842
void G1CollectedHeap::save_marks() {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  4843
  if (!CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4844
    SaveMarksClosure sm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4845
    heap_region_iterate(&sm);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4846
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4847
  // We do this even in the parallel case
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4848
  perm_gen()->save_marks();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4849
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4850
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4851
void G1CollectedHeap::evacuate_collection_set() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4852
  set_evacuation_failed(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4853
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4854
  g1_rem_set()->prepare_for_oops_into_collection_set_do();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4855
  concurrent_g1_refine()->set_use_cache(false);
3589
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  4856
  concurrent_g1_refine()->clear_hot_cache_claimed_index();
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  4857
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4858
  int n_workers = (ParallelGCThreads > 0 ? workers()->total_workers() : 1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4859
  set_par_threads(n_workers);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4860
  G1ParTask g1_par_task(this, n_workers, _task_queues);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4861
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4862
  init_for_evac_failure(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4863
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4864
  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
  4865
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4866
  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
  4867
  double start_par = os::elapsedTime();
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  4868
  if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4869
    // 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
  4870
    StrongRootsScope srs(this);
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4871
    if (ParallelGCVerbose) G1ParScanThreadState::print_termination_stats_hdr();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4872
    workers()->run_task(&g1_par_task);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4873
  } else {
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  4874
    StrongRootsScope srs(this);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4875
    g1_par_task.work(0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4876
  }
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
  double par_time = (os::elapsedTime() - start_par) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4879
  g1_policy()->record_par_time(par_time);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4880
  set_par_threads(0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4881
  // 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
  4882
  // on individual heap regions when we allocate from
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4883
  // them in parallel, so this seems like the correct place for this.
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4884
  retire_all_alloc_regions();
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  4885
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  4886
  // Weak root processing.
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  4887
  // 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
  4888
  // 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
  4889
  // here too.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4890
  {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4891
    G1IsAliveClosure is_alive(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4892
    G1KeepAliveClosure keep_alive(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4893
    JNIHandles::weak_oops_do(&is_alive, &keep_alive);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4894
  }
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  4895
  release_gc_alloc_regions(false /* totally */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4896
  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
  4897
3589
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  4898
  concurrent_g1_refine()->clear_hot_cache();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4899
  concurrent_g1_refine()->set_use_cache(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4900
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4901
  finalize_for_evac_failure();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4902
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4903
  // Must do this before removing self-forwarding pointers, which clears
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4904
  // the per-region evac-failure flags.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4905
  concurrent_mark()->complete_marking_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4906
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4907
  if (evacuation_failed()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4908
    remove_self_forwarding_pointers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4909
    if (PrintGCDetails) {
6261
1fe3e07abdb4 6975964: G1: print out a more descriptive message for evacuation failure when +PrintGCDetails is set
tonyp
parents: 6260
diff changeset
  4910
      gclog_or_tty->print(" (to-space overflow)");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4911
    } else if (PrintGC) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4912
      gclog_or_tty->print("--");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4913
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4914
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4915
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4916
  if (G1DeferredRSUpdate) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4917
    RedirtyLoggedCardTableEntryFastClosure redirty;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4918
    dirty_card_queue_set().set_closure(&redirty);
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4919
    dirty_card_queue_set().apply_closure_to_all_completed_buffers();
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  4920
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  4921
    DirtyCardQueueSet& dcq = JavaThread::dirty_card_queue_set();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  4922
    dcq.merge_bufferlists(&dirty_card_queue_set());
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4923
    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
  4924
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4925
  COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4926
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4927
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4928
void G1CollectedHeap::free_region_if_totally_empty(HeapRegion* hr,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4929
                                     size_t* pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4930
                                     FreeRegionList* free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4931
                                     HumongousRegionSet* humongous_proxy_set,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4932
                                     bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4933
  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
  4934
    if (hr->isHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4935
      assert(hr->startsHumongous(), "we should only see starts humongous");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4936
      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
  4937
    } else {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4938
      free_region(hr, pre_used, free_list, par);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4939
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4940
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4941
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4942
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4943
void G1CollectedHeap::free_region(HeapRegion* hr,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4944
                                  size_t* pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4945
                                  FreeRegionList* free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4946
                                  bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4947
  assert(!hr->isHumongous(), "this is only for non-humongous regions");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4948
  assert(!hr->is_empty(), "the region should not be empty");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4949
  assert(free_list != NULL, "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4950
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4951
  *pre_used += hr->used();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4952
  hr->hr_clear(par, true /* clear_space */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4953
  free_list->add_as_tail(hr);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4954
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4955
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4956
void G1CollectedHeap::free_humongous_region(HeapRegion* hr,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4957
                                     size_t* pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4958
                                     FreeRegionList* free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4959
                                     HumongousRegionSet* humongous_proxy_set,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4960
                                     bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4961
  assert(hr->startsHumongous(), "this is only for starts humongous regions");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4962
  assert(free_list != NULL, "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4963
  assert(humongous_proxy_set != NULL, "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4964
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4965
  size_t hr_used = hr->used();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4966
  size_t hr_capacity = hr->capacity();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4967
  size_t hr_pre_used = 0;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4968
  _humongous_set.remove_with_proxy(hr, humongous_proxy_set);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4969
  hr->set_notHumongous();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4970
  free_region(hr, &hr_pre_used, free_list, par);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4971
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4972
  int i = hr->hrs_index() + 1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4973
  size_t num = 1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4974
  while ((size_t) i < n_regions()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4975
    HeapRegion* curr_hr = _hrs->at(i);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4976
    if (!curr_hr->continuesHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4977
      break;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4978
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4979
    curr_hr->set_notHumongous();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4980
    free_region(curr_hr, &hr_pre_used, free_list, par);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4981
    num += 1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4982
    i += 1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4983
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4984
  assert(hr_pre_used == hr_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4985
         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
  4986
                 "should be the same", hr_pre_used, hr_used));
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4987
  *pre_used += hr_pre_used;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4988
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4989
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4990
void G1CollectedHeap::update_sets_after_freeing_regions(size_t pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4991
                                       FreeRegionList* free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4992
                                       HumongousRegionSet* humongous_proxy_set,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4993
                                       bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4994
  if (pre_used > 0) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4995
    Mutex* lock = (par) ? ParGCRareEvent_lock : NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4996
    MutexLockerEx x(lock, Mutex::_no_safepoint_check_flag);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4997
    assert(_summary_bytes_used >= pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4998
           err_msg("invariant: _summary_bytes_used: "SIZE_FORMAT" "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  4999
                   "should be >= pre_used: "SIZE_FORMAT,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5000
                   _summary_bytes_used, pre_used));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5001
    _summary_bytes_used -= pre_used;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5002
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5003
  if (free_list != NULL && !free_list->is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5004
    MutexLockerEx x(FreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5005
    _free_list.add_as_tail(free_list);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5006
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5007
  if (humongous_proxy_set != NULL && !humongous_proxy_set->is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5008
    MutexLockerEx x(OldSets_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5009
    _humongous_set.update_from_proxy(humongous_proxy_set);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5010
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5011
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5012
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5013
void G1CollectedHeap::dirtyCardsForYoungRegions(CardTableModRefBS* ct_bs, HeapRegion* list) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5014
  while (list != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5015
    guarantee( list->is_young(), "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5016
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5017
    HeapWord* bottom = list->bottom();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5018
    HeapWord* end = list->end();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5019
    MemRegion mr(bottom, end);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5020
    ct_bs->dirty(mr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5021
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5022
    list = list->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5023
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5024
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5025
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5026
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5027
class G1ParCleanupCTTask : public AbstractGangTask {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5028
  CardTableModRefBS* _ct_bs;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5029
  G1CollectedHeap* _g1h;
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5030
  HeapRegion* volatile _su_head;
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5031
public:
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5032
  G1ParCleanupCTTask(CardTableModRefBS* ct_bs,
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5033
                     G1CollectedHeap* g1h,
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5034
                     HeapRegion* survivor_list) :
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5035
    AbstractGangTask("G1 Par Cleanup CT Task"),
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5036
    _ct_bs(ct_bs),
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5037
    _g1h(g1h),
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5038
    _su_head(survivor_list)
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5039
  { }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5040
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5041
  void work(int i) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5042
    HeapRegion* r;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5043
    while (r = _g1h->pop_dirty_cards_region()) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5044
      clear_cards(r);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5045
    }
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5046
    // Redirty the cards of the survivor regions.
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5047
    dirty_list(&this->_su_head);
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5048
  }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5049
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5050
  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
  5051
    // 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
  5052
    if (!r->is_survivor()) {
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5053
      _ct_bs->clear(MemRegion(r->bottom(), r->end()));
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5054
    }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5055
  }
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5056
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5057
  void dirty_list(HeapRegion* volatile * head_ptr) {
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5058
    HeapRegion* head;
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5059
    do {
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5060
      // Pop region off the list.
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5061
      head = *head_ptr;
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5062
      if (head != NULL) {
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5063
        HeapRegion* r = (HeapRegion*)
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5064
          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
  5065
        if (r == head) {
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5066
          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
  5067
          _ct_bs->dirty(MemRegion(r->bottom(), r->end()));
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5068
        }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5069
      }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5070
    } while (*head_ptr != NULL);
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5071
  }
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5072
};
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5073
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5074
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5075
#ifndef PRODUCT
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5076
class G1VerifyCardTableCleanup: public HeapRegionClosure {
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5077
  CardTableModRefBS* _ct_bs;
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5078
public:
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5079
  G1VerifyCardTableCleanup(CardTableModRefBS* ct_bs)
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5080
    : _ct_bs(ct_bs)
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5081
  { }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5082
  virtual bool doHeapRegion(HeapRegion* r)
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5083
  {
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5084
    MemRegion mr(r->bottom(), r->end());
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5085
    if (r->is_survivor()) {
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5086
      _ct_bs->verify_dirty_region(mr);
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5087
    } else {
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5088
      _ct_bs->verify_clean_region(mr);
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5089
    }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5090
    return false;
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5091
  }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5092
};
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5093
#endif
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5094
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5095
void G1CollectedHeap::cleanUpCardTable() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5096
  CardTableModRefBS* ct_bs = (CardTableModRefBS*) (barrier_set());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5097
  double start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5098
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5099
  // Iterate over the dirty cards region list.
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5100
  G1ParCleanupCTTask cleanup_task(ct_bs, this,
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5101
                                  _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
  5102
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5103
  if (ParallelGCThreads > 0) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5104
    set_par_threads(workers()->total_workers());
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5105
    workers()->run_task(&cleanup_task);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5106
    set_par_threads(0);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5107
  } else {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5108
    while (_dirty_cards_region_list) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5109
      HeapRegion* r = _dirty_cards_region_list;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5110
      cleanup_task.clear_cards(r);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5111
      _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
  5112
      if (_dirty_cards_region_list == r) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5113
        // The last region.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5114
        _dirty_cards_region_list = NULL;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5115
      }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5116
      r->set_next_dirty_cards_region(NULL);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5117
    }
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5118
    // now, redirty the cards of the survivor regions
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5119
    // (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
  5120
    // all regions and then clearing / dirtying as appropriate)
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5121
    dirtyCardsForYoungRegions(ct_bs, _young_list->first_survivor_region());
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5122
  }
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5123
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5124
  double elapsed = os::elapsedTime() - start;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5125
  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
  5126
#ifndef PRODUCT
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5127
  if (G1VerifyCTCleanup || VerifyAfterGC) {
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5128
    G1VerifyCardTableCleanup cleanup_verifier(ct_bs);
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5129
    heap_region_iterate(&cleanup_verifier);
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5130
  }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5131
#endif
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5132
}
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
void G1CollectedHeap::free_collection_set(HeapRegion* cs_head) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5135
  size_t pre_used = 0;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5136
  FreeRegionList local_free_list("Local List for CSet Freeing");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5137
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5138
  double young_time_ms     = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5139
  double non_young_time_ms = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5140
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5141
  // 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
  5142
  // 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
  5143
  // 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
  5144
  _young_list->clear();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5145
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5146
  G1CollectorPolicy* policy = g1_policy();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5147
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5148
  double start_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5149
  bool non_young = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5150
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5151
  HeapRegion* cur = cs_head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5152
  int age_bound = -1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5153
  size_t rs_lengths = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5154
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5155
  while (cur != NULL) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5156
    assert(!is_on_free_list(cur), "sanity");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5157
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5158
    if (non_young) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5159
      if (cur->is_young()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5160
        double end_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5161
        double elapsed_ms = (end_sec - start_sec) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5162
        non_young_time_ms += elapsed_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5163
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5164
        start_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5165
        non_young = false;
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
    } else {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5168
      double end_sec = os::elapsedTime();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5169
      double elapsed_ms = (end_sec - start_sec) * 1000.0;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5170
      young_time_ms += elapsed_ms;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5171
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5172
      start_sec = os::elapsedTime();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5173
      non_young = true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5174
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5175
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5176
    rs_lengths += cur->rem_set()->occupied();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5177
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5178
    HeapRegion* next = cur->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5179
    assert(cur->in_collection_set(), "bad CS");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5180
    cur->set_next_in_collection_set(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5181
    cur->set_in_collection_set(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5182
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5183
    if (cur->is_young()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5184
      int index = cur->young_index_in_cset();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5185
      guarantee( index != -1, "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5186
      guarantee( (size_t)index < policy->young_cset_length(), "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5187
      size_t words_survived = _surviving_young_words[index];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5188
      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
  5189
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5190
      // 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
  5191
      // (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
  5192
      // 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
  5193
      // _next_young_region field.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5194
      cur->set_next_young_region(NULL);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5195
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5196
      int index = cur->young_index_in_cset();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5197
      guarantee( index == -1, "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5198
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5199
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5200
    assert( (cur->is_young() && cur->young_index_in_cset() > -1) ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5201
            (!cur->is_young() && cur->young_index_in_cset() == -1),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5202
            "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5203
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5204
    if (!cur->evacuation_failed()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5205
      // And the region is empty.
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5206
      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
  5207
      free_region(cur, &pre_used, &local_free_list, false /* par */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5208
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5209
      cur->uninstall_surv_rate_group();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5210
      if (cur->is_young())
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5211
        cur->set_young_index_in_cset(-1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5212
      cur->set_not_young();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5213
      cur->set_evacuation_failed(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5214
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5215
    cur = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5216
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5217
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5218
  policy->record_max_rs_lengths(rs_lengths);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5219
  policy->cset_regions_freed();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5220
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5221
  double end_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5222
  double elapsed_ms = (end_sec - start_sec) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5223
  if (non_young)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5224
    non_young_time_ms += elapsed_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5225
  else
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5226
    young_time_ms += elapsed_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5227
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5228
  update_sets_after_freeing_regions(pre_used, &local_free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5229
                                    NULL /* humongous_proxy_set */,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5230
                                    false /* par */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5231
  policy->record_young_free_cset_time_ms(young_time_ms);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5232
  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
  5233
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5234
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5235
// 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
  5236
// 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
  5237
// 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
  5238
// 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
  5239
// 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
  5240
// 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
  5241
// 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
  5242
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5243
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
  5244
  HeapRegion* cur = cs_head;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5245
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5246
  while (cur != NULL) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5247
    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
  5248
    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
  5249
    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
  5250
    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
  5251
    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
  5252
    cur = next;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5253
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5254
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5255
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5256
void G1CollectedHeap::set_free_regions_coming() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5257
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5258
    gclog_or_tty->print_cr("G1ConcRegionFreeing [cm thread] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5259
                           "setting free regions coming");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5260
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5261
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5262
  assert(!free_regions_coming(), "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5263
  _free_regions_coming = true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5264
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5265
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5266
void G1CollectedHeap::reset_free_regions_coming() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5267
  {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5268
    assert(free_regions_coming(), "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5269
    MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5270
    _free_regions_coming = false;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5271
    SecondaryFreeList_lock->notify_all();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5272
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5273
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5274
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5275
    gclog_or_tty->print_cr("G1ConcRegionFreeing [cm thread] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5276
                           "reset free regions coming");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5277
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5278
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5279
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5280
void G1CollectedHeap::wait_while_free_regions_coming() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5281
  // 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
  5282
  // first before we take the lock.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5283
  if (!free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5284
    return;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5285
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5286
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5287
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5288
    gclog_or_tty->print_cr("G1ConcRegionFreeing [other] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5289
                           "waiting for free regions");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5290
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5291
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5292
  {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5293
    MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5294
    while (free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5295
      SecondaryFreeList_lock->wait(Mutex::_no_safepoint_check_flag);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5296
    }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5297
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5298
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5299
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5300
    gclog_or_tty->print_cr("G1ConcRegionFreeing [other] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5301
                           "done waiting for free regions");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5302
  }
1374
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5305
size_t G1CollectedHeap::n_regions() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5306
  return _hrs->length();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5307
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5308
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5309
size_t G1CollectedHeap::max_regions() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5310
  return
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5311
    (size_t)align_size_up(g1_reserved_obj_bytes(), HeapRegion::GrainBytes) /
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5312
    HeapRegion::GrainBytes;
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5315
void G1CollectedHeap::set_region_short_lived_locked(HeapRegion* hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5316
  assert(heap_lock_held_for_gc(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5317
              "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
  5318
  _young_list->push_region(hr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5319
  g1_policy()->set_region_short_lived(hr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5320
}
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
class NoYoungRegionsClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5323
private:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5324
  bool _success;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5325
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5326
  NoYoungRegionsClosure() : _success(true) { }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5327
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5328
    if (r->is_young()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5329
      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
  5330
                             r->bottom(), r->end());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5331
      _success = false;
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
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5334
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5335
  bool success() { return _success; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5336
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5337
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5338
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
  5339
  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
  5340
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5341
  if (check_heap) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5342
    NoYoungRegionsClosure closure;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5343
    heap_region_iterate(&closure);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5344
    ret = ret && closure.success();
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5347
  return ret;
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
void G1CollectedHeap::empty_young_list() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5351
  assert(heap_lock_held_for_gc(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5352
              "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
  5353
  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
  5354
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5355
  _young_list->empty_list();
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
bool G1CollectedHeap::all_alloc_regions_no_allocs_since_save_marks() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5359
  bool no_allocs = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5360
  for (int ap = 0; ap < GCAllocPurposeCount && no_allocs; ++ap) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5361
    HeapRegion* r = _gc_alloc_regions[ap];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5362
    no_allocs = r == NULL || r->saved_mark_at_top();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5363
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5364
  return no_allocs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5365
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5366
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  5367
void G1CollectedHeap::retire_all_alloc_regions() {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5368
  for (int ap = 0; ap < GCAllocPurposeCount; ++ap) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5369
    HeapRegion* r = _gc_alloc_regions[ap];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5370
    if (r != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5371
      // Check for aliases.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5372
      bool has_processed_alias = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5373
      for (int i = 0; i < ap; ++i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5374
        if (_gc_alloc_regions[i] == r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5375
          has_processed_alias = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5376
          break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5377
        }
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
      if (!has_processed_alias) {
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  5380
        retire_alloc_region(r, false /* par */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5381
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5382
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5383
  }
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 start of full GC.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5387
void G1CollectedHeap::tear_down_region_lists() {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5388
  _free_list.remove_all();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5389
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5390
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5391
class RegionResetter: public HeapRegionClosure {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5392
  G1CollectedHeap* _g1h;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5393
  FreeRegionList _local_free_list;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5394
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5395
public:
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5396
  RegionResetter() : _g1h(G1CollectedHeap::heap()),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5397
                     _local_free_list("Local Free List for RegionResetter") { }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5398
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5399
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5400
    if (r->continuesHumongous()) return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5401
    if (r->top() > r->bottom()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5402
      if (r->top() < r->end()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5403
        Copy::fill_to_words(r->top(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5404
                          pointer_delta(r->end(), r->top()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5405
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5406
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5407
      assert(r->is_empty(), "tautology");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5408
      _local_free_list.add_as_tail(r);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5409
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5410
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5411
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5412
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5413
  void update_free_lists() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5414
    _g1h->update_sets_after_freeing_regions(0, &_local_free_list, NULL,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5415
                                            false /* par */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5416
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5417
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5418
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5419
// Done at the end of full GC.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5420
void G1CollectedHeap::rebuild_region_lists() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5421
  // This needs to go at the end of the full GC.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5422
  RegionResetter rs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5423
  heap_region_iterate(&rs);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5424
  rs.update_free_lists();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5425
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5426
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5427
void G1CollectedHeap::set_refine_cte_cl_concurrency(bool concurrent) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5428
  _refine_cte_cl->set_concurrent(concurrent);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5429
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5430
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5431
#ifdef ASSERT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5432
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5433
bool G1CollectedHeap::is_in_closed_subset(const void* p) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5434
  HeapRegion* hr = heap_region_containing(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5435
  if (hr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5436
    return is_in_permanent(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5437
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5438
    return hr->is_in(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5439
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5440
}
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5441
#endif // ASSERT
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5442
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5443
class VerifyRegionListsClosure : public HeapRegionClosure {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5444
private:
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5445
  HumongousRegionSet* _humongous_set;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5446
  FreeRegionList*     _free_list;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5447
  size_t              _region_count;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5448
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5449
public:
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5450
  VerifyRegionListsClosure(HumongousRegionSet* humongous_set,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5451
                           FreeRegionList* free_list) :
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5452
    _humongous_set(humongous_set), _free_list(free_list),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5453
    _region_count(0) { }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5454
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5455
  size_t region_count()      { return _region_count;      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5456
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5457
  bool doHeapRegion(HeapRegion* hr) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5458
    _region_count += 1;
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
    if (hr->continuesHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5461
      return false;
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
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5464
    if (hr->is_young()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5465
      // TODO
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5466
    } else if (hr->startsHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5467
      _humongous_set->verify_next_region(hr);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5468
    } else if (hr->is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5469
      _free_list->verify_next_region(hr);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5470
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5471
    return false;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5472
  }
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
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5475
void G1CollectedHeap::verify_region_sets() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5476
  assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
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
  // First, check the explicit lists.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5479
  _free_list.verify();
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
    // Given that a concurrent operation might be adding regions to
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5482
    // the secondary free list we have to take the lock before
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5483
    // verifying it.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5484
    MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5485
    _secondary_free_list.verify();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5486
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5487
  _humongous_set.verify();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5488
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5489
  // If a concurrent region freeing operation is in progress it will
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5490
  // be difficult to correctly attributed any free regions we come
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5491
  // 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
  5492
  // one of several (free_list, secondary_free_list, any local lists,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5493
  // 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
  5494
  // verification operation. Alternatively, waiting for the concurrent
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5495
  // 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
  5496
  // operation (no concurrent operation will last longer than the
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5497
  // interval between two calls to verification) and it might hide
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5498
  // any issues that we would like to catch during testing.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5499
  if (free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5500
    return;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5501
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5502
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5503
  {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5504
    MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5505
    // Make sure we append the secondary_free_list on the free_list so
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5506
    // that all free regions we will come across can be safely
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5507
    // attributed to the free_list.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5508
    append_secondary_free_list();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5509
  }
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
}