hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
author johnc
Thu, 09 May 2013 11:16:39 -0700
changeset 17327 4bd0581aa231
parent 17323 cc153b745ed5
child 17396 4d281f3a57bf
permissions -rw-r--r--
7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap Summary: Refactor G1's hot card cache and card counts table into their own files. Simplify the card counts table, including removing the encoding of the card index in each entry. The card counts table now has a 1:1 correspondence with the cards spanned by heap. Space for the card counts table is reserved from virtual memory (rather than C heap) during JVM startup and is committed/expanded when the heap is expanded. Changes were also reviewed-by Vitaly Davidovich. Reviewed-by: tschatzl, jmasa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     1
/*
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
     2
 * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     4
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     7
 * published by the Free Software Foundation.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     8
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    13
 * accompanied this code).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    14
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5542
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5542
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5542
diff changeset
    21
 * questions.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    22
 *
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    23
 */
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    26
#include "code/icBuffer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    27
#include "gc_implementation/g1/bufferingOopClosure.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    28
#include "gc_implementation/g1/concurrentG1Refine.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    29
#include "gc_implementation/g1/concurrentG1RefineThread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    30
#include "gc_implementation/g1/concurrentMarkThread.inline.hpp"
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
    31
#include "gc_implementation/g1/g1AllocRegion.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    32
#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    33
#include "gc_implementation/g1/g1CollectorPolicy.hpp"
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
    34
#include "gc_implementation/g1/g1ErgoVerbose.hpp"
11451
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
    35
#include "gc_implementation/g1/g1EvacFailure.hpp"
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
    36
#include "gc_implementation/g1/g1GCPhaseTimes.hpp"
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12271
diff changeset
    37
#include "gc_implementation/g1/g1Log.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    38
#include "gc_implementation/g1/g1MarkSweep.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    39
#include "gc_implementation/g1/g1OopClosures.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    40
#include "gc_implementation/g1/g1RemSet.inline.hpp"
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
    41
#include "gc_implementation/g1/heapRegion.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    42
#include "gc_implementation/g1/heapRegionRemSet.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    43
#include "gc_implementation/g1/heapRegionSeq.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    44
#include "gc_implementation/g1/vm_operations_g1.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    45
#include "gc_implementation/shared/isGCActiveMark.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    46
#include "memory/gcLocker.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    47
#include "memory/genOopClosures.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    48
#include "memory/generationSpec.hpp"
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
    49
#include "memory/referenceProcessor.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    50
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    51
#include "oops/oop.pcgc.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    52
#include "runtime/aprofiler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    53
#include "runtime/vmThread.hpp"
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    54
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
    55
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
    56
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    57
// 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
    58
// to-be-collected) are printed at "strategic" points before / during
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    59
// / 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
    60
#define YOUNG_LIST_VERBOSE 0
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    61
// CURRENT STATUS
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    62
// This file is under construction.  Search for "FIXME".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    63
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    64
// INVARIANTS/NOTES
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
// All allocation activity covered by the G1CollectedHeap interface is
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    67
// serialized by acquiring the HeapLock.  This happens in mem_allocate
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    68
// and allocate_new_tlab, which are the "entry" points to the
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
    69
// 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
    70
// 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
    71
// is done by clients of this interface.)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    72
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    73
// Notes on implementation of parallelism in different tasks.
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    74
//
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    75
// G1ParVerifyTask uses heap_region_par_iterate_chunked() for parallelism.
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    76
// The number of GC workers is passed to heap_region_par_iterate_chunked().
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    77
// It does use run_task() which sets _n_workers in the task.
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    78
// G1ParTask executes g1_process_strong_roots() ->
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    79
// SharedHeap::process_strong_roots() which calls eventuall to
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    80
// CardTableModRefBS::par_non_clean_card_iterate_work() which uses
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    81
// SequentialSubTasksDone.  SharedHeap::process_strong_roots() also
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    82
// directly uses SubTasksDone (_process_strong_tasks field in SharedHeap).
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    83
//
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
    84
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    85
// Local to this file.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    86
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    87
class RefineCardTableEntryClosure: public CardTableEntryClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    88
  SuspendibleThreadSet* _sts;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    89
  G1RemSet* _g1rs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    90
  ConcurrentG1Refine* _cg1r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    91
  bool _concurrent;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    92
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    93
  RefineCardTableEntryClosure(SuspendibleThreadSet* sts,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    94
                              G1RemSet* g1rs,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    95
                              ConcurrentG1Refine* cg1r) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    96
    _sts(sts), _g1rs(g1rs), _cg1r(cg1r), _concurrent(true)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    97
  {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    98
  bool do_card_ptr(jbyte* card_ptr, int worker_i) {
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
    99
    bool oops_into_cset = _g1rs->refine_card(card_ptr, worker_i, false);
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   100
    // This path is executed by the concurrent refine or mutator threads,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   101
    // 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
   102
    // that point into the collection set.
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   103
    assert(!oops_into_cset, "should be");
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   104
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   105
    if (_concurrent && _sts->should_yield()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   106
      // Caller will actually yield.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   107
      return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   108
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   109
    // Otherwise, we finished successfully; return true.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   110
    return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   111
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   112
  void set_concurrent(bool b) { _concurrent = b; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   113
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   114
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   115
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   116
class ClearLoggedCardTableEntryClosure: public CardTableEntryClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   117
  int _calls;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   118
  G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   119
  CardTableModRefBS* _ctbs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   120
  int _histo[256];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   121
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   122
  ClearLoggedCardTableEntryClosure() :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   123
    _calls(0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   124
  {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   125
    _g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   126
    _ctbs = (CardTableModRefBS*)_g1h->barrier_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   127
    for (int i = 0; i < 256; i++) _histo[i] = 0;
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
  bool do_card_ptr(jbyte* card_ptr, int worker_i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   130
    if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   131
      _calls++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   132
      unsigned char* ujb = (unsigned char*)card_ptr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   133
      int ind = (int)(*ujb);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   134
      _histo[ind]++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   135
      *card_ptr = -1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   136
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   137
    return true;
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
  int calls() { return _calls; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   140
  void print_histo() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   141
    gclog_or_tty->print_cr("Card table value histogram:");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   142
    for (int i = 0; i < 256; i++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   143
      if (_histo[i] != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   144
        gclog_or_tty->print_cr("  %d: %d", i, _histo[i]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   145
      }
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
  }
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   150
class RedirtyLoggedCardTableEntryClosure: public CardTableEntryClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   151
  int _calls;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   152
  G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   153
  CardTableModRefBS* _ctbs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   154
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   155
  RedirtyLoggedCardTableEntryClosure() :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   156
    _calls(0)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   157
  {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   158
    _g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   159
    _ctbs = (CardTableModRefBS*)_g1h->barrier_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   160
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   161
  bool do_card_ptr(jbyte* card_ptr, int worker_i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   162
    if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   163
      _calls++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   164
      *card_ptr = 0;
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
    return true;
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
  int calls() { return _calls; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   169
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   170
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   171
class RedirtyLoggedCardTableEntryFastClosure : public CardTableEntryClosure {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   172
public:
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   173
  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
   174
    *card_ptr = CardTableModRefBS::dirty_card_val();
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   175
    return true;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   176
  }
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   177
};
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
   178
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   179
YoungList::YoungList(G1CollectedHeap* g1h) :
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   180
    _g1h(g1h), _head(NULL), _length(0), _last_sampled_rs_lengths(0),
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   181
    _survivor_head(NULL), _survivor_tail(NULL), _survivor_length(0) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   182
  guarantee(check_list_empty(false), "just making sure...");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   183
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   184
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   185
void YoungList::push_region(HeapRegion *hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   186
  assert(!hr->is_young(), "should not already be young");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   187
  assert(hr->get_next_young_region() == NULL, "cause it should!");
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
  hr->set_next_young_region(_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   190
  _head = hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   191
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10997
diff changeset
   192
  _g1h->g1_policy()->set_region_eden(hr, (int) _length);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   193
  ++_length;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   194
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   195
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   196
void YoungList::add_survivor_region(HeapRegion* hr) {
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   197
  assert(hr->is_survivor(), "should be flagged as survivor region");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   198
  assert(hr->get_next_young_region() == NULL, "cause it should!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   199
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   200
  hr->set_next_young_region(_survivor_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   201
  if (_survivor_head == NULL) {
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   202
    _survivor_tail = hr;
1374
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
  _survivor_head = hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   205
  ++_survivor_length;
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   208
void YoungList::empty_list(HeapRegion* list) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   209
  while (list != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   210
    HeapRegion* next = list->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   211
    list->set_next_young_region(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   212
    list->uninstall_surv_rate_group();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   213
    list->set_not_young();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   214
    list = next;
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
}
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
void YoungList::empty_list() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   219
  assert(check_list_well_formed(), "young list should be well formed");
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
  empty_list(_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   222
  _head = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   223
  _length = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   224
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   225
  empty_list(_survivor_head);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   226
  _survivor_head = NULL;
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   227
  _survivor_tail = NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   228
  _survivor_length = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   229
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   230
  _last_sampled_rs_lengths = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   231
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   232
  assert(check_list_empty(false), "just making sure...");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   233
}
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
bool YoungList::check_list_well_formed() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   236
  bool ret = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   237
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   238
  uint length = 0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   239
  HeapRegion* curr = _head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   240
  HeapRegion* last = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   241
  while (curr != NULL) {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   242
    if (!curr->is_young()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   243
      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
   244
                             "incorrectly tagged (y: %d, surv: %d)",
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   245
                             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
   246
                             curr->is_young(), curr->is_survivor());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   247
      ret = false;
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
    ++length;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   250
    last = curr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   251
    curr = curr->get_next_young_region();
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
  ret = ret && (length == _length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   254
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   255
  if (!ret) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   256
    gclog_or_tty->print_cr("### YOUNG LIST seems not well formed!");
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   257
    gclog_or_tty->print_cr("###   list has %u entries, _length is %u",
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   258
                           length, _length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   259
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   260
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   261
  return ret;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   262
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   263
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   264
bool YoungList::check_list_empty(bool check_sample) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   265
  bool ret = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   266
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   267
  if (_length != 0) {
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   268
    gclog_or_tty->print_cr("### YOUNG LIST should have 0 length, not %u",
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   269
                  _length);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   270
    ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   271
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   272
  if (check_sample && _last_sampled_rs_lengths != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   273
    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
   274
    ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   275
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   276
  if (_head != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   277
    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
   278
    ret = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   279
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   280
  if (!ret) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   281
    gclog_or_tty->print_cr("### YOUNG LIST does not seem empty");
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
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   284
  return ret;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   285
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   286
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   287
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   288
YoungList::rs_length_sampling_init() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   289
  _sampled_rs_lengths = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   290
  _curr               = _head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   291
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   292
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   293
bool
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   294
YoungList::rs_length_sampling_more() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   295
  return _curr != NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   296
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   297
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   298
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   299
YoungList::rs_length_sampling_next() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   300
  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
   301
  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
   302
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   303
  _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
   304
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   305
  // 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
   306
  // 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
   307
  // 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
   308
  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
   309
    // 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
   310
    _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
   311
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   312
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   313
  _curr = _curr->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   314
  if (_curr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   315
    _last_sampled_rs_lengths = _sampled_rs_lengths;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   316
    // 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
   317
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   318
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   319
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   320
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   321
YoungList::reset_auxilary_lists() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   322
  guarantee( is_empty(), "young list should be empty" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   323
  assert(check_list_well_formed(), "young list should be well formed");
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
  // Add survivor regions to SurvRateGroup.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   326
  _g1h->g1_policy()->note_start_adding_survivor_regions();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   327
  _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
   328
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10997
diff changeset
   329
  int young_index_in_cset = 0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   330
  for (HeapRegion* curr = _survivor_head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   331
       curr != NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   332
       curr = curr->get_next_young_region()) {
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10997
diff changeset
   333
    _g1h->g1_policy()->set_region_survivor(curr, young_index_in_cset);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   334
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   335
    // 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
   336
    // 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
   337
    // pause.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   338
    _g1h->g1_policy()->add_region_to_incremental_cset_rhs(curr);
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10997
diff changeset
   339
    young_index_in_cset += 1;
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10997
diff changeset
   340
  }
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   341
  assert((uint) young_index_in_cset == _survivor_length, "post-condition");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   342
  _g1h->g1_policy()->note_stop_adding_survivor_regions();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   343
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   344
  _head   = _survivor_head;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   345
  _length = _survivor_length;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   346
  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
   347
    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
   348
    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
   349
    _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
   350
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   351
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   352
  // 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
   353
  // 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
   354
  // 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
   355
  // 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
   356
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
   357
  _g1h->g1_policy()->finished_recalculating_age_indexes(false /* is_survivors */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   358
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   359
  assert(check_list_well_formed(), "young list should be well formed");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   360
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   361
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   362
void YoungList::print() {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
   363
  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
   364
  const char* names[] = {"YOUNG", "SURVIVOR"};
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   365
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   366
  for (unsigned int list = 0; list < ARRAY_SIZE(lists); ++list) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   367
    gclog_or_tty->print_cr("%s LIST CONTENTS", names[list]);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   368
    HeapRegion *curr = lists[list];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   369
    if (curr == NULL)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   370
      gclog_or_tty->print_cr("  empty");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   371
    while (curr != NULL) {
12508
d76458352d62 7143490: G1: Remove HeapRegion::_top_at_conc_mark_count
johnc
parents: 12382
diff changeset
   372
      gclog_or_tty->print_cr("  "HR_FORMAT", P: "PTR_FORMAT "N: "PTR_FORMAT", age: %4d",
d76458352d62 7143490: G1: Remove HeapRegion::_top_at_conc_mark_count
johnc
parents: 12382
diff changeset
   373
                             HR_FORMAT_PARAMS(curr),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   374
                             curr->prev_top_at_mark_start(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   375
                             curr->next_top_at_mark_start(),
12508
d76458352d62 7143490: G1: Remove HeapRegion::_top_at_conc_mark_count
johnc
parents: 12382
diff changeset
   376
                             curr->age_in_surv_rate_group_cond());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   377
      curr = curr->get_next_young_region();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   378
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   379
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   380
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   381
  gclog_or_tty->print_cr("");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   382
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   383
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   384
void G1CollectedHeap::push_dirty_cards_region(HeapRegion* hr)
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   385
{
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   386
  // 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
   387
  // by installing a self pointer.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   388
  HeapRegion* next = hr->get_next_dirty_cards_region();
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   389
  if (next == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   390
    HeapRegion* res = (HeapRegion*)
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   391
      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
   392
                          NULL);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   393
    if (res == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   394
      HeapRegion* head;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   395
      do {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   396
        // Put the region to the dirty cards region list.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   397
        head = _dirty_cards_region_list;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   398
        next = (HeapRegion*)
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   399
          Atomic::cmpxchg_ptr(hr, &_dirty_cards_region_list, head);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   400
        if (next == head) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   401
          assert(hr->get_next_dirty_cards_region() == hr,
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   402
                 "hr->get_next_dirty_cards_region() != hr");
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   403
          if (next == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   404
            // The last region in the list points to itself.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   405
            hr->set_next_dirty_cards_region(hr);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   406
          } else {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   407
            hr->set_next_dirty_cards_region(next);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   408
          }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   409
        }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   410
      } while (next != head);
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
  }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   413
}
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   414
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   415
HeapRegion* G1CollectedHeap::pop_dirty_cards_region()
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
  HeapRegion* head;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   418
  HeapRegion* hr;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   419
  do {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   420
    head = _dirty_cards_region_list;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   421
    if (head == NULL) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   422
      return NULL;
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
    HeapRegion* new_head = head->get_next_dirty_cards_region();
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   425
    if (head == new_head) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   426
      // The last region.
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   427
      new_head = NULL;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   428
    }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   429
    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
   430
                                          head);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   431
  } while (hr != head);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   432
  assert(hr != NULL, "invariant");
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   433
  hr->set_next_dirty_cards_region(NULL);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   434
  return hr;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   435
}
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
   436
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   437
void G1CollectedHeap::stop_conc_gc_threads() {
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
   438
  _cg1r->stop();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   439
  _cmThread->stop();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   440
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   441
9935
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   442
#ifdef ASSERT
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   443
// A region is added to the collection set as it is retired
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   444
// so an address p can point to a region which will be in the
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   445
// collection set but has not yet been retired.  This method
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   446
// therefore is only accurate during a GC pause after all
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   447
// regions have been retired.  It is used for debugging
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   448
// to check if an nmethod has references to objects that can
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   449
// be move during a partial collection.  Though it can be
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   450
// inaccurate, it is sufficient for G1 because the conservative
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   451
// implementation of is_scavengable() for G1 will indicate that
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   452
// all nmethods must be scanned during a partial collection.
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   453
bool G1CollectedHeap::is_in_partial_collection(const void* p) {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   454
  HeapRegion* hr = heap_region_containing(p);
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   455
  return hr != NULL && hr->in_collection_set();
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   456
}
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   457
#endif
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   458
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   459
// Returns true if the reference points to an object that
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   460
// can move in an incremental collecction.
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   461
bool G1CollectedHeap::is_scavengable(const void* p) {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   462
  G1CollectedHeap* g1h = G1CollectedHeap::heap();
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   463
  G1CollectorPolicy* g1p = g1h->g1_policy();
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   464
  HeapRegion* hr = heap_region_containing(p);
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   465
  if (hr == NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
   466
     // null
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
   467
     assert(p == NULL, err_msg("Not NULL " PTR_FORMAT ,p));
9935
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   468
     return false;
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   469
  } else {
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   470
    return !hr->isHumongous();
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   471
  }
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   472
}
51267b5e1a3d 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 9623
diff changeset
   473
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   474
void G1CollectedHeap::check_ct_logs_at_safepoint() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   475
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   476
  CardTableModRefBS* ct_bs = (CardTableModRefBS*)barrier_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   477
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   478
  // Count the dirty cards at the start.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   479
  CountNonCleanMemRegionClosure count1(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   480
  ct_bs->mod_card_iterate(&count1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   481
  int orig_count = count1.n();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   482
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   483
  // First clear the logged cards.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   484
  ClearLoggedCardTableEntryClosure clear;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   485
  dcqs.set_closure(&clear);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   486
  dcqs.apply_closure_to_all_completed_buffers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   487
  dcqs.iterate_closure_all_threads(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   488
  clear.print_histo();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   489
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   490
  // Now ensure that there's no dirty cards.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   491
  CountNonCleanMemRegionClosure count2(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   492
  ct_bs->mod_card_iterate(&count2);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   493
  if (count2.n() != 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   494
    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
   495
                           count2.n(), orig_count);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   496
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   497
  guarantee(count2.n() == 0, "Card table should be clean.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   498
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   499
  RedirtyLoggedCardTableEntryClosure redirty;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   500
  JavaThread::dirty_card_queue_set().set_closure(&redirty);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   501
  dcqs.apply_closure_to_all_completed_buffers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   502
  dcqs.iterate_closure_all_threads(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   503
  gclog_or_tty->print_cr("Log entries = %d, dirty cards = %d.",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   504
                         clear.calls(), orig_count);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   505
  guarantee(redirty.calls() == clear.calls(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   506
            "Or else mechanism is broken.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   507
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   508
  CountNonCleanMemRegionClosure count3(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   509
  ct_bs->mod_card_iterate(&count3);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   510
  if (count3.n() != orig_count) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   511
    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
   512
                           orig_count, count3.n());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   513
    guarantee(count3.n() >= orig_count, "Should have restored them all.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   514
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   515
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   516
  JavaThread::dirty_card_queue_set().set_closure(_refine_cte_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   517
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   518
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   519
// Private class members.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   520
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   521
G1CollectedHeap* G1CollectedHeap::_g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   522
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   523
// Private methods.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   524
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   525
HeapRegion*
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   526
G1CollectedHeap::new_region_try_secondary_free_list() {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   527
  MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   528
  while (!_secondary_free_list.is_empty() || free_regions_coming()) {
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] : "
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   532
                               "secondary_free_list has %u entries",
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   533
                               _secondary_free_list.length());
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   534
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   535
      // It looks as if there are free regions available on the
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   536
      // 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
   537
      // again to allocate from it.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   538
      append_secondary_free_list();
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
      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
   541
             "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
   542
      HeapRegion* res = _free_list.remove_head();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   543
      if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   544
        gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   545
                               "allocated "HR_FORMAT" from secondary_free_list",
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   546
                               HR_FORMAT_PARAMS(res));
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   547
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   548
      return res;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   549
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   550
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   551
    // 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
   552
    // 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
   553
    // the secondary_free_list.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   554
    SecondaryFreeList_lock->wait(Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   555
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   556
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   557
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   558
    gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   559
                           "could not allocate from secondary_free_list");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   560
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   561
  return NULL;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   562
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   563
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   564
HeapRegion* G1CollectedHeap::new_region(size_t word_size, bool do_expand) {
10677
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
   565
  assert(!isHumongous(word_size) || word_size <= HeapRegion::GrainWords,
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   566
         "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
   567
         "when we are allocating a single humongous region");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   568
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   569
  HeapRegion* res;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   570
  if (G1StressConcRegionFreeing) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   571
    if (!_secondary_free_list.is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   572
      if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   573
        gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   574
                               "forced to look at the secondary_free_list");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   575
      }
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   576
      res = new_region_try_secondary_free_list();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   577
      if (res != NULL) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   578
        return res;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   579
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   580
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   581
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   582
  res = _free_list.remove_head_or_null();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   583
  if (res == NULL) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   584
    if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   585
      gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   586
                             "res == NULL, trying the secondary_free_list");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   587
    }
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   588
    res = new_region_try_secondary_free_list();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   589
  }
11449
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   590
  if (res == NULL && do_expand && _expand_heap_after_alloc_failure) {
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   591
    // Currently, only attempts to allocate GC alloc regions set
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   592
    // do_expand to true. So, we should only reach here during a
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   593
    // safepoint. If this assumption changes we might have to
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   594
    // reconsider the use of _expand_heap_after_alloc_failure.
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   595
    assert(SafepointSynchronize::is_at_safepoint(), "invariant");
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   596
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   597
    ergo_verbose1(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   598
                  "attempt heap expansion",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   599
                  ergo_format_reason("region allocation request failed")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   600
                  ergo_format_byte("allocation request"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   601
                  word_size * HeapWordSize);
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   602
    if (expand(word_size * HeapWordSize)) {
11449
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   603
      // Given that expand() succeeded in expanding the heap, and we
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   604
      // always expand the heap by an amount aligned to the heap
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   605
      // region size, the free list should in theory not be empty. So
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   606
      // it would probably be OK to use remove_head(). But the extra
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   607
      // check for NULL is unlikely to be a performance issue here (we
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   608
      // just expanded the heap!) so let's just be conservative and
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   609
      // use remove_head_or_null().
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   610
      res = _free_list.remove_head_or_null();
11449
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   611
    } else {
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
   612
      _expand_heap_after_alloc_failure = false;
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   613
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   614
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   615
  return res;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   616
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   617
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   618
uint G1CollectedHeap::humongous_obj_allocate_find_first(uint num_regions,
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   619
                                                        size_t word_size) {
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   620
  assert(isHumongous(word_size), "word_size should be humongous");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   621
  assert(num_regions * HeapRegion::GrainWords >= word_size, "pre-condition");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   622
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   623
  uint first = G1_NULL_HRS_INDEX;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   624
  if (num_regions == 1) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   625
    // 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
   626
    // path. The caller will attempt the expasion if this fails, so
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   627
    // let's not try to expand here too.
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   628
    HeapRegion* hr = new_region(word_size, false /* do_expand */);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   629
    if (hr != NULL) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   630
      first = hr->hrs_index();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   631
    } else {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   632
      first = G1_NULL_HRS_INDEX;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   633
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   634
  } else {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   635
    // We can't allocate humongous regions while cleanupComplete() is
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   636
    // 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
   637
    // 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
   638
    // 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
   639
    // 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
   640
    // one region to satisfy the current humongous allocation
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   641
    // 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
   642
    // region allocation code (see above).
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   643
    wait_while_free_regions_coming();
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   644
    append_secondary_free_list_if_not_empty_with_lock();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   645
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   646
    if (free_regions() >= num_regions) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   647
      first = _hrs.find_contiguous(num_regions);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   648
      if (first != G1_NULL_HRS_INDEX) {
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   649
        for (uint i = first; i < first + num_regions; ++i) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   650
          HeapRegion* hr = region_at(i);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   651
          assert(hr->is_empty(), "sanity");
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   652
          assert(is_on_master_free_list(hr), "sanity");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   653
          hr->set_pending_removal(true);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   654
        }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   655
        _free_list.remove_all_pending(num_regions);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   656
      }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   657
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   658
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   659
  return first;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   660
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   661
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   662
HeapWord*
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   663
G1CollectedHeap::humongous_obj_allocate_initialize_regions(uint first,
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   664
                                                           uint num_regions,
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   665
                                                           size_t word_size) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   666
  assert(first != G1_NULL_HRS_INDEX, "pre-condition");
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   667
  assert(isHumongous(word_size), "word_size should be humongous");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   668
  assert(num_regions * HeapRegion::GrainWords >= word_size, "pre-condition");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   669
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   670
  // Index of last region in the series + 1.
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   671
  uint last = first + num_regions;
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   672
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   673
  // We need to initialize the region(s) we just discovered. This is
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   674
  // a bit tricky given that it can happen concurrently with
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   675
  // refinement threads refining cards on these regions and
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   676
  // potentially wanting to refine the BOT as they are scanning
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   677
  // those cards (this can happen shortly after a cleanup; see CR
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   678
  // 6991377). So we have to set up the region(s) carefully and in
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   679
  // a specific order.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   681
  // The word size sum of all the regions we will allocate.
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   682
  size_t word_size_sum = (size_t) num_regions * HeapRegion::GrainWords;
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   683
  assert(word_size <= word_size_sum, "sanity");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   684
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   685
  // This will be the "starts humongous" region.
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   686
  HeapRegion* first_hr = region_at(first);
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   687
  // The header of the new object will be placed at the bottom of
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   688
  // the first region.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   689
  HeapWord* new_obj = first_hr->bottom();
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   690
  // This will be the new end of the first region in the series that
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   691
  // should also match the end of the last region in the seriers.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   692
  HeapWord* new_end = new_obj + word_size_sum;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   693
  // This will be the new top of the first region that will reflect
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   694
  // this allocation.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   695
  HeapWord* new_top = new_obj + word_size;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   696
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   697
  // First, we need to zero the header of the space that we will be
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   698
  // allocating. When we update top further down, some refinement
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   699
  // threads might try to scan the region. By zeroing the header we
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   700
  // ensure that any thread that will try to scan the region will
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   701
  // come across the zero klass word and bail out.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   702
  //
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   703
  // NOTE: It would not have been correct to have used
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   704
  // CollectedHeap::fill_with_object() and make the space look like
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   705
  // an int array. The thread that is doing the allocation will
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   706
  // later update the object header to a potentially different array
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   707
  // type and, for a very short period of time, the klass and length
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   708
  // fields will be inconsistent. This could cause a refinement
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   709
  // thread to calculate the object size incorrectly.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   710
  Copy::fill_to_words(new_obj, oopDesc::header_size(), 0);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   711
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   712
  // We will set up the first region as "starts humongous". This
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   713
  // will also update the BOT covering all the regions to reflect
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   714
  // that there is a single object that starts at the bottom of the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   715
  // first region.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   716
  first_hr->set_startsHumongous(new_top, new_end);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   717
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   718
  // Then, if there are any, we will set up the "continues
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   719
  // humongous" regions.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   720
  HeapRegion* hr = NULL;
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   721
  for (uint i = first + 1; i < last; ++i) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   722
    hr = region_at(i);
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   723
    hr->set_continuesHumongous(first_hr);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   724
  }
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   725
  // If we have "continues humongous" regions (hr != NULL), then the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   726
  // end of the last one should match new_end.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   727
  assert(hr == NULL || hr->end() == new_end, "sanity");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   728
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   729
  // Up to this point no concurrent thread would have been able to
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   730
  // do any scanning on any region in this series. All the top
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   731
  // fields still point to bottom, so the intersection between
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   732
  // [bottom,top] and [card_start,card_end] will be empty. Before we
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   733
  // update the top fields, we'll do a storestore to make sure that
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   734
  // no thread sees the update to top before the zeroing of the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   735
  // object header and the BOT initialization.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   736
  OrderAccess::storestore();
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   737
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   738
  // Now that the BOT and the object header have been initialized,
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   739
  // we can update top of the "starts humongous" region.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   740
  assert(first_hr->bottom() < new_top && new_top <= first_hr->end(),
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   741
         "new_top should be in this region");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   742
  first_hr->set_top(new_top);
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   743
  if (_hr_printer.is_active()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   744
    HeapWord* bottom = first_hr->bottom();
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   745
    HeapWord* end = first_hr->orig_end();
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   746
    if ((first + 1) == last) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   747
      // the series has a single humongous region
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   748
      _hr_printer.alloc(G1HRPrinter::SingleHumongous, first_hr, new_top);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   749
    } else {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   750
      // the series has more than one humongous regions
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   751
      _hr_printer.alloc(G1HRPrinter::StartsHumongous, first_hr, end);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   752
    }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   753
  }
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   754
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   755
  // Now, we will update the top fields of the "continues humongous"
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   756
  // regions. The reason we need to do this is that, otherwise,
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   757
  // these regions would look empty and this will confuse parts of
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   758
  // G1. For example, the code that looks for a consecutive number
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   759
  // of empty regions will consider them empty and try to
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   760
  // re-allocate them. We can extend is_empty() to also include
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   761
  // !continuesHumongous(), but it is easier to just update the top
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   762
  // fields here. The way we set top for all regions (i.e., top ==
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   763
  // end for all regions but the last one, top == new_top for the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   764
  // last one) is actually used when we will free up the humongous
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   765
  // region in free_humongous_region().
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   766
  hr = NULL;
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   767
  for (uint i = first + 1; i < last; ++i) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   768
    hr = region_at(i);
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   769
    if ((i + 1) == last) {
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   770
      // last continues humongous region
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   771
      assert(hr->bottom() < new_top && new_top <= hr->end(),
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   772
             "new_top should fall on this region");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   773
      hr->set_top(new_top);
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   774
      _hr_printer.alloc(G1HRPrinter::ContinuesHumongous, hr, new_top);
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   775
    } else {
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   776
      // not last one
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   777
      assert(new_top > hr->end(), "new_top should be above this region");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   778
      hr->set_top(hr->end());
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
   779
      _hr_printer.alloc(G1HRPrinter::ContinuesHumongous, hr, hr->end());
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   780
    }
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   781
  }
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   782
  // If we have continues humongous regions (hr != NULL), then the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   783
  // end of the last one should match new_end and its top should
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   784
  // match new_top.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   785
  assert(hr == NULL ||
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   786
         (hr->end() == new_end && hr->top() == new_top), "sanity");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   787
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   788
  assert(first_hr->used() == word_size * HeapWordSize, "invariant");
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   789
  _summary_bytes_used += first_hr->used();
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   790
  _humongous_set.add(first_hr);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   791
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   792
  return new_obj;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   793
}
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   794
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   795
// If could fit into free regions w/o expansion, try.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   796
// Otherwise, if can expand, do so.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   797
// 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
   798
HeapWord* G1CollectedHeap::humongous_obj_allocate(size_t word_size) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   799
  assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   800
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   801
  verify_region_sets_optional();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   802
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   803
  size_t word_size_rounded = round_to(word_size, HeapRegion::GrainWords);
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   804
  uint num_regions = (uint) (word_size_rounded / HeapRegion::GrainWords);
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   805
  uint x_num = expansion_regions();
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   806
  uint fs = _hrs.free_suffix();
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   807
  uint first = humongous_obj_allocate_find_first(num_regions, word_size);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   808
  if (first == G1_NULL_HRS_INDEX) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   809
    // The only thing we can do now is attempt expansion.
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
   810
    if (fs + x_num >= num_regions) {
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   811
      // If the number of regions we're trying to allocate for this
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   812
      // object is at most the number of regions in the free suffix,
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   813
      // then the call to humongous_obj_allocate_find_first() above
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   814
      // should have succeeded and we wouldn't be here.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   815
      //
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   816
      // We should only be trying to expand when the free suffix is
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   817
      // not sufficient for the object _and_ we have some expansion
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   818
      // room available.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   819
      assert(num_regions > fs, "earlier allocation should have succeeded");
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   820
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   821
      ergo_verbose1(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   822
                    "attempt heap expansion",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   823
                    ergo_format_reason("humongous allocation request failed")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   824
                    ergo_format_byte("allocation request"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   825
                    word_size * HeapWordSize);
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   826
      if (expand((num_regions - fs) * HeapRegion::GrainBytes)) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   827
        // Even though the heap was expanded, it might not have
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   828
        // reached the desired size. So, we cannot assume that the
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   829
        // allocation will succeed.
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   830
        first = humongous_obj_allocate_find_first(num_regions, word_size);
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
   831
      }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   832
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   833
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   834
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   835
  HeapWord* result = NULL;
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
   836
  if (first != G1_NULL_HRS_INDEX) {
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   837
    result =
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   838
      humongous_obj_allocate_initialize_regions(first, num_regions, word_size);
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   839
    assert(result != NULL, "it should always return a valid result");
10671
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
   840
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
   841
    // A successful humongous object allocation changes the used space
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
   842
    // information of the old generation so we need to recalculate the
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
   843
    // sizes and update the jstat counters here.
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
   844
    g1mm()->update_sizes();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   845
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   846
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
   847
  verify_region_sets_optional();
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   848
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
   849
  return result;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   850
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   851
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   852
HeapWord* G1CollectedHeap::allocate_new_tlab(size_t word_size) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   853
  assert_heap_not_locked_and_not_at_safepoint();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   854
  assert(!isHumongous(word_size), "we do not allow humongous TLABs");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   855
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   856
  unsigned int dummy_gc_count_before;
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   857
  int dummy_gclocker_retry_count = 0;
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   858
  return attempt_allocation(word_size, &dummy_gc_count_before, &dummy_gclocker_retry_count);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   859
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   860
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   861
HeapWord*
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   862
G1CollectedHeap::mem_allocate(size_t word_size,
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   863
                              bool*  gc_overhead_limit_was_exceeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   864
  assert_heap_not_locked_and_not_at_safepoint();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   865
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   866
  // Loop until the allocation is satisified, or unsatisfied after GC.
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   867
  for (int try_count = 1, gclocker_retry_count = 0; /* we'll return */; try_count += 1) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   868
    unsigned int gc_count_before;
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   869
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   870
    HeapWord* result = NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   871
    if (!isHumongous(word_size)) {
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   872
      result = attempt_allocation(word_size, &gc_count_before, &gclocker_retry_count);
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   873
    } else {
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   874
      result = attempt_allocation_humongous(word_size, &gc_count_before, &gclocker_retry_count);
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   875
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   876
    if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   877
      return result;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   878
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   879
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   880
    // Create the garbage collection operation...
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   881
    VM_G1CollectForAllocation op(gc_count_before, word_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   882
    // ...and get the VM thread to execute it.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   883
    VMThread::execute(&op);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   884
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   885
    if (op.prologue_succeeded() && op.pause_succeeded()) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   886
      // If the operation was successful we'll return the result even
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   887
      // if it is NULL. If the allocation attempt failed immediately
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   888
      // 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
   889
      HeapWord* result = op.result();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   890
      if (result != NULL && !isHumongous(word_size)) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   891
        // Allocations that take place on VM operations do not do any
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   892
        // 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
   893
        // this for non-humongous allocations, though.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   894
        dirty_young_block(result, word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   895
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   896
      return result;
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   897
    } else {
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   898
      if (gclocker_retry_count > GCLockerRetryAllocationCount) {
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   899
        return NULL;
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   900
      }
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   901
      assert(op.result() == NULL,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   902
             "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
   903
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   904
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   905
    // Give a warning if we seem to be looping forever.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   906
    if ((QueuedAllocationWarningCount > 0) &&
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   907
        (try_count % QueuedAllocationWarningCount == 0)) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   908
      warning("G1CollectedHeap::mem_allocate retries %d times", try_count);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   909
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   910
  }
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   911
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
   912
  ShouldNotReachHere();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   913
  return NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   914
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   915
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   916
HeapWord* G1CollectedHeap::attempt_allocation_slow(size_t word_size,
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   917
                                           unsigned int *gc_count_before_ret,
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   918
                                           int* gclocker_retry_count_ret) {
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   919
  // Make sure you read the note in attempt_allocation_humongous().
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   920
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   921
  assert_heap_not_locked_and_not_at_safepoint();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   922
  assert(!isHumongous(word_size), "attempt_allocation_slow() should not "
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   923
         "be called for humongous allocation requests");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   924
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   925
  // We should only get here after the first-level allocation attempt
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   926
  // (attempt_allocation()) failed to allocate.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   927
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   928
  // We will loop until a) we manage to successfully perform the
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   929
  // allocation or b) we successfully schedule a collection which
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   930
  // fails to perform the allocation. b) is the only case when we'll
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   931
  // return NULL.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   932
  HeapWord* result = NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   933
  for (int try_count = 1; /* we'll return */; try_count += 1) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   934
    bool should_try_gc;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   935
    unsigned int gc_count_before;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   936
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   937
    {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   938
      MutexLockerEx x(Heap_lock);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   939
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   940
      result = _mutator_alloc_region.attempt_allocation_locked(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   941
                                                      false /* bot_updates */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   942
      if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   943
        return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   944
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   945
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   946
      // If we reach here, attempt_allocation_locked() above failed to
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   947
      // allocate a new region. So the mutator alloc region should be NULL.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   948
      assert(_mutator_alloc_region.get() == NULL, "only way to get here");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   949
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   950
      if (GC_locker::is_active_and_needs_gc()) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   951
        if (g1_policy()->can_expand_young_list()) {
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   952
          // No need for an ergo verbose message here,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
   953
          // can_expand_young_list() does this when it returns true.
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   954
          result = _mutator_alloc_region.attempt_allocation_force(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   955
                                                      false /* bot_updates */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   956
          if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   957
            return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   958
          }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   959
        }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   960
        should_try_gc = false;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   961
      } else {
12778
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   962
        // The GCLocker may not be active but the GCLocker initiated
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   963
        // GC may not yet have been performed (GCLocker::needs_gc()
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   964
        // returns true). In this case we do not try this GC and
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   965
        // wait until the GCLocker initiated GC is performed, and
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   966
        // then retry the allocation.
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   967
        if (GC_locker::needs_gc()) {
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   968
          should_try_gc = false;
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   969
        } else {
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   970
          // Read the GC count while still holding the Heap_lock.
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   971
          gc_count_before = total_collections();
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   972
          should_try_gc = true;
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   973
        }
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   974
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   975
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   976
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   977
    if (should_try_gc) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   978
      bool succeeded;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   979
      result = do_collection_pause(word_size, gc_count_before, &succeeded);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   980
      if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   981
        assert(succeeded, "only way to get back a non-NULL result");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   982
        return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   983
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   984
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   985
      if (succeeded) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   986
        // If we get here we successfully scheduled a collection which
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   987
        // failed to allocate. No point in trying to allocate
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   988
        // further. We'll just return NULL.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   989
        MutexLockerEx x(Heap_lock);
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
   990
        *gc_count_before_ret = total_collections();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   991
        return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   992
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
   993
    } else {
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   994
      if (*gclocker_retry_count_ret > GCLockerRetryAllocationCount) {
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   995
        MutexLockerEx x(Heap_lock);
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   996
        *gc_count_before_ret = total_collections();
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   997
        return NULL;
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
   998
      }
12778
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
   999
      // The GCLocker is either active or the GCLocker initiated
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1000
      // GC has not yet been performed. Stall until it is and
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1001
      // then retry the allocation.
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1002
      GC_locker::stall_until_clear();
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1003
      (*gclocker_retry_count_ret) += 1;
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1004
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1005
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1006
    // We can reach here if we were unsuccessul in scheduling a
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1007
    // collection (because another thread beat us to it) or if we were
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1008
    // stalled due to the GC locker. In either can we should retry the
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1009
    // allocation attempt in case another thread successfully
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1010
    // performed a collection and reclaimed enough space. We do the
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1011
    // first attempt (without holding the Heap_lock) here and the
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1012
    // follow-on attempt will be at the start of the next loop
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1013
    // iteration (after taking the Heap_lock).
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1014
    result = _mutator_alloc_region.attempt_allocation(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1015
                                                      false /* bot_updates */);
12227
371690c4f281 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 11756
diff changeset
  1016
    if (result != NULL) {
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1017
      return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1018
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1019
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1020
    // Give a warning if we seem to be looping forever.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1021
    if ((QueuedAllocationWarningCount > 0) &&
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1022
        (try_count % QueuedAllocationWarningCount == 0)) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1023
      warning("G1CollectedHeap::attempt_allocation_slow() "
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1024
              "retries %d times", try_count);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1025
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1026
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1027
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1028
  ShouldNotReachHere();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1029
  return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1030
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1031
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1032
HeapWord* G1CollectedHeap::attempt_allocation_humongous(size_t word_size,
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1033
                                          unsigned int * gc_count_before_ret,
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1034
                                          int* gclocker_retry_count_ret) {
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1035
  // The structure of this method has a lot of similarities to
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1036
  // attempt_allocation_slow(). The reason these two were not merged
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1037
  // into a single one is that such a method would require several "if
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1038
  // allocation is not humongous do this, otherwise do that"
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1039
  // conditional paths which would obscure its flow. In fact, an early
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1040
  // version of this code did use a unified method which was harder to
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1041
  // follow and, as a result, it had subtle bugs that were hard to
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1042
  // track down. So keeping these two methods separate allows each to
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1043
  // be more readable. It will be good to keep these two in sync as
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1044
  // much as possible.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1045
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1046
  assert_heap_not_locked_and_not_at_safepoint();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1047
  assert(isHumongous(word_size), "attempt_allocation_humongous() "
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1048
         "should only be called for humongous allocations");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1049
11581
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11580
diff changeset
  1050
  // Humongous objects can exhaust the heap quickly, so we should check if we
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11580
diff changeset
  1051
  // need to start a marking cycle at each humongous object allocation. We do
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11580
diff changeset
  1052
  // the check before we do the actual allocation. The reason for doing it
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11580
diff changeset
  1053
  // before the allocation is that we avoid having to keep track of the newly
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11580
diff changeset
  1054
  // allocated memory while we do a GC.
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  1055
  if (g1_policy()->need_to_start_conc_mark("concurrent humongous allocation",
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  1056
                                           word_size)) {
11581
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11580
diff changeset
  1057
    collect(GCCause::_g1_humongous_allocation);
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11580
diff changeset
  1058
  }
b1afc51ad34e 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 11580
diff changeset
  1059
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1060
  // We will loop until a) we manage to successfully perform the
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1061
  // allocation or b) we successfully schedule a collection which
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1062
  // fails to perform the allocation. b) is the only case when we'll
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1063
  // return NULL.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1064
  HeapWord* result = NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1065
  for (int try_count = 1; /* we'll return */; try_count += 1) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1066
    bool should_try_gc;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1067
    unsigned int gc_count_before;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1068
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1069
    {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1070
      MutexLockerEx x(Heap_lock);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1071
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1072
      // Given that humongous objects are not allocated in young
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1073
      // regions, we'll first try to do the allocation without doing a
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1074
      // collection hoping that there's enough space in the heap.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1075
      result = humongous_obj_allocate(word_size);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1076
      if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1077
        return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1078
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1079
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1080
      if (GC_locker::is_active_and_needs_gc()) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1081
        should_try_gc = false;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1082
      } else {
12778
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1083
         // The GCLocker may not be active but the GCLocker initiated
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1084
        // GC may not yet have been performed (GCLocker::needs_gc()
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1085
        // returns true). In this case we do not try this GC and
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1086
        // wait until the GCLocker initiated GC is performed, and
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1087
        // then retry the allocation.
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1088
        if (GC_locker::needs_gc()) {
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1089
          should_try_gc = false;
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1090
        } else {
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1091
          // Read the GC count while still holding the Heap_lock.
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1092
          gc_count_before = total_collections();
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1093
          should_try_gc = true;
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1094
        }
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1095
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1096
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1097
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1098
    if (should_try_gc) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1099
      // If we failed to allocate the humongous object, we should try to
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1100
      // do a collection pause (if we're allowed) in case it reclaims
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1101
      // enough space for the allocation to succeed after the pause.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1102
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1103
      bool succeeded;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1104
      result = do_collection_pause(word_size, gc_count_before, &succeeded);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1105
      if (result != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1106
        assert(succeeded, "only way to get back a non-NULL result");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1107
        return result;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1108
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1109
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1110
      if (succeeded) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1111
        // If we get here we successfully scheduled a collection which
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1112
        // failed to allocate. No point in trying to allocate
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1113
        // further. We'll just return NULL.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1114
        MutexLockerEx x(Heap_lock);
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  1115
        *gc_count_before_ret = total_collections();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1116
        return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1117
      }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1118
    } else {
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1119
      if (*gclocker_retry_count_ret > GCLockerRetryAllocationCount) {
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1120
        MutexLockerEx x(Heap_lock);
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1121
        *gc_count_before_ret = total_collections();
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1122
        return NULL;
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1123
      }
12778
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1124
      // The GCLocker is either active or the GCLocker initiated
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1125
      // GC has not yet been performed. Stall until it is and
b2bee9c4b41d 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 12630
diff changeset
  1126
      // then retry the allocation.
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1127
      GC_locker::stall_until_clear();
16604
800a65bfe347 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 15608
diff changeset
  1128
      (*gclocker_retry_count_ret) += 1;
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1129
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1130
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1131
    // We can reach here if we were unsuccessul in scheduling a
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1132
    // collection (because another thread beat us to it) or if we were
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1133
    // stalled due to the GC locker. In either can we should retry the
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1134
    // allocation attempt in case another thread successfully
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1135
    // performed a collection and reclaimed enough space.  Give a
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1136
    // warning if we seem to be looping forever.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1137
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1138
    if ((QueuedAllocationWarningCount > 0) &&
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1139
        (try_count % QueuedAllocationWarningCount == 0)) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1140
      warning("G1CollectedHeap::attempt_allocation_humongous() "
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1141
              "retries %d times", try_count);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1142
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1143
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1144
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1145
  ShouldNotReachHere();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1146
  return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1147
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1148
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1149
HeapWord* G1CollectedHeap::attempt_allocation_at_safepoint(size_t word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1150
                                       bool expect_null_mutator_alloc_region) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1151
  assert_at_safepoint(true /* should_be_vm_thread */);
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1152
  assert(_mutator_alloc_region.get() == NULL ||
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1153
                                             !expect_null_mutator_alloc_region,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1154
         "the current alloc region was unexpectedly found to be non-NULL");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1155
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1156
  if (!isHumongous(word_size)) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1157
    return _mutator_alloc_region.attempt_allocation_locked(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1158
                                                      false /* bot_updates */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1159
  } else {
11576
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1160
    HeapWord* result = humongous_obj_allocate(word_size);
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1161
    if (result != NULL && g1_policy()->need_to_start_conc_mark("STW humongous allocation")) {
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1162
      g1_policy()->set_initiate_conc_mark_if_possible();
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1163
    }
e0bef5ca4602 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 11455
diff changeset
  1164
    return result;
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1165
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1166
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1167
  ShouldNotReachHere();
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1170
class PostMCRemSetClearClosure: public HeapRegionClosure {
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1171
  G1CollectedHeap* _g1h;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1172
  ModRefBarrierSet* _mr_bs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1173
public:
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1174
  PostMCRemSetClearClosure(G1CollectedHeap* g1h, ModRefBarrierSet* mr_bs) :
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1175
    _g1h(g1h), _mr_bs(mr_bs) { }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1176
  bool doHeapRegion(HeapRegion* r) {
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1177
    if (r->continuesHumongous()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1178
      return false;
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1179
    }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1180
    _g1h->reset_gc_time_stamps(r);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1181
    HeapRegionRemSet* hrrs = r->rem_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1182
    if (hrrs != NULL) hrrs->clear();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1183
    // You might think here that we could clear just the cards
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1184
    // 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
  1185
    // 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
  1186
    // from being enqueued, and cause it to be missed.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1187
    // 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
  1188
    _mr_bs->clear(MemRegion(r->bottom(), r->end()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1189
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1190
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1191
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1192
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1193
void G1CollectedHeap::clear_rsets_post_compaction() {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1194
  PostMCRemSetClearClosure rs_clear(this, mr_bs());
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1195
  heap_region_iterate(&rs_clear);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1196
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1197
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1198
class RebuildRSOutOfRegionClosure: public HeapRegionClosure {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1199
  G1CollectedHeap*   _g1h;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1200
  UpdateRSOopClosure _cl;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1201
  int                _worker_i;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1202
public:
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1203
  RebuildRSOutOfRegionClosure(G1CollectedHeap* g1, int worker_i = 0) :
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  1204
    _cl(g1->g1_rem_set(), worker_i),
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1205
    _worker_i(worker_i),
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1206
    _g1h(g1)
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1207
  { }
7385
eaca4b61b374 6978187: G1: assert(ParallelGCThreads> 1 || n_yielded() == _hrrs->occupied()) strikes again
johnc
parents: 6980
diff changeset
  1208
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1209
  bool doHeapRegion(HeapRegion* r) {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1210
    if (!r->continuesHumongous()) {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1211
      _cl.set_from(r);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1212
      r->oop_iterate(&_cl);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1213
    }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1214
    return false;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1215
  }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1216
};
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1217
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1218
class ParRebuildRSTask: public AbstractGangTask {
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1219
  G1CollectedHeap* _g1;
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1220
public:
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1221
  ParRebuildRSTask(G1CollectedHeap* g1)
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1222
    : AbstractGangTask("ParRebuildRSTask"),
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1223
      _g1(g1)
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1224
  { }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1225
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  1226
  void work(uint worker_id) {
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  1227
    RebuildRSOutOfRegionClosure rebuild_rs(_g1, worker_id);
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  1228
    _g1->heap_region_par_iterate_chunked(&rebuild_rs, worker_id,
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  1229
                                          _g1->workers()->active_workers(),
2152
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1230
                                         HeapRegion::RebuildRSClaimValue);
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1231
  }
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1232
};
99356e7f31b1 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 2146
diff changeset
  1233
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1234
class PostCompactionPrinterClosure: public HeapRegionClosure {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1235
private:
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1236
  G1HRPrinter* _hr_printer;
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1237
public:
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1238
  bool doHeapRegion(HeapRegion* hr) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1239
    assert(!hr->is_young(), "not expecting to find young regions");
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1240
    // We only generate output for non-empty regions.
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1241
    if (!hr->is_empty()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1242
      if (!hr->isHumongous()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1243
        _hr_printer->post_compaction(hr, G1HRPrinter::Old);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1244
      } else if (hr->startsHumongous()) {
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1245
        if (hr->region_num() == 1) {
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1246
          // single humongous region
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1247
          _hr_printer->post_compaction(hr, G1HRPrinter::SingleHumongous);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1248
        } else {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1249
          _hr_printer->post_compaction(hr, G1HRPrinter::StartsHumongous);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1250
        }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1251
      } else {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1252
        assert(hr->continuesHumongous(), "only way to get here");
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1253
        _hr_printer->post_compaction(hr, G1HRPrinter::ContinuesHumongous);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1254
      }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1255
    }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1256
    return false;
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1257
  }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1258
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1259
  PostCompactionPrinterClosure(G1HRPrinter* hr_printer)
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1260
    : _hr_printer(hr_printer) { }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1261
};
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1262
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1263
void G1CollectedHeap::print_hrs_post_compaction() {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1264
  PostCompactionPrinterClosure cl(hr_printer());
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1265
  heap_region_iterate(&cl);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1266
}
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  1267
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1268
double G1CollectedHeap::verify(bool guard, const char* msg) {
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1269
  double verify_time_ms = 0.0;
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1270
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1271
  if (guard && total_collections() >= VerifyGCStartAt) {
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1272
    double verify_start = os::elapsedTime();
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1273
    HandleMark hm;  // Discard invalid handles created during verification
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1274
    prepare_for_verify();
17112
e49af4ba7755 8013132: Add a flag to turn off the output of the verbose verification code
stefank
parents: 17109
diff changeset
  1275
    Universe::verify(VerifyOption_G1UsePrevMarking, msg);
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1276
    verify_time_ms = (os::elapsedTime() - verify_start) * 1000;
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1277
  }
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1278
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1279
  return verify_time_ms;
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1280
}
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1281
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1282
void G1CollectedHeap::verify_before_gc() {
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1283
  double verify_time_ms = verify(VerifyBeforeGC, " VerifyBeforeGC:");
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1284
  g1_policy()->phase_times()->record_verify_before_time_ms(verify_time_ms);
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1285
}
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1286
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1287
void G1CollectedHeap::verify_after_gc() {
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1288
  double verify_time_ms = verify(VerifyAfterGC, " VerifyAfterGC:");
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1289
  g1_policy()->phase_times()->record_verify_after_time_ms(verify_time_ms);
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1290
}
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  1291
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1292
bool G1CollectedHeap::do_collection(bool explicit_gc,
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  1293
                                    bool clear_all_soft_refs,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1294
                                    size_t word_size) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1295
  assert_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1296
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  1297
  if (GC_locker::check_active_before_gc()) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1298
    return false;
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  1299
  }
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  1300
7896
08aadd7aa3ee 6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents: 7659
diff changeset
  1301
  SvcGCMarker sgcm(SvcGCMarker::FULL);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1302
  ResourceMark rm;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1303
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11455
diff changeset
  1304
  print_heap_before_gc();
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  1305
17109
90e6c31bbbe4 8008966: NPG: Inefficient Metaspace counter functions cause large young GC regressions
jmasa
parents: 17108
diff changeset
  1306
  size_t metadata_prev_used = MetaspaceAux::allocated_used_bytes();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  1307
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  1308
  HRSPhaseSetter x(HRSPhaseFullGC);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1309
  verify_region_sets_optional();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1310
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1311
  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
  1312
                           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
  1313
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1314
  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
  1315
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1316
  {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1317
    IsGCActiveMark x;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1318
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1319
    // Timing
12511
24c75d495b2f 7163848: G1: Log GC Cause for a GC
brutisso
parents: 12508
diff changeset
  1320
    assert(gc_cause() != GCCause::_java_lang_system_gc || explicit_gc, "invariant");
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12271
diff changeset
  1321
    gclog_or_tty->date_stamp(G1Log::fine() && PrintGCDateStamps);
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12271
diff changeset
  1322
    TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty);
12511
24c75d495b2f 7163848: G1: Log GC Cause for a GC
brutisso
parents: 12508
diff changeset
  1323
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1324
    {
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1325
      TraceTime t(GCCauseString("Full GC", gc_cause()), G1Log::fine(), true, gclog_or_tty);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1326
      TraceCollectorStats tcs(g1mm()->full_collection_counters());
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1327
      TraceMemoryManagerStats tms(true /* fullGC */, gc_cause());
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1328
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1329
      double start = os::elapsedTime();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1330
      g1_policy()->record_full_collection_start();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1331
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1332
      // Note: When we have a more flexible GC logging framework that
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1333
      // allows us to add optional attributes to a GC log record we
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1334
      // could consider timing and reporting how long we wait in the
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1335
      // following two methods.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1336
      wait_while_free_regions_coming();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1337
      // If we start the compaction before the CM threads finish
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1338
      // scanning the root regions we might trip them over as we'll
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1339
      // be moving objects / updating references. So let's wait until
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1340
      // they are done. By telling them to abort, they should complete
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1341
      // early.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1342
      _cm->root_regions()->abort();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1343
      _cm->root_regions()->wait_until_scan_finished();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1344
      append_secondary_free_list_if_not_empty_with_lock();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1345
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1346
      gc_prologue(true);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1347
      increment_total_collections(true /* full gc */);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1348
      increment_old_marking_cycles_started();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1349
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1350
      assert(used() == recalculate_used(), "Should be equal");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1351
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1352
      verify_before_gc();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1353
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1354
      pre_full_gc_dump();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1355
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1356
      COMPILER2_PRESENT(DerivedPointerTable::clear());
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1357
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1358
      // Disable discovery and empty the discovered lists
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1359
      // for the CM ref processor.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1360
      ref_processor_cm()->disable_discovery();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1361
      ref_processor_cm()->abandon_partial_discovery();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1362
      ref_processor_cm()->verify_no_references_recorded();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1363
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1364
      // Abandon current iterations of concurrent marking and concurrent
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1365
      // refinement, if any are in progress. We have to do this before
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1366
      // wait_until_scan_finished() below.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1367
      concurrent_mark()->abort();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1368
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1369
      // Make sure we'll choose a new allocation region afterwards.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1370
      release_mutator_alloc_region();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1371
      abandon_gc_alloc_regions();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1372
      g1_rem_set()->cleanupHRRS();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1373
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1374
      // We should call this after we retire any currently active alloc
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1375
      // regions so that all the ALLOC / RETIRE events are generated
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1376
      // before the start GC event.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1377
      _hr_printer.start_gc(true /* full */, (size_t) total_collections());
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1378
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1379
      // We may have added regions to the current incremental collection
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1380
      // set between the last GC or pause and now. We need to clear the
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1381
      // incremental collection set and then start rebuilding it afresh
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1382
      // after this full GC.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1383
      abandon_collection_set(g1_policy()->inc_cset_head());
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1384
      g1_policy()->clear_incremental_cset();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1385
      g1_policy()->stop_incremental_cset_building();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1386
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1387
      tear_down_region_sets(false /* free_list_only */);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1388
      g1_policy()->set_gcs_are_young(true);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1389
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1390
      // See the comments in g1CollectedHeap.hpp and
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1391
      // G1CollectedHeap::ref_processing_init() about
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1392
      // how reference processing currently works in G1.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1393
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1394
      // Temporarily make discovery by the STW ref processor single threaded (non-MT).
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1395
      ReferenceProcessorMTDiscoveryMutator stw_rp_disc_ser(ref_processor_stw(), false);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1396
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1397
      // Temporarily clear the STW ref processor's _is_alive_non_header field.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1398
      ReferenceProcessorIsAliveMutator stw_rp_is_alive_null(ref_processor_stw(), NULL);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1399
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1400
      ref_processor_stw()->enable_discovery(true /*verify_disabled*/, true /*verify_no_refs*/);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1401
      ref_processor_stw()->setup_policy(do_clear_all_soft_refs);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1402
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1403
      // Do collection work
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1404
      {
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1405
        HandleMark hm;  // Discard invalid handles created during gc
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1406
        G1MarkSweep::invoke_at_safepoint(ref_processor_stw(), do_clear_all_soft_refs);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1407
      }
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1408
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1409
      assert(free_regions() == 0, "we should not have added any free regions");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1410
      rebuild_region_sets(false /* free_list_only */);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1411
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1412
      // Enqueue any discovered reference objects that have
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1413
      // not been removed from the discovered lists.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1414
      ref_processor_stw()->enqueue_discovered_references();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1415
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1416
      COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1417
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1418
      MemoryService::track_memory_usage();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1419
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1420
      verify_after_gc();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1421
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1422
      assert(!ref_processor_stw()->discovery_enabled(), "Postcondition");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1423
      ref_processor_stw()->verify_no_references_recorded();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1424
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1425
      // Delete metaspaces for unloaded class loaders and clean up loader_data graph
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1426
      ClassLoaderDataGraph::purge();
17109
90e6c31bbbe4 8008966: NPG: Inefficient Metaspace counter functions cause large young GC regressions
jmasa
parents: 17108
diff changeset
  1427
    MetaspaceAux::verify_metrics();
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1428
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1429
      // Note: since we've just done a full GC, concurrent
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1430
      // marking is no longer active. Therefore we need not
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1431
      // re-enable reference discovery for the CM ref processor.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1432
      // That will be done at the start of the next marking cycle.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1433
      assert(!ref_processor_cm()->discovery_enabled(), "Postcondition");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1434
      ref_processor_cm()->verify_no_references_recorded();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1435
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1436
      reset_gc_time_stamp();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1437
      // Since everything potentially moved, we will clear all remembered
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1438
      // sets, and clear all cards.  Later we will rebuild remebered
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1439
      // sets. We will also reset the GC time stamps of the regions.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1440
      clear_rsets_post_compaction();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1441
      check_gc_time_stamps();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1442
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1443
      // Resize the heap if necessary.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1444
      resize_if_necessary_after_full_collection(explicit_gc ? 0 : word_size);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1445
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1446
      if (_hr_printer.is_active()) {
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1447
        // We should do this after we potentially resize the heap so
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1448
        // that all the COMMIT / UNCOMMIT events are generated before
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1449
        // the end GC event.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1450
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1451
        print_hrs_post_compaction();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1452
        _hr_printer.end_gc(true /* full */, (size_t) total_collections());
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1453
      }
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1454
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  1455
      G1HotCardCache* hot_card_cache = _cg1r->hot_card_cache();
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  1456
      if (hot_card_cache->use_cache()) {
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  1457
        hot_card_cache->reset_card_counts();
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  1458
        hot_card_cache->reset_hot_cache();
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1459
      }
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1460
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1461
      // Rebuild remembered sets of all regions.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1462
      if (G1CollectedHeap::use_parallel_gc_threads()) {
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1463
        uint n_workers =
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1464
          AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(),
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1465
                                                  workers()->active_workers(),
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1466
                                                  Threads::number_of_non_daemon_threads());
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1467
        assert(UseDynamicNumberOfGCThreads ||
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1468
               n_workers == workers()->total_workers(),
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1469
               "If not dynamic should be using all the  workers");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1470
        workers()->set_active_workers(n_workers);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1471
        // Set parallel threads in the heap (_n_par_threads) only
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1472
        // before a parallel phase and always reset it to 0 after
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1473
        // the phase so that the number of parallel threads does
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1474
        // no get carried forward to a serial phase where there
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1475
        // may be code that is "possibly_parallel".
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1476
        set_par_threads(n_workers);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1477
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1478
        ParRebuildRSTask rebuild_rs_task(this);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1479
        assert(check_heap_region_claim_values(
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1480
               HeapRegion::InitialClaimValue), "sanity check");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1481
        assert(UseDynamicNumberOfGCThreads ||
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1482
               workers()->active_workers() == workers()->total_workers(),
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1483
               "Unless dynamic should use total workers");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1484
        // Use the most recent number of  active workers
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1485
        assert(workers()->active_workers() > 0,
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1486
               "Active workers not properly set");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1487
        set_par_threads(workers()->active_workers());
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1488
        workers()->run_task(&rebuild_rs_task);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1489
        set_par_threads(0);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1490
        assert(check_heap_region_claim_values(
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1491
               HeapRegion::RebuildRSClaimValue), "sanity check");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1492
        reset_heap_region_claim_values();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1493
      } else {
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1494
        RebuildRSOutOfRegionClosure rebuild_rs(this);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1495
        heap_region_iterate(&rebuild_rs);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1496
      }
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1497
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1498
      if (true) { // FIXME
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1499
        MetaspaceGC::compute_new_size();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1500
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1501
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  1502
#ifdef TRACESPINNING
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1503
      ParallelTaskTerminator::print_termination_counts();
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  1504
#endif
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  1505
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1506
      // Discard all rset updates
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1507
      JavaThread::dirty_card_queue_set().abandon_logs();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1508
      assert(!G1DeferredRSUpdate
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1509
             || (G1DeferredRSUpdate &&
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1510
                (dirty_card_queue_set().completed_buffers_num() == 0)), "Should not be any");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1511
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1512
      _young_list->reset_sampled_info();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1513
      // At this point there should be no regions in the
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1514
      // entire heap tagged as young.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1515
      assert(check_young_list_empty(true /* check_heap */),
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1516
             "young list should be empty at this point");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1517
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1518
      // Update the number of full collections that have been completed.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1519
      increment_old_marking_cycles_completed(false /* concurrent */);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1520
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1521
      _hrs.verify_optional();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1522
      verify_region_sets_optional();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1523
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1524
      // Start a new incremental collection set for the next pause
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1525
      assert(g1_policy()->collection_set() == NULL, "must be");
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1526
      g1_policy()->start_incremental_cset_building();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1527
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1528
      // Clear the _cset_fast_test bitmap in anticipation of adding
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1529
      // regions to the incremental collection set for the next
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1530
      // evacuation pause.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1531
      clear_cset_fast_test();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1532
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1533
      init_mutator_alloc_region();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1534
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1535
      double end = os::elapsedTime();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1536
      g1_policy()->record_full_collection_end();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1537
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1538
      if (G1Log::fine()) {
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1539
        g1_policy()->print_heap_transition();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1540
      }
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1541
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1542
      // We must call G1MonitoringSupport::update_sizes() in the same scoping level
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1543
      // as an active TraceMemoryManagerStats object (i.e. before the destructor for the
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1544
      // TraceMemoryManagerStats is called) so that the G1 memory pools are updated
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1545
      // before any GC notifications are raised.
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1546
      g1mm()->update_sizes();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1547
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1548
      gc_epilogue(true);
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1549
    }
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1550
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1551
    if (G1Log::finer()) {
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1552
      g1_policy()->print_detailed_heap_transition();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1553
    }
12935
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  1554
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  1555
    print_heap_after_gc();
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  1556
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1557
    post_full_gc_dump();
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  1558
  }
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1559
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1560
  return true;
1374
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1563
void G1CollectedHeap::do_full_collection(bool clear_all_soft_refs) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1564
  // do_collection() will return whether it succeeded in performing
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1565
  // the GC. Currently, there is no facility on the
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1566
  // do_full_collection() API to notify the caller than the collection
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1567
  // 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
  1568
  // locker). So, right now, we'll ignore the return value.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1569
  bool dummy = do_collection(true,                /* explicit_gc */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1570
                             clear_all_soft_refs,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1571
                             0                    /* word_size */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1572
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1573
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1574
// This code is mostly copied from TenuredGeneration.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1575
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1576
G1CollectedHeap::
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1577
resize_if_necessary_after_full_collection(size_t word_size) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1578
  assert(MinHeapFreeRatio <= MaxHeapFreeRatio, "sanity check");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1579
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1580
  // Include the current allocation, if any, and bytes that will be
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1581
  // pre-allocated to support collections, as "used".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1582
  const size_t used_after_gc = used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1583
  const size_t capacity_after_gc = capacity();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1584
  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
  1585
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1586
  // This is enforced in arguments.cpp.
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1587
  assert(MinHeapFreeRatio <= MaxHeapFreeRatio,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1588
         "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
  1589
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1590
  // 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
  1591
  const double minimum_free_percentage = (double) MinHeapFreeRatio / 100.0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1592
  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
  1593
  const double maximum_free_percentage = (double) MaxHeapFreeRatio / 100.0;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1594
  const double minimum_used_percentage = 1.0 - maximum_free_percentage;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1595
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1596
  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
  1597
  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
  1598
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1599
  // 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
  1600
  // 32-bit size_t's.
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1601
  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
  1602
  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
  1603
  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
  1604
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1605
  // 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
  1606
  // 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
  1607
  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
  1608
  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
  1609
                                    desired_capacity_upper_bound);
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1610
  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
  1611
                                    desired_capacity_upper_bound);
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1612
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1613
  // 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
  1614
  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
  1615
  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
  1616
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1617
  // 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
  1618
  // 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
  1619
  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
  1620
         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
  1621
                 "maximum_desired_capacity = "SIZE_FORMAT,
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1622
                 minimum_desired_capacity, maximum_desired_capacity));
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1623
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1624
  // 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
  1625
  // 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
  1626
  // 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
  1627
  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
  1628
  // 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
  1629
  // 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
  1630
  // 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
  1631
  maximum_desired_capacity =  MAX2(maximum_desired_capacity, min_heap_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1632
6259
81aec0585307 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 6251
diff changeset
  1633
  if (capacity_after_gc < minimum_desired_capacity) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1634
    // Don't expand unless it's significant
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1635
    size_t expand_bytes = minimum_desired_capacity - capacity_after_gc;
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1636
    ergo_verbose4(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1637
                  "attempt heap expansion",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1638
                  ergo_format_reason("capacity lower than "
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1639
                                     "min desired capacity after Full GC")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1640
                  ergo_format_byte("capacity")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1641
                  ergo_format_byte("occupancy")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1642
                  ergo_format_byte_perc("min desired capacity"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1643
                  capacity_after_gc, used_after_gc,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1644
                  minimum_desired_capacity, (double) MinHeapFreeRatio);
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1645
    expand(expand_bytes);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1646
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1647
    // 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
  1648
  } else if (capacity_after_gc > maximum_desired_capacity) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1649
    // Capacity too large, compute shrinking size
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1650
    size_t shrink_bytes = capacity_after_gc - maximum_desired_capacity;
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1651
    ergo_verbose4(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1652
                  "attempt heap shrinking",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1653
                  ergo_format_reason("capacity higher than "
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1654
                                     "max desired capacity after Full GC")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1655
                  ergo_format_byte("capacity")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1656
                  ergo_format_byte("occupancy")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1657
                  ergo_format_byte_perc("max desired capacity"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1658
                  capacity_after_gc, used_after_gc,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1659
                  maximum_desired_capacity, (double) MaxHeapFreeRatio);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1660
    shrink(shrink_bytes);
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
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1663
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1664
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1665
HeapWord*
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1666
G1CollectedHeap::satisfy_failed_allocation(size_t word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1667
                                           bool* succeeded) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1668
  assert_at_safepoint(true /* should_be_vm_thread */);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1669
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1670
  *succeeded = true;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1671
  // Let's attempt the allocation first.
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1672
  HeapWord* result =
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1673
    attempt_allocation_at_safepoint(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1674
                                 false /* expect_null_mutator_alloc_region */);
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1675
  if (result != NULL) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1676
    assert(*succeeded, "sanity");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1677
    return result;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1678
  }
1374
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
  // 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
  1681
  // incremental pauses.  Therefore, at least for now, we'll favor
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1682
  // 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
  1683
  // do something smarter than full collection to satisfy a failed alloc.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1684
  result = expand_and_allocate(word_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1685
  if (result != NULL) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1686
    assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1687
    return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1688
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1689
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1690
  // 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
  1691
  bool gc_succeeded = do_collection(false, /* explicit_gc */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1692
                                    false, /* clear_all_soft_refs */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1693
                                    word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1694
  if (!gc_succeeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1695
    *succeeded = false;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1696
    return NULL;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1697
  }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1698
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1699
  // Retry the allocation
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1700
  result = attempt_allocation_at_safepoint(word_size,
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1701
                                  true /* expect_null_mutator_alloc_region */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1702
  if (result != NULL) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1703
    assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1704
    return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1705
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1706
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1707
  // Then, try a Full GC that will collect all soft references.
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1708
  gc_succeeded = do_collection(false, /* explicit_gc */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1709
                               true,  /* clear_all_soft_refs */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1710
                               word_size);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1711
  if (!gc_succeeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1712
    *succeeded = false;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1713
    return NULL;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1714
  }
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1715
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1716
  // Retry the allocation once more
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1717
  result = attempt_allocation_at_safepoint(word_size,
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1718
                                  true /* expect_null_mutator_alloc_region */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1719
  if (result != NULL) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1720
    assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1721
    return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1722
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1723
5343
95a5c4b89273 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 5244
diff changeset
  1724
  assert(!collector_policy()->should_clear_all_soft_refs(),
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1725
         "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
  1726
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1727
  // What else?  We might try synchronous finalization later.  If the total
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1728
  // space available is large enough for the allocation, then a more
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1729
  // complete compaction phase than we've tried so far might be
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1730
  // appropriate.
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1731
  assert(*succeeded, "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1732
  return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1733
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1734
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1735
// Attempting to expand the heap sufficiently
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1736
// to support an allocation of the given "word_size".  If
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1737
// successful, perform the allocation and return the address of the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1738
// allocated block, or else "NULL".
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1739
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1740
HeapWord* G1CollectedHeap::expand_and_allocate(size_t word_size) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1741
  assert_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1742
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1743
  verify_region_sets_optional();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  1744
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1745
  size_t expand_bytes = MAX2(word_size * HeapWordSize, MinHeapDeltaBytes);
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1746
  ergo_verbose1(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1747
                "attempt heap expansion",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1748
                ergo_format_reason("allocation request failed")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1749
                ergo_format_byte("allocation request"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1750
                word_size * HeapWordSize);
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1751
  if (expand(expand_bytes)) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1752
    _hrs.verify_optional();
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1753
    verify_region_sets_optional();
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1754
    return attempt_allocation_at_safepoint(word_size,
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  1755
                                 false /* expect_null_mutator_alloc_region */);
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1756
  }
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1757
  return NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1758
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1759
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1760
void G1CollectedHeap::update_committed_space(HeapWord* old_end,
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1761
                                             HeapWord* new_end) {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1762
  assert(old_end != new_end, "don't call this otherwise");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1763
  assert((HeapWord*) _g1_storage.high() == new_end, "invariant");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1764
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1765
  // Update the committed mem region.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1766
  _g1_committed.set_end(new_end);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1767
  // Tell the card table about the update.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1768
  Universe::heap()->barrier_set()->resize_covered_region(_g1_committed);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1769
  // Tell the BOT about the update.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1770
  _bot_shared->resize(_g1_committed.word_size());
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  1771
  // Tell the hot card cache about the update
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  1772
  _cg1r->hot_card_cache()->resize_card_counts(capacity());
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1773
}
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1774
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1775
bool G1CollectedHeap::expand(size_t expand_bytes) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1776
  size_t old_mem_size = _g1_storage.committed_size();
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1777
  size_t aligned_expand_bytes = ReservedSpace::page_align_size_up(expand_bytes);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1778
  aligned_expand_bytes = align_size_up(aligned_expand_bytes,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1779
                                       HeapRegion::GrainBytes);
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1780
  ergo_verbose2(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1781
                "expand the heap",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1782
                ergo_format_byte("requested expansion amount")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1783
                ergo_format_byte("attempted expansion amount"),
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1784
                expand_bytes, aligned_expand_bytes);
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1785
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1786
  // First commit the memory.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1787
  HeapWord* old_end = (HeapWord*) _g1_storage.high();
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1788
  bool successful = _g1_storage.expand_by(aligned_expand_bytes);
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1789
  if (successful) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1790
    // Then propagate this update to the necessary data structures.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1791
    HeapWord* new_end = (HeapWord*) _g1_storage.high();
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1792
    update_committed_space(old_end, new_end);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1793
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1794
    FreeRegionList expansion_list("Local Expansion List");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1795
    MemRegion mr = _hrs.expand_by(old_end, new_end, &expansion_list);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1796
    assert(mr.start() == old_end, "post-condition");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1797
    // mr might be a smaller region than what was requested if
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1798
    // expand_by() was unable to allocate the HeapRegion instances
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1799
    assert(mr.end() <= new_end, "post-condition");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1800
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1801
    size_t actual_expand_bytes = mr.byte_size();
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1802
    assert(actual_expand_bytes <= aligned_expand_bytes, "post-condition");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1803
    assert(actual_expand_bytes == expansion_list.total_capacity_bytes(),
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1804
           "post-condition");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1805
    if (actual_expand_bytes < aligned_expand_bytes) {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1806
      // We could not expand _hrs to the desired size. In this case we
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1807
      // need to shrink the committed space accordingly.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1808
      assert(mr.end() < new_end, "invariant");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1809
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1810
      size_t diff_bytes = aligned_expand_bytes - actual_expand_bytes;
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1811
      // First uncommit the memory.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1812
      _g1_storage.shrink_by(diff_bytes);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1813
      // Then propagate this update to the necessary data structures.
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1814
      update_committed_space(new_end, mr.end());
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1815
    }
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1816
    _free_list.add_as_tail(&expansion_list);
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1817
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1818
    if (_hr_printer.is_active()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1819
      HeapWord* curr = mr.start();
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1820
      while (curr < mr.end()) {
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1821
        HeapWord* curr_end = curr + HeapRegion::GrainWords;
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1822
        _hr_printer.commit(curr, curr_end);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1823
        curr = curr_end;
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1824
      }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1825
      assert(curr == mr.end(), "post-condition");
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1826
    }
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1827
    g1_policy()->record_new_heap_size(n_regions());
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1828
  } else {
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1829
    ergo_verbose0(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1830
                  "did not expand the heap",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1831
                  ergo_format_reason("heap expansion operation failed"));
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1832
    // The expansion of the virtual storage space was unsuccessful.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1833
    // Let's see if it was because we ran out of swap.
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1834
    if (G1ExitOnExpansionFailure &&
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1835
        _g1_storage.uncommitted_size() >= aligned_expand_bytes) {
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1836
      // We had head room...
17087
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16994
diff changeset
  1837
      vm_exit_out_of_memory(aligned_expand_bytes, OOM_MMAP_ERROR, "G1 heap expansion");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1838
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1839
  }
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  1840
  return successful;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1841
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1842
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1843
void G1CollectedHeap::shrink_helper(size_t shrink_bytes) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1844
  size_t old_mem_size = _g1_storage.committed_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1845
  size_t aligned_shrink_bytes =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1846
    ReservedSpace::page_align_size_down(shrink_bytes);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1847
  aligned_shrink_bytes = align_size_down(aligned_shrink_bytes,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1848
                                         HeapRegion::GrainBytes);
17323
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1849
  uint num_regions_to_remove = (uint)(shrink_bytes / HeapRegion::GrainBytes);
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1850
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1851
  uint num_regions_removed = _hrs.shrink_by(num_regions_to_remove);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1852
  HeapWord* old_end = (HeapWord*) _g1_storage.high();
17323
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1853
  size_t shrunk_bytes = num_regions_removed * HeapRegion::GrainBytes;
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1854
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1855
  ergo_verbose3(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1856
                "shrink the heap",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1857
                ergo_format_byte("requested shrinking amount")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1858
                ergo_format_byte("aligned shrinking amount")
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1859
                ergo_format_byte("attempted shrinking amount"),
17323
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1860
                shrink_bytes, aligned_shrink_bytes, shrunk_bytes);
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1861
  if (num_regions_removed > 0) {
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1862
    _g1_storage.shrink_by(shrunk_bytes);
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1863
    HeapWord* new_end = (HeapWord*) _g1_storage.high();
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1864
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1865
    if (_hr_printer.is_active()) {
17323
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1866
      HeapWord* curr = old_end;
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1867
      while (curr > new_end) {
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1868
        HeapWord* curr_end = curr;
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1869
        curr -= HeapRegion::GrainWords;
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1870
        _hr_printer.uncommit(curr, curr_end);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1871
      }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1872
    }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1873
17323
cc153b745ed5 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 17119
diff changeset
  1874
    _expansion_regions += num_regions_removed;
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1875
    update_committed_space(old_end, new_end);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1876
    HeapRegionRemSet::shrink_heap(n_regions());
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  1877
    g1_policy()->record_new_heap_size(n_regions());
10523
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1878
  } else {
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1879
    ergo_verbose0(ErgoHeapSizing,
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1880
                  "did not shrink the heap",
cdb54c167ab0 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 10495
diff changeset
  1881
                  ergo_format_reason("heap shrinking operation failed"));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1882
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1883
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1884
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1885
void G1CollectedHeap::shrink(size_t shrink_bytes) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1886
  verify_region_sets_optional();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1887
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  1888
  // We should only reach here at the end of a Full GC which means we
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  1889
  // should not not be holding to any GC alloc regions. The method
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  1890
  // below will make sure of that and do any remaining clean up.
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  1891
  abandon_gc_alloc_regions();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  1892
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1893
  // Instead of tearing down / rebuilding the free lists here, we
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1894
  // 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
  1895
  // remove only the ones that we need to remove.
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  1896
  tear_down_region_sets(true /* free_list_only */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1897
  shrink_helper(shrink_bytes);
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  1898
  rebuild_region_sets(true /* free_list_only */);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1899
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  1900
  _hrs.verify_optional();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1901
  verify_region_sets_optional();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1902
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1903
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1904
// Public methods.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1905
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1906
#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
  1907
#pragma warning( disable:4355 ) // 'this' : used in base member initializer list
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1908
#endif // _MSC_VER
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1909
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1910
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1911
G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1912
  SharedHeap(policy_),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1913
  _g1_policy(policy_),
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  1914
  _dirty_card_queue_set(false),
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  1915
  _into_cset_dirty_card_queue_set(false),
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1916
  _is_alive_closure_cm(this),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1917
  _is_alive_closure_stw(this),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1918
  _ref_processor_cm(NULL),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  1919
  _ref_processor_stw(NULL),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1920
  _process_strong_tasks(new SubTasksDone(G1H_PS_NumElements)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1921
  _bot_shared(NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1922
  _evac_failure_scan_stack(NULL) ,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1923
  _mark_in_progress(false),
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1924
  _cg1r(NULL), _summary_bytes_used(0),
10671
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
  1925
  _g1mm(NULL),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1926
  _refine_cte_cl(NULL),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1927
  _full_collection(false),
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1928
  _free_list("Master Free List"),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1929
  _secondary_free_list("Secondary Free List"),
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  1930
  _old_set("Old Set"),
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1931
  _humongous_set("Master Humongous Set"),
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  1932
  _free_regions_coming(false),
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1933
  _young_list(new YoungList(this)),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1934
  _gc_time_stamp(0),
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  1935
  _retained_old_gc_alloc_region(NULL),
13466
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  1936
  _survivor_plab_stats(YoungPLABSize, PLABWeight),
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  1937
  _old_plab_stats(OldPLABSize, PLABWeight),
11449
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
  1938
  _expand_heap_after_alloc_failure(true),
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  1939
  _surviving_young_words(NULL),
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  1940
  _old_marking_cycles_started(0),
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  1941
  _old_marking_cycles_completed(0),
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  1942
  _in_cset_fast_test(NULL),
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  1943
  _in_cset_fast_test_base(NULL),
11248
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  1944
  _dirty_cards_region_list(NULL),
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  1945
  _worker_cset_start_region(NULL),
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  1946
  _worker_cset_start_region_time_stamp(NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1947
  _g1h = this; // To catch bugs.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1948
  if (_process_strong_tasks == NULL || !_process_strong_tasks->valid()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1949
    vm_exit_during_initialization("Failed necessary allocation.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1950
  }
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  1951
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  1952
  _humongous_object_threshold_in_words = HeapRegion::GrainWords / 2;
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  1953
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1954
  int n_queues = MAX2((int)ParallelGCThreads, 1);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1955
  _task_queues = new RefToScanQueueSet(n_queues);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1956
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1957
  int n_rem_sets = HeapRegionRemSet::num_par_rem_sets();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1958
  assert(n_rem_sets > 0, "Invariant.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1959
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12935
diff changeset
  1960
  _worker_cset_start_region = NEW_C_HEAP_ARRAY(HeapRegion*, n_queues, mtGC);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12935
diff changeset
  1961
  _worker_cset_start_region_time_stamp = NEW_C_HEAP_ARRAY(unsigned int, n_queues, mtGC);
11248
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  1962
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1963
  for (int i = 0; i < n_queues; i++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1964
    RefToScanQueue* q = new RefToScanQueue();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1965
    q->initialize();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1966
    _task_queues->register_queue(i, q);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1967
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1968
11248
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  1969
  clear_cset_start_regions();
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  1970
13517
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  1971
  // Initialize the G1EvacuationFailureALot counters and flags.
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  1972
  NOT_PRODUCT(reset_evacuation_should_fail();)
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  1973
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1974
  guarantee(_task_queues != NULL, "task_queues allocation failure.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1975
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1976
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1977
jint G1CollectedHeap::initialize() {
4637
af4d405aacc1 6896647: card marks can be deferred too long
ysr
parents: 4481
diff changeset
  1978
  CollectedHeap::pre_initialize();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1979
  os::enable_vtime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1980
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12271
diff changeset
  1981
  G1Log::init();
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12271
diff changeset
  1982
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1983
  // Necessary to satisfy locking discipline assertions.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1984
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1985
  MutexLocker x(Heap_lock);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1986
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1987
  // We have to initialize the printer before committing the heap, as
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1988
  // it will be used then.
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1989
  _hr_printer.set_active(G1PrintHeapRegions);
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  1990
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1991
  // While there are no constraints in the GC code that HeapWordSize
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1992
  // be any particular value, there are multiple other areas in the
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1993
  // 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
  1994
  // cases incorrectly returns the size in wordSize units rather than
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1995
  // HeapWordSize).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1996
  guarantee(HeapWordSize == wordSize, "HeapWordSize must equal wordSize");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1997
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1998
  size_t init_byte_size = collector_policy()->initial_heap_byte_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  1999
  size_t max_byte_size = collector_policy()->max_heap_byte_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2000
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2001
  // Ensure that the sizes are properly aligned.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2002
  Universe::check_alignment(init_byte_size, HeapRegion::GrainBytes, "g1 heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2003
  Universe::check_alignment(max_byte_size, HeapRegion::GrainBytes, "g1 heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2004
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2005
  _cg1r = new ConcurrentG1Refine(this);
1374
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
  // Reserve the maximum.
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2146
diff changeset
  2008
10237
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2009
  // When compressed oops are enabled, the preferred heap base
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2010
  // is calculated by subtracting the requested size from the
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2011
  // 32Gb boundary and using the result as the base address for
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2012
  // heap reservation. If the requested size is not aligned to
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2013
  // HeapRegion::GrainBytes (i.e. the alignment that is passed
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2014
  // into the ReservedHeapSpace constructor) then the actual
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2015
  // base of the reserved heap may end up differing from the
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2016
  // address that was requested (i.e. the preferred heap base).
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2017
  // If this happens then we could end up using a non-optimal
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2018
  // compressed oops mode.
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2019
df347ffafa0d 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 10236
diff changeset
  2020
  // Since max_byte_size is aligned to the size of a heap region (checked
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2021
  // above).
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2022
  Universe::check_alignment(max_byte_size, HeapRegion::GrainBytes, "g1 heap");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2023
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2024
  ReservedSpace heap_rs = Universe::reserve_heap(max_byte_size,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2025
                                                 HeapRegion::GrainBytes);
1374
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
  // 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
  2028
  // temporarily think somethings in the heap.  (I've actually seen this
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2029
  // happen in asserts: DLD.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2030
  _reserved.set_word_size(0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2031
  _reserved.set_start((HeapWord*)heap_rs.base());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2032
  _reserved.set_end((HeapWord*)(heap_rs.base() + heap_rs.size()));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2033
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2034
  _expansion_regions = (uint) (max_byte_size / HeapRegion::GrainBytes);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2035
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2036
  // 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
  2037
  _rem_set = collector_policy()->create_rem_set(_reserved, 2);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2038
  set_barrier_set(rem_set()->bs());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2039
  if (barrier_set()->is_a(BarrierSet::ModRef)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2040
    _mr_bs = (ModRefBarrierSet*)_barrier_set;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2041
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2042
    vm_exit_during_initialization("G1 requires a mod ref bs.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2043
    return JNI_ENOMEM;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2044
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2045
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2046
  // Also create a G1 rem set.
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  2047
  if (mr_bs()->is_a(BarrierSet::CardTableModRef)) {
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  2048
    _g1_rem_set = new G1RemSet(this, (CardTableModRefBS*)mr_bs());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2049
  } else {
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  2050
    vm_exit_during_initialization("G1 requires a cardtable mod ref bs.");
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  2051
    return JNI_ENOMEM;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2052
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2053
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2054
  // Carve out the G1 part of the heap.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2055
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2056
  ReservedSpace g1_rs   = heap_rs.first_part(max_byte_size);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2057
  _g1_reserved = MemRegion((HeapWord*)g1_rs.base(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2058
                           g1_rs.size()/HeapWordSize);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2059
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2060
  _g1_storage.initialize(g1_rs, 0);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2061
  _g1_committed = MemRegion((HeapWord*)_g1_storage.low(), (size_t) 0);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2062
  _hrs.initialize((HeapWord*) _g1_reserved.start(),
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2063
                  (HeapWord*) _g1_reserved.end(),
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2064
                  _expansion_regions);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2065
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2066
  // Do later initialization work for concurrent refinement.
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2067
  _cg1r->init();
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2068
2996
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  2069
  // 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
  2070
  // in the remembered set structures.
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2071
  const uint max_region_idx = (1U << (sizeof(RegionIdx_t)*BitsPerByte-1)) - 1;
2996
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  2072
  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
  2073
1097030e5ec3 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 2883
diff changeset
  2074
  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
  2075
  guarantee(HeapRegion::CardsPerRegion > 0, "make sure it's initialized");
10677
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
  2076
  guarantee(HeapRegion::CardsPerRegion < max_cards_per_region,
3697
ea9211aa02f5 6819085: G1: use larger and/or user settable region size
tonyp
parents: 3696
diff changeset
  2077
            "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
  2078
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2079
  HeapRegionSet::set_unrealistically_long_length(max_regions() + 1);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2080
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2081
  _bot_shared = new G1BlockOffsetSharedArray(_reserved,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2082
                                             heap_word_size(init_byte_size));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2083
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2084
  _g1h = this;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2085
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2086
  _in_cset_fast_test_length = max_regions();
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2087
  _in_cset_fast_test_base =
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12935
diff changeset
  2088
                   NEW_C_HEAP_ARRAY(bool, (size_t) _in_cset_fast_test_length, mtGC);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2089
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2090
  // We're biasing _in_cset_fast_test to avoid subtracting the
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2091
  // beginning of the heap every time we want to index; basically
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2092
  // it's the same with what we do with the card table.
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2093
  _in_cset_fast_test = _in_cset_fast_test_base -
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2094
               ((uintx) _g1_reserved.start() >> HeapRegion::LogOfHRGrainBytes);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2095
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2096
  // Clear the _cset_fast_test bitmap in anticipation of adding
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2097
  // regions to the incremental collection set for the first
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2098
  // evacuation pause.
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2099
  clear_cset_fast_test();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  2100
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2101
  // Create the ConcurrentMark data structure and thread.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2102
  // (Must do this late, so that "max_regions" is defined.)
14740
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14634
diff changeset
  2103
  _cm = new ConcurrentMark(this, heap_rs);
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14634
diff changeset
  2104
  if (_cm == NULL || !_cm->completed_initialization()) {
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14634
diff changeset
  2105
    vm_shutdown_during_initialization("Could not create/initialize ConcurrentMark");
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14634
diff changeset
  2106
    return JNI_ENOMEM;
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14634
diff changeset
  2107
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2108
  _cmThread = _cm->cmThread();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2109
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2110
  // Initialize the from_card cache structure of HeapRegionRemSet.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2111
  HeapRegionRemSet::init_heap(max_regions());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2112
2344
f2e09ba7ceab 6543938: G1: remove the concept of popularity
apetrusenko
parents: 2259
diff changeset
  2113
  // Now expand into the initial heap size.
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  2114
  if (!expand(init_byte_size)) {
14740
1431ef92fed1 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 14634
diff changeset
  2115
    vm_shutdown_during_initialization("Failed to allocate initial heap.");
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  2116
    return JNI_ENOMEM;
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  2117
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2118
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2119
  // Perform any initialization actions delegated to the policy.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2120
  g1_policy()->init();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2121
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2122
  _refine_cte_cl =
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2123
    new RefineCardTableEntryClosure(ConcurrentG1RefineThread::sts(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2124
                                    g1_rem_set(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2125
                                    concurrent_g1_refine());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2126
  JavaThread::dirty_card_queue_set().set_closure(_refine_cte_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2127
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2128
  JavaThread::satb_mark_queue_set().initialize(SATB_Q_CBL_mon,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2129
                                               SATB_Q_FL_lock,
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2130
                                               G1SATBProcessCompletedThreshold,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2131
                                               Shared_SATB_Q_lock);
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2132
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2133
  JavaThread::dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2134
                                                DirtyCardQ_FL_lock,
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2135
                                                concurrent_g1_refine()->yellow_zone(),
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2136
                                                concurrent_g1_refine()->red_zone(),
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2137
                                                Shared_DirtyCardQ_lock);
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  2138
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2139
  if (G1DeferredRSUpdate) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2140
    dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2141
                                      DirtyCardQ_FL_lock,
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2142
                                      -1, // never trigger processing
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  2143
                                      -1, // no limit on length
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2144
                                      Shared_DirtyCardQ_lock,
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2145
                                      &JavaThread::dirty_card_queue_set());
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  2146
  }
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2147
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2148
  // Initialize the card queue set used to hold cards containing
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2149
  // references into the collection set.
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2150
  _into_cset_dirty_card_queue_set.initialize(DirtyCardQ_CBL_mon,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2151
                                             DirtyCardQ_FL_lock,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2152
                                             -1, // never trigger processing
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2153
                                             -1, // no limit on length
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2154
                                             Shared_DirtyCardQ_lock,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2155
                                             &JavaThread::dirty_card_queue_set());
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2156
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2157
  // In case we're keeping closure specialization stats, initialize those
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2158
  // counts and that mechanism.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2159
  SpecializationStats::clear();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2160
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2161
  // Here we allocate the dummy full region that is required by the
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2162
  // G1AllocRegion class. If we don't pass an address in the reserved
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2163
  // space here, lots of asserts fire.
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2164
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2165
  HeapRegion* dummy_region = new_heap_region(0 /* index of bottom region */,
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2166
                                             _g1_reserved.start());
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2167
  // We'll re-use the same region whether the alloc region will
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2168
  // require BOT updates or not and, if it doesn't, then a non-young
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2169
  // region will complain that it cannot support allocations without
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2170
  // BOT updates. So we'll tag the dummy region as young to avoid that.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2171
  dummy_region->set_young();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2172
  // Make sure it's full.
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2173
  dummy_region->set_top(dummy_region->end());
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2174
  G1AllocRegion::setup(this, dummy_region);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2175
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2176
  init_mutator_alloc_region();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2177
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  2178
  // Do create of the monitoring and management support so that
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  2179
  // values in the heap have been properly initialized.
10671
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
  2180
  _g1mm = new G1MonitoringSupport(this);
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  2181
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2182
  return JNI_OK;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2183
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2184
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2185
void G1CollectedHeap::ref_processing_init() {
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2186
  // Reference processing in G1 currently works as follows:
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2187
  //
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2188
  // * There are two reference processor instances. One is
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2189
  //   used to record and process discovered references
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2190
  //   during concurrent marking; the other is used to
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2191
  //   record and process references during STW pauses
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2192
  //   (both full and incremental).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2193
  // * Both ref processors need to 'span' the entire heap as
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2194
  //   the regions in the collection set may be dotted around.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2195
  //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2196
  // * For the concurrent marking ref processor:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2197
  //   * Reference discovery is enabled at initial marking.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2198
  //   * Reference discovery is disabled and the discovered
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2199
  //     references processed etc during remarking.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2200
  //   * Reference discovery is MT (see below).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2201
  //   * Reference discovery requires a barrier (see below).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2202
  //   * Reference processing may or may not be MT
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2203
  //     (depending on the value of ParallelRefProcEnabled
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2204
  //     and ParallelGCThreads).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2205
  //   * A full GC disables reference discovery by the CM
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2206
  //     ref processor and abandons any entries on it's
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2207
  //     discovered lists.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2208
  //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2209
  // * For the STW processor:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2210
  //   * Non MT discovery is enabled at the start of a full GC.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2211
  //   * Processing and enqueueing during a full GC is non-MT.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2212
  //   * During a full GC, references are processed after marking.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2213
  //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2214
  //   * Discovery (may or may not be MT) is enabled at the start
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2215
  //     of an incremental evacuation pause.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2216
  //   * References are processed near the end of a STW evacuation pause.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2217
  //   * For both types of GC:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2218
  //     * Discovery is atomic - i.e. not concurrent.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2219
  //     * Reference discovery will not need a barrier.
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  2220
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2221
  SharedHeap::ref_processing_init();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2222
  MemRegion mr = reserved_region();
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2223
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2224
  // Concurrent Mark ref processor
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2225
  _ref_processor_cm =
8688
493d12ccc6db 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 8680
diff changeset
  2226
    new ReferenceProcessor(mr,    // span
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2227
                           ParallelRefProcEnabled && (ParallelGCThreads > 1),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2228
                                // mt processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2229
                           (int) ParallelGCThreads,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2230
                                // degree of mt processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2231
                           (ParallelGCThreads > 1) || (ConcGCThreads > 1),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2232
                                // mt discovery
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2233
                           (int) MAX2(ParallelGCThreads, ConcGCThreads),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2234
                                // degree of mt discovery
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2235
                           false,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2236
                                // Reference discovery is not atomic
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2237
                           &_is_alive_closure_cm,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2238
                                // is alive closure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2239
                                // (for efficiency/performance)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2240
                           true);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2241
                                // Setting next fields of discovered
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2242
                                // lists requires a barrier.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2243
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2244
  // STW ref processor
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2245
  _ref_processor_stw =
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2246
    new ReferenceProcessor(mr,    // span
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2247
                           ParallelRefProcEnabled && (ParallelGCThreads > 1),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2248
                                // mt processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2249
                           MAX2((int)ParallelGCThreads, 1),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2250
                                // degree of mt processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2251
                           (ParallelGCThreads > 1),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2252
                                // mt discovery
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2253
                           MAX2((int)ParallelGCThreads, 1),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2254
                                // degree of mt discovery
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2255
                           true,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2256
                                // Reference discovery is atomic
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2257
                           &_is_alive_closure_stw,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2258
                                // is alive closure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2259
                                // (for efficiency/performance)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2260
                           false);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2261
                                // Setting next fields of discovered
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  2262
                                // lists requires a barrier.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2263
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2264
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2265
size_t G1CollectedHeap::capacity() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2266
  return _g1_committed.byte_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2267
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2268
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2269
void G1CollectedHeap::reset_gc_time_stamps(HeapRegion* hr) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2270
  assert(!hr->continuesHumongous(), "pre-condition");
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2271
  hr->reset_gc_time_stamp();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2272
  if (hr->startsHumongous()) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2273
    uint first_index = hr->hrs_index() + 1;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2274
    uint last_index = hr->last_hc_index();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2275
    for (uint i = first_index; i < last_index; i += 1) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2276
      HeapRegion* chr = region_at(i);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2277
      assert(chr->continuesHumongous(), "sanity");
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2278
      chr->reset_gc_time_stamp();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2279
    }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2280
  }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2281
}
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2282
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2283
#ifndef PRODUCT
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2284
class CheckGCTimeStampsHRClosure : public HeapRegionClosure {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2285
private:
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2286
  unsigned _gc_time_stamp;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2287
  bool _failures;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2288
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2289
public:
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2290
  CheckGCTimeStampsHRClosure(unsigned gc_time_stamp) :
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2291
    _gc_time_stamp(gc_time_stamp), _failures(false) { }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2292
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2293
  virtual bool doHeapRegion(HeapRegion* hr) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2294
    unsigned region_gc_time_stamp = hr->get_gc_time_stamp();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2295
    if (_gc_time_stamp != region_gc_time_stamp) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2296
      gclog_or_tty->print_cr("Region "HR_FORMAT" has GC time stamp = %d, "
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2297
                             "expected %d", HR_FORMAT_PARAMS(hr),
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2298
                             region_gc_time_stamp, _gc_time_stamp);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2299
      _failures = true;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2300
    }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2301
    return false;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2302
  }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2303
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2304
  bool failures() { return _failures; }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2305
};
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2306
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2307
void G1CollectedHeap::check_gc_time_stamps() {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2308
  CheckGCTimeStampsHRClosure cl(_gc_time_stamp);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2309
  heap_region_iterate(&cl);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2310
  guarantee(!cl.failures(), "all GC time stamps should have been reset");
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2311
}
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2312
#endif // PRODUCT
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2313
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2314
void G1CollectedHeap::iterate_dirty_card_closure(CardTableEntryClosure* cl,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2315
                                                 DirtyCardQueue* into_cset_dcq,
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2316
                                                 bool concurrent,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2317
                                                 int worker_i) {
3589
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  2318
  // Clean cards in the hot card cache
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2319
  G1HotCardCache* hot_card_cache = _cg1r->hot_card_cache();
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  2320
  hot_card_cache->drain(worker_i, g1_rem_set(), into_cset_dcq);
3589
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  2321
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2322
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2323
  int n_completed_buffers = 0;
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
  2324
  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
  2325
    n_completed_buffers++;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2326
  }
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  2327
  g1_policy()->phase_times()->record_update_rs_processed_buffers(worker_i, n_completed_buffers);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2328
  dcqs.clear_n_completed_buffers();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2329
  assert(!dcqs.completed_buffers_exist_dirty(), "Completed buffers exist!");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2330
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2331
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2332
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2333
// Computes the sum of the storage used by the various regions.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2334
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2335
size_t G1CollectedHeap::used() const {
3279
1af8fdb08664 6863216: Clean up debugging debris inadvertently pushed with 6700789
ysr
parents: 3278
diff changeset
  2336
  assert(Heap_lock->owner() != NULL,
1af8fdb08664 6863216: Clean up debugging debris inadvertently pushed with 6700789
ysr
parents: 3278
diff changeset
  2337
         "Should be owned on this thread's behalf.");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2338
  size_t result = _summary_bytes_used;
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2339
  // Read only once in case it is set to NULL concurrently
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2340
  HeapRegion* hr = _mutator_alloc_region.get();
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2341
  if (hr != NULL)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  2342
    result += hr->used();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2343
  return result;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2344
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2345
3263
23d2d46c6d08 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 3262
diff changeset
  2346
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
  2347
  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
  2348
  return result;
23d2d46c6d08 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 3262
diff changeset
  2349
}
23d2d46c6d08 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 3262
diff changeset
  2350
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2351
class SumUsedClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2352
  size_t _used;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2353
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2354
  SumUsedClosure() : _used(0) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2355
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2356
    if (!r->continuesHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2357
      _used += r->used();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2358
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2359
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2360
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2361
  size_t result() { return _used; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2362
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2363
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2364
size_t G1CollectedHeap::recalculate_used() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2365
  SumUsedClosure blk;
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2366
  heap_region_iterate(&blk);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2367
  return blk.result();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2368
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2369
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2370
size_t G1CollectedHeap::unsafe_max_alloc() {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  2371
  if (free_regions() > 0) return HeapRegion::GrainBytes;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2372
  // otherwise, is there space in the current allocation region?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2373
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2374
  // 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
  2375
  // 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
  2376
  // there may be other threads which overwrite the current allocation
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2377
  // region field. attempt_allocation(), for example, sets it to NULL
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2378
  // 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
  2379
  // 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
  2380
  // 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
  2381
  // current allocation region field are optimized away.
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2382
  HeapRegion* hr = _mutator_alloc_region.get();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2383
  if (hr == NULL) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2384
    return 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2385
  }
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2386
  return hr->free();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2387
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2388
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2389
bool G1CollectedHeap::should_do_concurrent_full_gc(GCCause::Cause cause) {
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2390
  switch (cause) {
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2391
    case GCCause::_gc_locker:               return GCLockerInvokesConcurrent;
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2392
    case GCCause::_java_lang_system_gc:     return ExplicitGCInvokesConcurrent;
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2393
    case GCCause::_g1_humongous_allocation: return true;
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2394
    default:                                return false;
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2395
  }
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2396
}
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2397
9334
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2398
#ifndef PRODUCT
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2399
void G1CollectedHeap::allocate_dummy_regions() {
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2400
  // Let's fill up most of the region
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2401
  size_t word_size = HeapRegion::GrainWords - 1024;
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2402
  // And as a result the region we'll allocate will be humongous.
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2403
  guarantee(isHumongous(word_size), "sanity");
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2404
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2405
  for (uintx i = 0; i < G1DummyRegionsPerGC; ++i) {
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2406
    // Let's use the existing mechanism for the allocation
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2407
    HeapWord* dummy_obj = humongous_obj_allocate(word_size);
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2408
    if (dummy_obj != NULL) {
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2409
      MemRegion mr(dummy_obj, word_size);
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2410
      CollectedHeap::fill_with_object(mr);
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2411
    } else {
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2412
      // If we can't allocate once, we probably cannot allocate
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2413
      // again. Let's get out of the loop.
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2414
      break;
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2415
    }
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2416
  }
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2417
}
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2418
#endif // !PRODUCT
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  2419
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2420
void G1CollectedHeap::increment_old_marking_cycles_started() {
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2421
  assert(_old_marking_cycles_started == _old_marking_cycles_completed ||
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2422
    _old_marking_cycles_started == _old_marking_cycles_completed + 1,
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2423
    err_msg("Wrong marking cycle count (started: %d, completed: %d)",
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2424
    _old_marking_cycles_started, _old_marking_cycles_completed));
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2425
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2426
  _old_marking_cycles_started++;
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2427
}
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2428
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2429
void G1CollectedHeap::increment_old_marking_cycles_completed(bool concurrent) {
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2430
  MonitorLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2431
7455
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2432
  // 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
  2433
  // 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
  2434
  // 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
  2435
  // assert here.
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2436
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2437
  // 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
  2438
  // 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
  2439
  // interrupt a concurrent cycle), the number of full collections
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2440
  // 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
  2441
  // 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
  2442
  // behind the number of full collections started.
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2443
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2444
  // 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
  2445
  assert(concurrent ||
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2446
         (_old_marking_cycles_started == _old_marking_cycles_completed + 1) ||
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2447
         (_old_marking_cycles_started == _old_marking_cycles_completed + 2),
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2448
         err_msg("for inner caller (Full GC): _old_marking_cycles_started = %u "
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2449
                 "is inconsistent with _old_marking_cycles_completed = %u",
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2450
                 _old_marking_cycles_started, _old_marking_cycles_completed));
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2451
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2452
  // 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
  2453
  assert(!concurrent ||
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2454
         (_old_marking_cycles_started == _old_marking_cycles_completed + 1),
7455
22e19e8c0beb 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 7420
diff changeset
  2455
         err_msg("for outer caller (concurrent cycle): "
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2456
                 "_old_marking_cycles_started = %u "
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2457
                 "is inconsistent with _old_marking_cycles_completed = %u",
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2458
                 _old_marking_cycles_started, _old_marking_cycles_completed));
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2459
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2460
  _old_marking_cycles_completed += 1;
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2461
6766
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2462
  // 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
  2463
  // we wake up any waiters (especially when ExplicitInvokesConcurrent
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2464
  // 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
  2465
  // 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
  2466
  if (concurrent) {
6766
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2467
    _cmThread->clear_in_progress();
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2468
  }
839211600ad0 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 6759
diff changeset
  2469
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2470
  // 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
  2471
  // System.gc() with (with ExplicitGCInvokesConcurrent set or not)
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2472
  // 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
  2473
  // waiting in VM_G1IncCollectionPause::doit_epilogue().
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2474
  FullGCCount_lock->notify_all();
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2475
}
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2476
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2477
void G1CollectedHeap::collect(GCCause::Cause cause) {
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2478
  assert_heap_not_locked();
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2479
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2480
  unsigned int gc_count_before;
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2481
  unsigned int old_marking_count_before;
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2482
  bool retry_gc;
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2483
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2484
  do {
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2485
    retry_gc = false;
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2486
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2487
    {
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2488
      MutexLocker ml(Heap_lock);
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2489
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2490
      // Read the GC count while holding the Heap_lock
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2491
      gc_count_before = total_collections();
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2492
      old_marking_count_before = _old_marking_cycles_started;
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2493
    }
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2494
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2495
    if (should_do_concurrent_full_gc(cause)) {
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2496
      // Schedule an initial-mark evacuation pause that will start a
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2497
      // concurrent cycle. We're setting word_size to 0 which means that
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2498
      // we are not requesting a post-GC allocation.
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2499
      VM_G1IncCollectionPause op(gc_count_before,
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  2500
                                 0,     /* word_size */
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2501
                                 true,  /* should_initiate_conc_mark */
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2502
                                 g1_policy()->max_pause_time_ms(),
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2503
                                 cause);
12227
371690c4f281 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 11756
diff changeset
  2504
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2505
      VMThread::execute(&op);
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2506
      if (!op.pause_succeeded()) {
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2507
        if (old_marking_count_before == _old_marking_cycles_started) {
12227
371690c4f281 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 11756
diff changeset
  2508
          retry_gc = op.should_retry_gc();
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2509
        } else {
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2510
          // A Full GC happened while we were trying to schedule the
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2511
          // initial-mark GC. No point in starting a new cycle given
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2512
          // that the whole heap was collected anyway.
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2513
        }
12227
371690c4f281 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 11756
diff changeset
  2514
371690c4f281 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 11756
diff changeset
  2515
        if (retry_gc) {
371690c4f281 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 11756
diff changeset
  2516
          if (GC_locker::is_active_and_needs_gc()) {
371690c4f281 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 11756
diff changeset
  2517
            GC_locker::stall_until_clear();
371690c4f281 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 11756
diff changeset
  2518
          }
371690c4f281 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 11756
diff changeset
  2519
        }
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2520
      }
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2521
    } else {
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2522
      if (cause == GCCause::_gc_locker
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2523
          DEBUG_ONLY(|| cause == GCCause::_scavenge_alot)) {
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2524
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2525
        // Schedule a standard evacuation pause. We're setting word_size
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2526
        // to 0 which means that we are not requesting a post-GC allocation.
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2527
        VM_G1IncCollectionPause op(gc_count_before,
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2528
                                   0,     /* word_size */
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2529
                                   false, /* should_initiate_conc_mark */
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2530
                                   g1_policy()->max_pause_time_ms(),
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2531
                                   cause);
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2532
        VMThread::execute(&op);
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2533
      } else {
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2534
        // Schedule a Full GC.
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  2535
        VM_G1CollectFull op(gc_count_before, old_marking_count_before, cause);
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2536
        VMThread::execute(&op);
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2537
      }
4458
075a9ef4e467 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 4100
diff changeset
  2538
    }
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  2539
  } while (retry_gc);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2540
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2541
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2542
bool G1CollectedHeap::is_in(const void* p) const {
11247
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 11176
diff changeset
  2543
  if (_g1_committed.contains(p)) {
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 11176
diff changeset
  2544
    // Given that we know that p is in the committed space,
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 11176
diff changeset
  2545
    // heap_region_containing_raw() should successfully
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 11176
diff changeset
  2546
    // return the containing region.
d6faa02b3802 7121373: Clean up CollectedHeap::is_in
stefank
parents: 11176
diff changeset
  2547
    HeapRegion* hr = heap_region_containing_raw(p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2548
    return hr->is_in(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2549
  } else {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2550
    return false;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2551
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2552
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2553
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2554
// Iteration functions.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2555
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2556
// Iterates an OopClosure over all ref-containing fields of objects
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2557
// within a HeapRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2558
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2559
class IterateOopClosureRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2560
  MemRegion _mr;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2561
  ExtendedOopClosure* _cl;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2562
public:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2563
  IterateOopClosureRegionClosure(MemRegion mr, ExtendedOopClosure* cl)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2564
    : _mr(mr), _cl(cl) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2565
  bool doHeapRegion(HeapRegion* r) {
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2566
    if (!r->continuesHumongous()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2567
      r->oop_iterate(_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2568
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2569
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2570
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2571
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2572
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2573
void G1CollectedHeap::oop_iterate(ExtendedOopClosure* cl) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2574
  IterateOopClosureRegionClosure blk(_g1_committed, cl);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2575
  heap_region_iterate(&blk);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2576
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2577
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2578
void G1CollectedHeap::oop_iterate(MemRegion mr, ExtendedOopClosure* cl) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2579
  IterateOopClosureRegionClosure blk(mr, cl);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2580
  heap_region_iterate(&blk);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2581
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2582
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2583
// Iterates an ObjectClosure over all objects within a HeapRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2584
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2585
class IterateObjectClosureRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2586
  ObjectClosure* _cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2587
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2588
  IterateObjectClosureRegionClosure(ObjectClosure* cl) : _cl(cl) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2589
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2590
    if (! r->continuesHumongous()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2591
      r->object_iterate(_cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2592
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2593
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2594
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2595
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2596
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  2597
void G1CollectedHeap::object_iterate(ObjectClosure* cl) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2598
  IterateObjectClosureRegionClosure blk(cl);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2599
  heap_region_iterate(&blk);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2600
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2601
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2602
void G1CollectedHeap::object_iterate_since_last_GC(ObjectClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2603
  // FIXME: is this right?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2604
  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
  2605
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2606
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2607
// Calls a SpaceClosure on a HeapRegion.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2608
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2609
class SpaceClosureRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2610
  SpaceClosure* _cl;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2611
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2612
  SpaceClosureRegionClosure(SpaceClosure* cl) : _cl(cl) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2613
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2614
    _cl->do_space(r);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2615
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2616
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2617
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2618
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2619
void G1CollectedHeap::space_iterate(SpaceClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2620
  SpaceClosureRegionClosure blk(cl);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2621
  heap_region_iterate(&blk);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2622
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2623
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2624
void G1CollectedHeap::heap_region_iterate(HeapRegionClosure* cl) const {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2625
  _hrs.iterate(cl);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2626
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2627
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2628
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2629
G1CollectedHeap::heap_region_par_iterate_chunked(HeapRegionClosure* cl,
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2630
                                                 uint worker_id,
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  2631
                                                 uint no_of_par_workers,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2632
                                                 jint claim_value) {
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2633
  const uint regions = n_regions();
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  2634
  const uint max_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2635
                             no_of_par_workers :
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2636
                             1);
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2637
  assert(UseDynamicNumberOfGCThreads ||
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2638
         no_of_par_workers == workers()->total_workers(),
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  2639
         "Non dynamic should use fixed number of workers");
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2640
  // try to spread out the starting points of the workers
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2641
  const HeapRegion* start_hr =
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2642
                        start_region_for_worker(worker_id, no_of_par_workers);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2643
  const uint start_index = start_hr->hrs_index();
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2644
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2645
  // each worker will actually look at all regions
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2646
  for (uint count = 0; count < regions; ++count) {
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2647
    const uint index = (start_index + count) % regions;
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2648
    assert(0 <= index && index < regions, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2649
    HeapRegion* r = region_at(index);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2650
    // 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
  2651
    // when we come across their corresponding "start humongous"
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2652
    // region) and regions already claimed
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2653
    if (r->claim_value() == claim_value || r->continuesHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2654
      continue;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2655
    }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2656
    // OK, try to claim it
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2657
    if (r->claimHeapRegion(claim_value)) {
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2658
      // success!
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2659
      assert(!r->continuesHumongous(), "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2660
      if (r->startsHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2661
        // 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
  2662
        // "continues humongous" first; in fact we'll do them
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2663
        // 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
  2664
        // closure on the "starts humongous" region might de-allocate
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2665
        // 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
  2666
        // 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
  2667
        // 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
  2668
        // then we'll do the "starts humongous" region.
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2669
        for (uint ch_index = index + 1; ch_index < regions; ++ch_index) {
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2670
          HeapRegion* chr = region_at(ch_index);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2671
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2672
          // 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
  2673
          // "continues humongous" we're done
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2674
          if (chr->claim_value() == claim_value ||
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2675
              !chr->continuesHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2676
            break;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2677
          }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2678
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2679
          // Noone should have claimed it directly. We can given
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2680
          // that we claimed its "starts humongous" region.
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2681
          assert(chr->claim_value() != claim_value, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2682
          assert(chr->humongous_start_region() == r, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2683
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2684
          if (chr->claimHeapRegion(claim_value)) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2685
            // 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
  2686
            // be trying to claim this region
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2687
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2688
            bool res2 = cl->doHeapRegion(chr);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2689
            assert(!res2, "Should not abort");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2690
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2691
            // 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
  2692
            // does something with "continues humongous" regions
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2693
            // 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
  2694
            // 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
  2695
            assert(chr->continuesHumongous(), "should still be the case");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2696
            assert(chr->humongous_start_region() == r, "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2697
          } else {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2698
            guarantee(false, "we should not reach here");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2699
          }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2700
        }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2701
      }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2702
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2703
      assert(!r->continuesHumongous(), "sanity");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2704
      bool res = cl->doHeapRegion(r);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2705
      assert(!res, "Should not abort");
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2706
    }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2707
  }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2708
}
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2709
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2710
class ResetClaimValuesClosure: public HeapRegionClosure {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2711
public:
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2712
  bool doHeapRegion(HeapRegion* r) {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2713
    r->set_claim_value(HeapRegion::InitialClaimValue);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2714
    return false;
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2715
  }
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2716
};
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2717
11451
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  2718
void G1CollectedHeap::reset_heap_region_claim_values() {
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2719
  ResetClaimValuesClosure blk;
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2720
  heap_region_iterate(&blk);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2721
}
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  2722
11451
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  2723
void G1CollectedHeap::reset_cset_heap_region_claim_values() {
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  2724
  ResetClaimValuesClosure blk;
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  2725
  collection_set_iterate(&blk);
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  2726
}
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  2727
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2728
#ifdef ASSERT
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2729
// 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
  2730
// 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
  2731
// humongous_start_region() information on "continues humongous"
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2732
// regions is correct.
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2733
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2734
class CheckClaimValuesClosure : public HeapRegionClosure {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2735
private:
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2736
  jint _claim_value;
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2737
  uint _failures;
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2738
  HeapRegion* _sh_region;
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2739
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2740
public:
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2741
  CheckClaimValuesClosure(jint claim_value) :
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2742
    _claim_value(claim_value), _failures(0), _sh_region(NULL) { }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2743
  bool doHeapRegion(HeapRegion* r) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2744
    if (r->claim_value() != _claim_value) {
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2745
      gclog_or_tty->print_cr("Region " HR_FORMAT ", "
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2746
                             "claim value = %d, should be %d",
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2747
                             HR_FORMAT_PARAMS(r),
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2748
                             r->claim_value(), _claim_value);
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2749
      ++_failures;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2750
    }
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2751
    if (!r->isHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2752
      _sh_region = NULL;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2753
    } else if (r->startsHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2754
      _sh_region = r;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2755
    } else if (r->continuesHumongous()) {
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2756
      if (r->humongous_start_region() != _sh_region) {
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2757
        gclog_or_tty->print_cr("Region " HR_FORMAT ", "
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2758
                               "HS = "PTR_FORMAT", should be "PTR_FORMAT,
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2759
                               HR_FORMAT_PARAMS(r),
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2760
                               r->humongous_start_region(),
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2761
                               _sh_region);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2762
        ++_failures;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2763
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2764
    }
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2765
    return false;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2766
  }
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2767
  uint failures() { return _failures; }
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2768
};
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2769
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2770
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
  2771
  CheckClaimValuesClosure cl(claim_value);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2772
  heap_region_iterate(&cl);
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2773
  return cl.failures() == 0;
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2774
}
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2775
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2776
class CheckClaimValuesInCSetHRClosure: public HeapRegionClosure {
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2777
private:
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2778
  jint _claim_value;
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2779
  uint _failures;
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2780
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2781
public:
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2782
  CheckClaimValuesInCSetHRClosure(jint claim_value) :
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2783
    _claim_value(claim_value), _failures(0) { }
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2784
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2785
  uint failures() { return _failures; }
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2786
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2787
  bool doHeapRegion(HeapRegion* hr) {
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2788
    assert(hr->in_collection_set(), "how?");
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2789
    assert(!hr->isHumongous(), "H-region in CSet");
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2790
    if (hr->claim_value() != _claim_value) {
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2791
      gclog_or_tty->print_cr("CSet Region " HR_FORMAT ", "
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2792
                             "claim value = %d, should be %d",
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2793
                             HR_FORMAT_PARAMS(hr),
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2794
                             hr->claim_value(), _claim_value);
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2795
      _failures += 1;
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2796
    }
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2797
    return false;
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2798
  }
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2799
};
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2800
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2801
bool G1CollectedHeap::check_cset_heap_region_claim_values(jint claim_value) {
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2802
  CheckClaimValuesInCSetHRClosure cl(claim_value);
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2803
  collection_set_iterate(&cl);
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2804
  return cl.failures() == 0;
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2805
}
1387
580d4ae0a776 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 1386
diff changeset
  2806
#endif // ASSERT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2807
11248
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2808
// Clear the cached CSet starting regions and (more importantly)
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2809
// the time stamps. Called when we reset the GC time stamp.
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2810
void G1CollectedHeap::clear_cset_start_regions() {
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2811
  assert(_worker_cset_start_region != NULL, "sanity");
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2812
  assert(_worker_cset_start_region_time_stamp != NULL, "sanity");
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2813
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2814
  int n_queues = MAX2((int)ParallelGCThreads, 1);
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2815
  for (int i = 0; i < n_queues; i++) {
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2816
    _worker_cset_start_region[i] = NULL;
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2817
    _worker_cset_start_region_time_stamp[i] = 0;
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2818
  }
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2819
}
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2820
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2821
// Given the id of a worker, obtain or calculate a suitable
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2822
// starting region for iterating over the current collection set.
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2823
HeapRegion* G1CollectedHeap::start_cset_region_for_worker(int worker_i) {
11248
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2824
  assert(get_gc_time_stamp() > 0, "should have been updated by now");
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2825
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2826
  HeapRegion* result = NULL;
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2827
  unsigned gc_time_stamp = get_gc_time_stamp();
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2828
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2829
  if (_worker_cset_start_region_time_stamp[worker_i] == gc_time_stamp) {
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2830
    // Cached starting region for current worker was set
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2831
    // during the current pause - so it's valid.
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2832
    // Note: the cached starting heap region may be NULL
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2833
    // (when the collection set is empty).
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2834
    result = _worker_cset_start_region[worker_i];
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2835
    assert(result == NULL || result->in_collection_set(), "sanity");
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2836
    return result;
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2837
  }
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2838
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2839
  // The cached entry was not valid so let's calculate
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2840
  // a suitable starting heap region for this worker.
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2841
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2842
  // We want the parallel threads to start their collection
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2843
  // set iteration at different collection set regions to
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2844
  // avoid contention.
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2845
  // If we have:
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2846
  //          n collection set regions
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2847
  //          p threads
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2848
  // Then thread t will start at region floor ((t * n) / p)
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2849
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2850
  result = g1_policy()->collection_set();
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2851
  if (G1CollectedHeap::use_parallel_gc_threads()) {
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2852
    uint cs_size = g1_policy()->cset_region_length();
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  2853
    uint active_workers = workers()->active_workers();
11248
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2854
    assert(UseDynamicNumberOfGCThreads ||
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2855
             active_workers == workers()->total_workers(),
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2856
             "Unless dynamic should use total workers");
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2857
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2858
    uint end_ind   = (cs_size * worker_i) / active_workers;
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2859
    uint start_ind = 0;
11248
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2860
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2861
    if (worker_i > 0 &&
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2862
        _worker_cset_start_region_time_stamp[worker_i - 1] == gc_time_stamp) {
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2863
      // Previous workers starting region is valid
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2864
      // so let's iterate from there
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2865
      start_ind = (cs_size * (worker_i - 1)) / active_workers;
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2866
      result = _worker_cset_start_region[worker_i - 1];
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2867
    }
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2868
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  2869
    for (uint i = start_ind; i < end_ind; i++) {
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2870
      result = result->next_in_collection_set();
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2871
    }
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2872
  }
11248
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2873
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2874
  // Note: the calculated starting heap region may be NULL
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2875
  // (when the collection set is empty).
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2876
  assert(result == NULL || result->in_collection_set(), "sanity");
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2877
  assert(_worker_cset_start_region_time_stamp[worker_i] != gc_time_stamp,
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2878
         "should be updated only once per pause");
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2879
  _worker_cset_start_region[worker_i] = result;
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2880
  OrderAccess::storestore();
5ff61b0fdf3d 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 11247
diff changeset
  2881
  _worker_cset_start_region_time_stamp[worker_i] = gc_time_stamp;
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2882
  return result;
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2883
}
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  2884
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2885
HeapRegion* G1CollectedHeap::start_region_for_worker(uint worker_i,
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2886
                                                     uint no_of_par_workers) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2887
  uint worker_num =
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2888
           G1CollectedHeap::use_parallel_gc_threads() ? no_of_par_workers : 1U;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2889
  assert(UseDynamicNumberOfGCThreads ||
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2890
         no_of_par_workers == workers()->total_workers(),
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2891
         "Non dynamic should use fixed number of workers");
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2892
  const uint start_index = n_regions() * worker_i / worker_num;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2893
  return region_at(start_index);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2894
}
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  2895
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2896
void G1CollectedHeap::collection_set_iterate(HeapRegionClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2897
  HeapRegion* r = g1_policy()->collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2898
  while (r != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2899
    HeapRegion* next = r->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2900
    if (cl->doHeapRegion(r)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2901
      cl->incomplete();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2902
      return;
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
    r = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2905
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2906
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2907
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2908
void G1CollectedHeap::collection_set_iterate_from(HeapRegion* r,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2909
                                                  HeapRegionClosure *cl) {
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2910
  if (r == NULL) {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2911
    // 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
  2912
    return;
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2913
  }
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  2914
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2915
  assert(r->in_collection_set(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2916
         "Start region must be a member of the collection set.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2917
  HeapRegion* cur = r;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2918
  while (cur != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2919
    HeapRegion* next = cur->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2920
    if (cl->doHeapRegion(cur) && false) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2921
      cl->incomplete();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2922
      return;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2923
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2924
    cur = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2925
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2926
  cur = g1_policy()->collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2927
  while (cur != r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2928
    HeapRegion* next = cur->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2929
    if (cl->doHeapRegion(cur) && false) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2930
      cl->incomplete();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2931
      return;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2932
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2933
    cur = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2934
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2935
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2936
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2937
CompactibleSpace* G1CollectedHeap::first_compactible_space() {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  2938
  return n_regions() > 0 ? region_at(0) : NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2939
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2940
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2941
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2942
Space* G1CollectedHeap::space_containing(const void* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2943
  Space* res = heap_region_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2944
  return res;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2945
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2946
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2947
HeapWord* G1CollectedHeap::block_start(const void* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2948
  Space* sp = space_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2949
  if (sp != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2950
    return sp->block_start(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2951
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2952
  return NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2953
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2954
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2955
size_t G1CollectedHeap::block_size(const HeapWord* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2956
  Space* sp = space_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2957
  assert(sp != NULL, "block_size of address outside of heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2958
  return sp->block_size(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2959
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2960
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2961
bool G1CollectedHeap::block_is_obj(const HeapWord* addr) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2962
  Space* sp = space_containing(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2963
  return sp->block_is_obj(addr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2964
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2965
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2966
bool G1CollectedHeap::supports_tlab_allocation() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2967
  return true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2968
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2969
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2970
size_t G1CollectedHeap::tlab_capacity(Thread* ignored) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2971
  return HeapRegion::GrainBytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2972
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2973
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2974
size_t G1CollectedHeap::unsafe_max_tlab_alloc(Thread* ignored) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2975
  // 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
  2976
  // the min TLAB size.
5078
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2977
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2978
  // 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
  2979
  // 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
  2980
  // humongous objects.
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2981
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2982
  HeapRegion* hr = _mutator_alloc_region.get();
5078
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2983
  size_t max_tlab_size = _humongous_object_threshold_in_words * wordSize;
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2984
  if (hr == NULL) {
5078
e865c7385a24 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 5033
diff changeset
  2985
    return max_tlab_size;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2986
  } else {
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  2987
    return MIN2(MAX2(hr->free(), (size_t) MinTLABSize), max_tlab_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2988
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2989
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2990
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2991
size_t G1CollectedHeap::max_capacity() const {
8103
65eafe3fb3c7 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 8072
diff changeset
  2992
  return _g1_reserved.byte_size();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2993
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2994
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2995
jlong G1CollectedHeap::millis_since_last_gc() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2996
  // assert(false, "NYI");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2997
  return 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2998
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  2999
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3000
void G1CollectedHeap::prepare_for_verify() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3001
  if (SafepointSynchronize::is_at_safepoint() || ! UseTLAB) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3002
    ensure_parsability(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3003
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3004
  g1_rem_set()->prepare_for_verify();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3005
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3006
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3007
bool G1CollectedHeap::allocated_since_marking(oop obj, HeapRegion* hr,
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3008
                                              VerifyOption vo) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3009
  switch (vo) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3010
  case VerifyOption_G1UsePrevMarking:
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3011
    return hr->obj_allocated_since_prev_marking(obj);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3012
  case VerifyOption_G1UseNextMarking:
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3013
    return hr->obj_allocated_since_next_marking(obj);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3014
  case VerifyOption_G1UseMarkWord:
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3015
    return false;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3016
  default:
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3017
    ShouldNotReachHere();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3018
  }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3019
  return false; // keep some compilers happy
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3020
}
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3021
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3022
HeapWord* G1CollectedHeap::top_at_mark_start(HeapRegion* hr, VerifyOption vo) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3023
  switch (vo) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3024
  case VerifyOption_G1UsePrevMarking: return hr->prev_top_at_mark_start();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3025
  case VerifyOption_G1UseNextMarking: return hr->next_top_at_mark_start();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3026
  case VerifyOption_G1UseMarkWord:    return NULL;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3027
  default:                            ShouldNotReachHere();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3028
  }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3029
  return NULL; // keep some compilers happy
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3030
}
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3031
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3032
bool G1CollectedHeap::is_marked(oop obj, VerifyOption vo) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3033
  switch (vo) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3034
  case VerifyOption_G1UsePrevMarking: return isMarkedPrev(obj);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3035
  case VerifyOption_G1UseNextMarking: return isMarkedNext(obj);
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3036
  case VerifyOption_G1UseMarkWord:    return obj->is_gc_marked();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3037
  default:                            ShouldNotReachHere();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3038
  }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3039
  return false; // keep some compilers happy
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3040
}
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3041
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3042
const char* G1CollectedHeap::top_at_mark_start_str(VerifyOption vo) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3043
  switch (vo) {
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3044
  case VerifyOption_G1UsePrevMarking: return "PTAMS";
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3045
  case VerifyOption_G1UseNextMarking: return "NTAMS";
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3046
  case VerifyOption_G1UseMarkWord:    return "NONE";
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3047
  default:                            ShouldNotReachHere();
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3048
  }
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3049
  return NULL; // keep some compilers happy
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3050
}
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3051
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3052
class VerifyLivenessOopClosure: public OopClosure {
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3053
  G1CollectedHeap* _g1h;
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3054
  VerifyOption _vo;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3055
public:
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3056
  VerifyLivenessOopClosure(G1CollectedHeap* g1h, VerifyOption vo):
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3057
    _g1h(g1h), _vo(vo)
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3058
  { }
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3059
  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
  3060
  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
  3061
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3062
  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
  3063
    oop obj = oopDesc::load_decode_heap_oop(p);
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3064
    guarantee(obj == NULL || !_g1h->is_obj_dead_cond(obj, _vo),
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3065
              "Dead object referenced by a not dead object");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3066
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3067
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3068
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3069
class VerifyObjsInRegionClosure: public ObjectClosure {
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  3070
private:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3071
  G1CollectedHeap* _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3072
  size_t _live_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3073
  HeapRegion *_hr;
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3074
  VerifyOption _vo;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3075
public:
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3076
  // _vo == UsePrevMarking -> use "prev" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3077
  // _vo == UseNextMarking -> use "next" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3078
  // _vo == UseMarkWord    -> use mark word from object header.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3079
  VerifyObjsInRegionClosure(HeapRegion *hr, VerifyOption vo)
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3080
    : _live_bytes(0), _hr(hr), _vo(vo) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3081
    _g1h = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3082
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3083
  void do_object(oop o) {
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3084
    VerifyLivenessOopClosure isLive(_g1h, _vo);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3085
    assert(o != NULL, "Huh?");
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3086
    if (!_g1h->is_obj_dead_cond(o, _vo)) {
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3087
      // If the object is alive according to the mark word,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3088
      // then verify that the marking information agrees.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3089
      // Note we can't verify the contra-positive of the
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3090
      // above: if the object is dead (according to the mark
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3091
      // word), it may not be marked, or may have been marked
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3092
      // but has since became dead, or may have been allocated
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3093
      // since the last marking.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3094
      if (_vo == VerifyOption_G1UseMarkWord) {
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3095
        guarantee(!_g1h->is_obj_dead(o), "mark word and concurrent mark mismatch");
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3096
      }
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3097
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3098
      o->oop_iterate_no_header(&isLive);
5345
d3bd6e8757d8 6943926: G1: Integer overflow during heap region verification
johnc
parents: 5344
diff changeset
  3099
      if (!_hr->obj_allocated_since_prev_marking(o)) {
d3bd6e8757d8 6943926: G1: Integer overflow during heap region verification
johnc
parents: 5344
diff changeset
  3100
        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
  3101
        _live_bytes += (obj_size * HeapWordSize);
d3bd6e8757d8 6943926: G1: Integer overflow during heap region verification
johnc
parents: 5344
diff changeset
  3102
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3103
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3104
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3105
  size_t live_bytes() { return _live_bytes; }
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3108
class PrintObjsInRegionClosure : public ObjectClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3109
  HeapRegion *_hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3110
  G1CollectedHeap *_g1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3111
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3112
  PrintObjsInRegionClosure(HeapRegion *hr) : _hr(hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3113
    _g1 = G1CollectedHeap::heap();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3114
  };
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3115
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3116
  void do_object(oop o) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3117
    if (o != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3118
      HeapWord *start = (HeapWord *) o;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3119
      size_t word_sz = o->size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3120
      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
  3121
                          " isMarkedPrev %d isMarkedNext %d isAllocSince %d\n",
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3122
                          (void*) o, word_sz,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3123
                          _g1->isMarkedPrev(o),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3124
                          _g1->isMarkedNext(o),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3125
                          _hr->obj_allocated_since_prev_marking(o));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3126
      HeapWord *end = start + word_sz;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3127
      HeapWord *cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3128
      int *val;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3129
      for (cur = start; cur < end; cur++) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3130
        val = (int *) cur;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3131
        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
  3132
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3133
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3134
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3135
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3136
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3137
class VerifyRegionClosure: public HeapRegionClosure {
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  3138
private:
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3139
  bool             _par;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3140
  VerifyOption     _vo;
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  3141
  bool             _failures;
3000
bbce6052b595 6850846: G1: extend G1 marking verification
tonyp
parents: 2996
diff changeset
  3142
public:
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3143
  // _vo == UsePrevMarking -> use "prev" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3144
  // _vo == UseNextMarking -> use "next" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3145
  // _vo == UseMarkWord    -> use mark word from object header.
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3146
  VerifyRegionClosure(bool par, VerifyOption vo)
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3147
    : _par(par),
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3148
      _vo(vo),
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3149
      _failures(false) {}
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3150
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3151
  bool failures() {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3152
    return _failures;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3153
  }
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3154
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3155
  bool doHeapRegion(HeapRegion* r) {
2249
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  3156
    if (!r->continuesHumongous()) {
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3157
      bool failures = false;
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3158
      r->verify(_vo, &failures);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3159
      if (failures) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3160
        _failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3161
      } else {
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3162
        VerifyObjsInRegionClosure not_dead_yet_cl(r, _vo);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3163
        r->object_iterate(&not_dead_yet_cl);
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3164
        if (_vo != VerifyOption_G1UseNextMarking) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3165
          if (r->max_live_bytes() < not_dead_yet_cl.live_bytes()) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3166
            gclog_or_tty->print_cr("["PTR_FORMAT","PTR_FORMAT"] "
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3167
                                   "max_live_bytes "SIZE_FORMAT" "
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3168
                                   "< calculated "SIZE_FORMAT,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3169
                                   r->bottom(), r->end(),
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3170
                                   r->max_live_bytes(),
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3171
                                 not_dead_yet_cl.live_bytes());
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3172
            _failures = true;
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3173
          }
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3174
        } else {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3175
          // When vo == UseNextMarking we cannot currently do a sanity
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3176
          // check on the live bytes as the calculation has not been
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3177
          // finalized yet.
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3178
        }
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3179
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3180
    }
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3181
    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
  3182
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3183
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3184
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3185
class YoungRefCounterClosure : public OopClosure {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3186
  G1CollectedHeap* _g1h;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3187
  int              _count;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3188
 public:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3189
  YoungRefCounterClosure(G1CollectedHeap* g1h) : _g1h(g1h), _count(0) {}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3190
  void do_oop(oop* p)       { if (_g1h->is_in_young(*p)) { _count++; } }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3191
  void do_oop(narrowOop* p) { ShouldNotReachHere(); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3192
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3193
  int count() { return _count; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3194
  void reset_count() { _count = 0; };
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3195
};
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3196
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3197
class VerifyKlassClosure: public KlassClosure {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3198
  YoungRefCounterClosure _young_ref_counter_closure;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3199
  OopClosure *_oop_closure;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3200
 public:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3201
  VerifyKlassClosure(G1CollectedHeap* g1h, OopClosure* cl) : _young_ref_counter_closure(g1h), _oop_closure(cl) {}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3202
  void do_klass(Klass* k) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3203
    k->oops_do(_oop_closure);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3204
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3205
    _young_ref_counter_closure.reset_count();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3206
    k->oops_do(&_young_ref_counter_closure);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3207
    if (_young_ref_counter_closure.count() > 0) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3208
      guarantee(k->has_modified_oops(), err_msg("Klass %p, has young refs but is not dirty.", k));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3209
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3210
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3211
};
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3212
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3213
// TODO: VerifyRootsClosure extends OopsInGenClosure so that we can
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3214
//       pass it as the perm_blk to SharedHeap::process_strong_roots.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3215
//       When process_strong_roots stop calling perm_blk->younger_refs_iterate
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3216
//       we can change this closure to extend the simpler OopClosure.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3217
class VerifyRootsClosure: public OopsInGenClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3218
private:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3219
  G1CollectedHeap* _g1h;
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3220
  VerifyOption     _vo;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3221
  bool             _failures;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3222
public:
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3223
  // _vo == UsePrevMarking -> use "prev" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3224
  // _vo == UseNextMarking -> use "next" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3225
  // _vo == UseMarkWord    -> use mark word from object header.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3226
  VerifyRootsClosure(VerifyOption vo) :
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3227
    _g1h(G1CollectedHeap::heap()),
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3228
    _vo(vo),
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3229
    _failures(false) { }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3230
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3231
  bool failures() { return _failures; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3232
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3233
  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
  3234
    T heap_oop = oopDesc::load_heap_oop(p);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3235
    if (!oopDesc::is_null(heap_oop)) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3236
      oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3237
      if (_g1h->is_obj_dead_cond(obj, _vo)) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3238
        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
  3239
                              "points to dead obj "PTR_FORMAT, p, (void*) obj);
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3240
        if (_vo == VerifyOption_G1UseMarkWord) {
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3241
          gclog_or_tty->print_cr("  Mark word: "PTR_FORMAT, (void*)(obj->mark()));
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3242
        }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3243
        obj->print_on(gclog_or_tty);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3244
        _failures = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3245
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3246
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3247
  }
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3248
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3249
  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
  3250
  void do_oop(narrowOop* p) { do_oop_nv(p); }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3251
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3252
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3253
// This is the task used for parallel heap verification.
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3254
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3255
class G1ParVerifyTask: public AbstractGangTask {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3256
private:
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3257
  G1CollectedHeap* _g1h;
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3258
  VerifyOption     _vo;
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3259
  bool             _failures;
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3260
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3261
public:
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3262
  // _vo == UsePrevMarking -> use "prev" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3263
  // _vo == UseNextMarking -> use "next" marking information,
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3264
  // _vo == UseMarkWord    -> use mark word from object header.
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3265
  G1ParVerifyTask(G1CollectedHeap* g1h, VerifyOption vo) :
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3266
    AbstractGangTask("Parallel verify task"),
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3267
    _g1h(g1h),
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3268
    _vo(vo),
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3269
    _failures(false) { }
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3270
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3271
  bool failures() {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3272
    return _failures;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3273
  }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3274
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  3275
  void work(uint worker_id) {
2249
fb8abed44792 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 2248
diff changeset
  3276
    HandleMark hm;
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3277
    VerifyRegionClosure blk(true, _vo);
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  3278
    _g1h->heap_region_par_iterate_chunked(&blk, worker_id,
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3279
                                          _g1h->workers()->active_workers(),
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3280
                                          HeapRegion::ParVerifyClaimValue);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3281
    if (blk.failures()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3282
      _failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3283
    }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3284
  }
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3285
};
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3286
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3287
void G1CollectedHeap::verify(bool silent) {
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3288
  verify(silent, VerifyOption_G1UsePrevMarking);
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3289
}
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3290
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3291
void G1CollectedHeap::verify(bool silent,
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3292
                             VerifyOption vo) {
16606
926ac1e006db 8010463: G1: Crashes with -UseTLAB and heap verification
johnc
parents: 16604
diff changeset
  3293
  if (SafepointSynchronize::is_at_safepoint()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3294
    if (!silent) { gclog_or_tty->print("Roots "); }
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3295
    VerifyRootsClosure rootsCl(vo);
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3296
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3297
    assert(Thread::current()->is_VM_thread(),
16606
926ac1e006db 8010463: G1: Crashes with -UseTLAB and heap verification
johnc
parents: 16604
diff changeset
  3298
           "Expected to be executed serially by the VM thread at this point");
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3299
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  3300
    CodeBlobToOopClosure blobsCl(&rootsCl, /*do_marking=*/ false);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3301
    VerifyKlassClosure klassCl(this, &rootsCl);
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3302
9342
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  3303
    // We apply the relevant closures to all the oops in the
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  3304
    // system dictionary, the string table and the code cache.
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  3305
    const int so = SO_AllClasses | SO_Strings | SO_CodeCache;
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3306
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3307
    // Need cleared claim bits for the strong roots processing
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3308
    ClassLoaderDataGraph::clear_claimed_marks();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3309
9342
456b8d0486b5 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 9338
diff changeset
  3310
    process_strong_roots(true,      // activate StrongRootsScope
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3311
                         false,     // we set "is scavenging" to false,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3312
                                    // so we don't reset the dirty cards.
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  3313
                         ScanningOption(so),  // roots scanning options
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3314
                         &rootsCl,
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  3315
                         &blobsCl,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3316
                         &klassCl
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3317
                         );
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  3318
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3319
    bool failures = rootsCl.failures();
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3320
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3321
    if (vo != VerifyOption_G1UseMarkWord) {
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3322
      // If we're verifying during a full GC then the region sets
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3323
      // will have been torn down at the start of the GC. Therefore
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3324
      // verifying the region sets will fail. So we only verify
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3325
      // the region sets when not in a full GC.
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3326
      if (!silent) { gclog_or_tty->print("HeapRegionSets "); }
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3327
      verify_region_sets();
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3328
    }
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3329
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3330
    if (!silent) { gclog_or_tty->print("HeapRegions "); }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3331
    if (GCParallelVerificationEnabled && ParallelGCThreads > 1) {
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3332
      assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3333
             "sanity check");
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3334
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3335
      G1ParVerifyTask task(this, vo);
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3336
      assert(UseDynamicNumberOfGCThreads ||
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3337
        workers()->active_workers() == workers()->total_workers(),
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3338
        "If not dynamic should be using all the workers");
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3339
      int n_workers = workers()->active_workers();
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3340
      set_par_threads(n_workers);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3341
      workers()->run_task(&task);
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3342
      set_par_threads(0);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3343
      if (task.failures()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3344
        failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3345
      }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3346
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3347
      // Checks that the expected amount of parallel work was done.
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3348
      // The implication is that n_workers is > 0.
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3349
      assert(check_heap_region_claim_values(HeapRegion::ParVerifyClaimValue),
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3350
             "sanity check");
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3351
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3352
      reset_heap_region_claim_values();
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3353
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3354
      assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3355
             "sanity check");
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3356
    } else {
12379
2cf45b79ce3a 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 12378
diff changeset
  3357
      VerifyRegionClosure blk(false, vo);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  3358
      heap_region_iterate(&blk);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3359
      if (blk.failures()) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3360
        failures = true;
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3361
      }
1422
9af8f4023912 6752248: G1: introduce parallel heap verification
tonyp
parents: 1387
diff changeset
  3362
    }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3363
    if (!silent) gclog_or_tty->print("RemSet ");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3364
    rem_set()->verify();
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3365
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3366
    if (failures) {
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3367
      gclog_or_tty->print_cr("Heap:");
10997
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3368
      // It helps to have the per-region information in the output to
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3369
      // help us track down what went wrong. This is why we call
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3370
      // print_extended_on() instead of print_on().
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3371
      print_extended_on(gclog_or_tty);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3372
      gclog_or_tty->print_cr("");
5542
be05c5ffe905 6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents: 5540
diff changeset
  3373
#ifndef PRODUCT
4099
77d31ea5a439 6890137: G1: revamp reachable object dump
tonyp
parents: 4023
diff changeset
  3374
      if (VerifyDuringGC && G1VerifyDuringGCPrintReachable) {
5344
f78ef2531f44 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 5343
diff changeset
  3375
        concurrent_mark()->print_reachable("at-verification-failure",
9995
290620c08233 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 9989
diff changeset
  3376
                                           vo, false /* all */);
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3377
      }
5542
be05c5ffe905 6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents: 5540
diff changeset
  3378
#endif
4023
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3379
      gclog_or_tty->flush();
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3380
    }
6c3401503290 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 4022
diff changeset
  3381
    guarantee(!failures, "there should not have been any failures");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3382
  } else {
16606
926ac1e006db 8010463: G1: Crashes with -UseTLAB and heap verification
johnc
parents: 16604
diff changeset
  3383
    if (!silent)
926ac1e006db 8010463: G1: Crashes with -UseTLAB and heap verification
johnc
parents: 16604
diff changeset
  3384
      gclog_or_tty->print("(SKIPPING roots, heapRegionSets, heapRegions, remset) ");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3385
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3386
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3387
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3388
class PrintRegionClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3389
  outputStream* _st;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3390
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3391
  PrintRegionClosure(outputStream* st) : _st(st) {}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3392
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3393
    r->print_on(_st);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3394
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3395
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3396
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3397
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3398
void G1CollectedHeap::print_on(outputStream* st) const {
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3399
  st->print(" %-20s", "garbage-first heap");
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3400
  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
  3401
            capacity()/K, used_unlocked()/K);
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3402
  st->print(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", " INTPTR_FORMAT ")",
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3403
            _g1_storage.low_boundary(),
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3404
            _g1_storage.high(),
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3405
            _g1_storage.high_boundary());
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3406
  st->cr();
10677
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10674
diff changeset
  3407
  st->print("  region size " SIZE_FORMAT "K, ", HeapRegion::GrainBytes / K);
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3408
  uint young_regions = _young_list->length();
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3409
  st->print("%u young (" SIZE_FORMAT "K), ", young_regions,
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3410
            (size_t) young_regions * HeapRegion::GrainBytes / K);
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3411
  uint survivor_regions = g1_policy()->recorded_survivor_regions();
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3412
  st->print("%u survivors (" SIZE_FORMAT "K)", survivor_regions,
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3413
            (size_t) survivor_regions * HeapRegion::GrainBytes / K);
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3414
  st->cr();
14074
8cafb11da0cd 8000358: G1: metaspace information not printed in PrintHeapAtGC output nor in hs_err file
johnc
parents: 13926
diff changeset
  3415
  MetaspaceAux::print_on(st);
10997
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3416
}
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3417
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3418
void G1CollectedHeap::print_extended_on(outputStream* st) const {
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3419
  print_on(st);
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3420
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3421
  // Print the per-region information.
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10996
diff changeset
  3422
  st->cr();
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3423
  st->print_cr("Heap Regions: (Y=young(eden), SU=young(survivor), "
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3424
               "HS=humongous(starts), HC=humongous(continues), "
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3425
               "CS=collection set, F=free, TS=gc time stamp, "
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3426
               "PTAMS=previous top-at-mark-start, "
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3427
               "NTAMS=next top-at-mark-start)");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3428
  PrintRegionClosure blk(st);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  3429
  heap_region_iterate(&blk);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3430
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3431
16685
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16606
diff changeset
  3432
void G1CollectedHeap::print_on_error(outputStream* st) const {
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16606
diff changeset
  3433
  this->CollectedHeap::print_on_error(st);
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16606
diff changeset
  3434
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16606
diff changeset
  3435
  if (_cm != NULL) {
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16606
diff changeset
  3436
    st->cr();
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16606
diff changeset
  3437
    _cm->print_on_error(st);
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16606
diff changeset
  3438
  }
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16606
diff changeset
  3439
}
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 16606
diff changeset
  3440
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3441
void G1CollectedHeap::print_gc_threads_on(outputStream* st) const {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  3442
  if (G1CollectedHeap::use_parallel_gc_threads()) {
4022
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3443
    workers()->print_worker_threads_on(st);
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3444
  }
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3445
  _cmThread->print_on(st);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3446
  st->cr();
4022
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3447
  _cm->print_worker_threads_on(st);
2ec87d5043f7 6885041: G1: inconsistent thread dump
tonyp
parents: 3912
diff changeset
  3448
  _cg1r->print_worker_threads_on(st);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3449
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3450
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3451
void G1CollectedHeap::gc_threads_do(ThreadClosure* tc) const {
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  3452
  if (G1CollectedHeap::use_parallel_gc_threads()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3453
    workers()->threads_do(tc);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3454
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3455
  tc->do_thread(_cmThread);
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
  3456
  _cg1r->threads_do(tc);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3457
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3458
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3459
void G1CollectedHeap::print_tracing_info() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3460
  // We'll overload this to mean "trace GC pause statistics."
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3461
  if (TraceGen0Time || TraceGen1Time) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3462
    // The "G1CollectorPolicy" is keeping track of these stats, so delegate
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3463
    // to that.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3464
    g1_policy()->print_tracing_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3465
  }
2741
34e2a243d69a 6490395: G1: Tidy up command line flags.
johnc
parents: 2345
diff changeset
  3466
  if (G1SummarizeRSetStats) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3467
    g1_rem_set()->print_summary_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3468
  }
5033
55f476a32544 6928059: G1: command line parameter renaming
tonyp
parents: 4902
diff changeset
  3469
  if (G1SummarizeConcMark) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3470
    concurrent_mark()->print_summary_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3471
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3472
  g1_policy()->print_yg_surv_rate_info();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3473
  SpecializationStats::print();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3474
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3475
10000
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3476
#ifndef PRODUCT
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3477
// Helpful for debugging RSet issues.
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3478
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3479
class PrintRSetsClosure : public HeapRegionClosure {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3480
private:
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3481
  const char* _msg;
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3482
  size_t _occupied_sum;
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3483
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3484
public:
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3485
  bool doHeapRegion(HeapRegion* r) {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3486
    HeapRegionRemSet* hrrs = r->rem_set();
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3487
    size_t occupied = hrrs->occupied();
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3488
    _occupied_sum += occupied;
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3489
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3490
    gclog_or_tty->print_cr("Printing RSet for region "HR_FORMAT,
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3491
                           HR_FORMAT_PARAMS(r));
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3492
    if (occupied == 0) {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3493
      gclog_or_tty->print_cr("  RSet is empty");
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3494
    } else {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3495
      hrrs->print();
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3496
    }
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3497
    gclog_or_tty->print_cr("----------");
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3498
    return false;
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3499
  }
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3500
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3501
  PrintRSetsClosure(const char* msg) : _msg(msg), _occupied_sum(0) {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3502
    gclog_or_tty->cr();
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3503
    gclog_or_tty->print_cr("========================================");
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3504
    gclog_or_tty->print_cr(msg);
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3505
    gclog_or_tty->cr();
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3506
  }
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3507
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3508
  ~PrintRSetsClosure() {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3509
    gclog_or_tty->print_cr("Occupied Sum: "SIZE_FORMAT, _occupied_sum);
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3510
    gclog_or_tty->print_cr("========================================");
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3511
    gclog_or_tty->cr();
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3512
  }
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3513
};
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3514
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3515
void G1CollectedHeap::print_cset_rsets() {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3516
  PrintRSetsClosure cl("Printing CSet RSets");
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3517
  collection_set_iterate(&cl);
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3518
}
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3519
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3520
void G1CollectedHeap::print_all_rsets() {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3521
  PrintRSetsClosure cl("Printing All RSets");;
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3522
  heap_region_iterate(&cl);
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3523
}
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3524
#endif // PRODUCT
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3525
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3526
G1CollectedHeap* G1CollectedHeap::heap() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3527
  assert(_sh->kind() == CollectedHeap::G1CollectedHeap,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3528
         "not a garbage-first heap");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3529
  return _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3530
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3531
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3532
void G1CollectedHeap::gc_prologue(bool full /* Ignored */) {
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4637
diff changeset
  3533
  // always_do_update_barrier = false;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3534
  assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3535
  // Call allocation profiler
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3536
  AllocationProfiler::iterate_since_last_gc();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3537
  // Fill TLAB's and such
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3538
  ensure_parsability(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3539
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3540
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3541
void G1CollectedHeap::gc_epilogue(bool full /* Ignored */) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3542
  // FIXME: what is this about?
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3543
  // I'm ignoring the "fill_newgen()" call if "alloc_event_enabled"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3544
  // is set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3545
  COMPILER2_PRESENT(assert(DerivedPointerTable::is_empty(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3546
                        "derived pointer present"));
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4637
diff changeset
  3547
  // always_do_update_barrier = true;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3548
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3549
  // We have just completed a GC. Update the soft reference
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3550
  // policy with the new heap occupancy
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3551
  Universe::update_heap_info_at_gc();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3552
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3553
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3554
HeapWord* G1CollectedHeap::do_collection_pause(size_t word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3555
                                               unsigned int gc_count_before,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3556
                                               bool* succeeded) {
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3557
  assert_heap_not_locked_and_not_at_safepoint();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3558
  g1_policy()->record_stop_world_start();
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3559
  VM_G1IncCollectionPause op(gc_count_before,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3560
                             word_size,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3561
                             false, /* should_initiate_conc_mark */
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3562
                             g1_policy()->max_pause_time_ms(),
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3563
                             GCCause::_g1_inc_collection_pause);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3564
  VMThread::execute(&op);
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3565
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3566
  HeapWord* result = op.result();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3567
  bool ret_succeeded = op.prologue_succeeded() && op.pause_succeeded();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3568
  assert(result == NULL || ret_succeeded,
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3569
         "the result should be NULL if the VM did not succeed");
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3570
  *succeeded = ret_succeeded;
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3571
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3572
  assert_heap_not_locked();
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3573
  return result;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3574
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3575
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3576
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3577
G1CollectedHeap::doConcurrentMark() {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3578
  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
  3579
  if (!_cmThread->in_progress()) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3580
    _cmThread->set_started();
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3581
    CGC_lock->notify();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3582
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3583
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3584
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3585
size_t G1CollectedHeap::pending_card_num() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3586
  size_t extra_cards = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3587
  JavaThread *curr = Threads::first();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3588
  while (curr != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3589
    DirtyCardQueue& dcq = curr->dirty_card_queue();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3590
    extra_cards += dcq.size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3591
    curr = curr->next();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3592
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3593
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3594
  size_t buffer_size = dcqs.buffer_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3595
  size_t buffer_num = dcqs.completed_buffers_num();
13482
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13481
diff changeset
  3596
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13481
diff changeset
  3597
  // PtrQueueSet::buffer_size() and PtrQueue:size() return sizes
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13481
diff changeset
  3598
  // in bytes - not the number of 'entries'. We need to convert
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13481
diff changeset
  3599
  // into a number of cards.
c6b6960549f1 7185699: G1: Prediction model discrepancies
johnc
parents: 13481
diff changeset
  3600
  return (buffer_size * buffer_num + extra_cards) / oopSize;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3601
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3602
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3603
size_t G1CollectedHeap::cards_scanned() {
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6766
diff changeset
  3604
  return g1_rem_set()->cardsScanned();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3605
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3606
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3607
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3608
G1CollectedHeap::setup_surviving_young_words() {
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3609
  assert(_surviving_young_words == NULL, "pre-condition");
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3610
  uint array_length = g1_policy()->young_cset_region_length();
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12935
diff changeset
  3611
  _surviving_young_words = NEW_C_HEAP_ARRAY(size_t, (size_t) array_length, mtGC);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3612
  if (_surviving_young_words == NULL) {
17087
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16994
diff changeset
  3613
    vm_exit_out_of_memory(sizeof(size_t) * array_length, OOM_MALLOC_ERROR,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3614
                          "Not enough space for young surv words summary.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3615
  }
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3616
  memset(_surviving_young_words, 0, (size_t) array_length * sizeof(size_t));
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3617
#ifdef ASSERT
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3618
  for (uint i = 0;  i < array_length; ++i) {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3619
    assert( _surviving_young_words[i] == 0, "memset above" );
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3620
  }
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  3621
#endif // !ASSERT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3622
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3623
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3624
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3625
G1CollectedHeap::update_surviving_young_words(size_t* surv_young_words) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3626
  MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag);
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3627
  uint array_length = g1_policy()->young_cset_region_length();
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3628
  for (uint i = 0; i < array_length; ++i) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3629
    _surviving_young_words[i] += surv_young_words[i];
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  3630
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3631
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3632
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3633
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3634
G1CollectedHeap::cleanup_surviving_young_words() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3635
  guarantee( _surviving_young_words != NULL, "pre-condition" );
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12935
diff changeset
  3636
  FREE_C_HEAP_ARRAY(size_t, _surviving_young_words, mtGC);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3637
  _surviving_young_words = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3638
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3639
10000
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3640
#ifdef ASSERT
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3641
class VerifyCSetClosure: public HeapRegionClosure {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3642
public:
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3643
  bool doHeapRegion(HeapRegion* hr) {
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3644
    // Here we check that the CSet region's RSet is ready for parallel
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3645
    // iteration. The fields that we'll verify are only manipulated
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3646
    // when the region is part of a CSet and is collected. Afterwards,
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3647
    // we reset these fields when we clear the region's RSet (when the
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3648
    // region is freed) so they are ready when the region is
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3649
    // re-allocated. The only exception to this is if there's an
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3650
    // evacuation failure and instead of freeing the region we leave
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3651
    // it in the heap. In that case, we reset these fields during
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3652
    // evacuation failure handling.
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3653
    guarantee(hr->rem_set()->verify_ready_for_par_iteration(), "verification");
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3654
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3655
    // Here's a good place to add any other checks we'd like to
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3656
    // perform on CSet regions.
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3657
    return false;
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3658
  }
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3659
};
10000
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3660
#endif // ASSERT
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  3661
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3662
#if TASKQUEUE_STATS
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3663
void G1CollectedHeap::print_taskqueue_stats_hdr(outputStream* const st) {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3664
  st->print_raw_cr("GC Task Stats");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3665
  st->print_raw("thr "); TaskQueueStats::print_header(1, st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3666
  st->print_raw("--- "); TaskQueueStats::print_header(2, st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3667
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3668
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3669
void G1CollectedHeap::print_taskqueue_stats(outputStream* const st) const {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3670
  print_taskqueue_stats_hdr(st);
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3671
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3672
  TaskQueueStats totals;
6425
206fd9fee2cf 6978300: G1: debug builds crash if ParallelGCThreads==0
jcoomes
parents: 6261
diff changeset
  3673
  const int n = workers() != NULL ? workers()->total_workers() : 1;
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3674
  for (int i = 0; i < n; ++i) {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3675
    st->print("%3d ", i); task_queue(i)->stats.print(st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3676
    totals += task_queue(i)->stats;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3677
  }
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3678
  st->print_raw("tot "); totals.print(st); st->cr();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3679
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3680
  DEBUG_ONLY(totals.verify());
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3681
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3682
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3683
void G1CollectedHeap::reset_taskqueue_stats() {
6425
206fd9fee2cf 6978300: G1: debug builds crash if ParallelGCThreads==0
jcoomes
parents: 6261
diff changeset
  3684
  const int n = workers() != NULL ? workers()->total_workers() : 1;
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3685
  for (int i = 0; i < n; ++i) {
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3686
    task_queue(i)->stats.reset();
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3687
  }
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3688
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3689
#endif // TASKQUEUE_STATS
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  3690
13754
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3691
void G1CollectedHeap::log_gc_header() {
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3692
  if (!G1Log::fine()) {
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3693
    return;
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3694
  }
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3695
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3696
  gclog_or_tty->date_stamp(PrintGCDateStamps);
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3697
  gclog_or_tty->stamp(PrintGCTimeStamps);
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3698
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3699
  GCCauseString gc_cause_str = GCCauseString("GC pause", gc_cause())
15095
8ce5dcdbeb26 8005672: Clean up some changes to GC logging with GCCause's
jmasa
parents: 14740
diff changeset
  3700
    .append(g1_policy()->gcs_are_young() ? "(young)" : "(mixed)")
13754
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3701
    .append(g1_policy()->during_initial_mark_pause() ? " (initial-mark)" : "");
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3702
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3703
  gclog_or_tty->print("[%s", (const char*)gc_cause_str);
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3704
}
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3705
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3706
void G1CollectedHeap::log_gc_footer(double pause_time_sec) {
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3707
  if (!G1Log::fine()) {
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3708
    return;
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3709
  }
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3710
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3711
  if (G1Log::finer()) {
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3712
    if (evacuation_failed()) {
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3713
      gclog_or_tty->print(" (to-space exhausted)");
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3714
    }
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3715
    gclog_or_tty->print_cr(", %3.7f secs]", pause_time_sec);
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3716
    g1_policy()->phase_times()->note_gc_end();
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3717
    g1_policy()->phase_times()->print(pause_time_sec);
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3718
    g1_policy()->print_detailed_heap_transition();
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3719
  } else {
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3720
    if (evacuation_failed()) {
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3721
      gclog_or_tty->print("--");
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3722
    }
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3723
    g1_policy()->print_heap_transition();
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3724
    gclog_or_tty->print_cr(", %3.7f secs]", pause_time_sec);
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3725
  }
14634
fdd9909928ae 8004170: G1: Verbose GC output is not getting flushed to log file using JDK 8
johnc
parents: 14074
diff changeset
  3726
  gclog_or_tty->flush();
13754
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3727
}
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3728
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3729
bool
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3730
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
  3731
  assert_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3732
  guarantee(!is_gc_active(), "collection is not reentrant");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3733
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3734
  if (GC_locker::check_active_before_gc()) {
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  3735
    return false;
5243
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3736
  }
99e5a8f5d81f 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 5078
diff changeset
  3737
7896
08aadd7aa3ee 6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents: 7659
diff changeset
  3738
  SvcGCMarker sgcm(SvcGCMarker::MINOR);
7659
1d92613a1e8a 6896624: G1: hotspot:::gc and hotspot:::mem-pool-gc probes are not fired
tonyp
parents: 7658
diff changeset
  3739
  ResourceMark rm;
1d92613a1e8a 6896624: G1: hotspot:::gc and hotspot:::mem-pool-gc probes are not fired
tonyp
parents: 7658
diff changeset
  3740
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11455
diff changeset
  3741
  print_heap_before_gc();
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3742
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  3743
  HRSPhaseSetter x(HRSPhaseEvacuation);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3744
  verify_region_sets_optional();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  3745
  verify_dirty_young_regions();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3746
11578
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3747
  // This call will decide whether this pause is an initial-mark
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3748
  // pause. If it is, during_initial_mark_pause() will return true
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3749
  // for the duration of this pause.
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3750
  g1_policy()->decide_on_conc_mark_initiation();
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3751
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3752
  // We do not allow initial-mark to be piggy-backed on a mixed GC.
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3753
  assert(!g1_policy()->during_initial_mark_pause() ||
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3754
          g1_policy()->gcs_are_young(), "sanity");
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3755
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3756
  // We also do not allow mixed GCs during marking.
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3757
  assert(!mark_in_progress() || g1_policy()->gcs_are_young(), "sanity");
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3758
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3759
  // Record whether this pause is an initial mark. When the current
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3760
  // thread has completed its logging output and it's safe to signal
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3761
  // the CM thread, the flag's value in the policy has been reset.
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3762
  bool should_start_conc_mark = g1_policy()->during_initial_mark_pause();
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3763
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3764
  // Inner scope for scope based logging, timers, and stats collection
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3765
  {
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3766
    if (g1_policy()->during_initial_mark_pause()) {
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3767
      // 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
  3768
      // full collection counter.
12934
f9bc0e664918 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 12781
diff changeset
  3769
      increment_old_marking_cycles_started();
6058
9c9aec6ab47d 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 5891
diff changeset
  3770
    }
12378
ed44b9ecfa2f 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 12271
diff changeset
  3771
    TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty);
12511
24c75d495b2f 7163848: G1: Log GC Cause for a GC
brutisso
parents: 12508
diff changeset
  3772
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  3773
    int active_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  3774
                                workers()->active_workers() : 1);
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  3775
    double pause_start_sec = os::elapsedTime();
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  3776
    g1_policy()->phase_times()->note_gc_start(active_workers);
13754
81163e1274d7 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 13728
diff changeset
  3777
    log_gc_header();
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3778
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  3779
    TraceCollectorStats tcs(g1mm()->incremental_collection_counters());
9623
151c0b638488 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents: 9424
diff changeset
  3780
    TraceMemoryManagerStats tms(false /* fullGC */, gc_cause());
4459
eb506d590394 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 4458
diff changeset
  3781
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3782
    // If the secondary_free_list is not empty, append it to the
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3783
    // free_list. No need to wait for the cleanup operation to finish;
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3784
    // the region allocation code will check the secondary_free_list
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3785
    // and wait if necessary. If the G1StressConcRegionFreeing flag is
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3786
    // set, skip this step so that the region allocation code has to
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3787
    // get entries from the secondary_free_list.
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3788
    if (!G1StressConcRegionFreeing) {
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  3789
      append_secondary_free_list_if_not_empty_with_lock();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  3790
    }
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3791
10280
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  3792
    assert(check_young_list_well_formed(),
3463715b5ef7 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 10243
diff changeset
  3793
      "young list should be well formed");
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3794
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3795
    // Don't dynamically change the number of GC threads this early.  A value of
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3796
    // 0 is used to indicate serial work.  When parallel work is done,
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3797
    // it will be set.
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  3798
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3799
    { // 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
  3800
      IsGCActiveMark x;
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3801
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3802
      gc_prologue(false);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3803
      increment_total_collections(false /* full gc */);
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  3804
      increment_gc_time_stamp();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3805
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  3806
      verify_before_gc();
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3807
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3808
      COMPILER2_PRESENT(DerivedPointerTable::clear());
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3809
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3810
      // Please see comment in g1CollectedHeap.hpp and
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3811
      // G1CollectedHeap::ref_processing_init() to see how
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3812
      // reference processing currently works in G1.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3813
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3814
      // Enable discovery in the STW reference processor
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3815
      ref_processor_stw()->enable_discovery(true /*verify_disabled*/,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3816
                                            true /*verify_no_refs*/);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3817
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3818
      {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3819
        // We want to temporarily turn off discovery by the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3820
        // CM ref processor, if necessary, and turn it back on
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3821
        // on again later if we do. Using a scoped
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3822
        // NoRefDiscovery object will do this.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3823
        NoRefDiscovery no_cm_discovery(ref_processor_cm());
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3824
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3825
        // Forget the current alloc region (we might even choose it to be part
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3826
        // of the collection set!).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3827
        release_mutator_alloc_region();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3828
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3829
        // We should call this after we retire the mutator alloc
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3830
        // region(s) so that all the ALLOC / RETIRE events are generated
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3831
        // before the start GC event.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3832
        _hr_printer.start_gc(false /* full */, (size_t) total_collections());
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3833
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  3834
        // This timing is only used by the ergonomics to handle our pause target.
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  3835
        // It is unclear why this should not include the full pause. We will
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  3836
        // investigate this in CR 7178365.
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  3837
        //
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  3838
        // Preserving the old comment here if that helps the investigation:
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  3839
        //
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3840
        // The elapsed time induced by the start time below deliberately elides
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3841
        // the possible verification above.
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  3842
        double sample_start_time_sec = os::elapsedTime();
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3843
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3844
#if YOUNG_LIST_VERBOSE
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3845
        gclog_or_tty->print_cr("\nBefore recording pause start.\nYoung_list:");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3846
        _young_list->print();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3847
        g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3848
#endif // YOUNG_LIST_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3849
16993
c9fd6b7ef40e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 16606
diff changeset
  3850
        g1_policy()->record_collection_pause_start(sample_start_time_sec);
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  3851
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  3852
        double scan_wait_start = os::elapsedTime();
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  3853
        // We have to wait until the CM threads finish scanning the
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  3854
        // root regions as it's the only way to ensure that all the
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  3855
        // objects on them have been correctly scanned before we start
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  3856
        // moving them during the GC.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  3857
        bool waited = _cm->root_regions()->wait_until_scan_finished();
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  3858
        double wait_time_ms = 0.0;
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  3859
        if (waited) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  3860
          double scan_wait_end = os::elapsedTime();
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  3861
          wait_time_ms = (scan_wait_end - scan_wait_start) * 1000.0;
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  3862
        }
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  3863
        g1_policy()->phase_times()->record_root_region_scan_wait_time(wait_time_ms);
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  3864
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3865
#if YOUNG_LIST_VERBOSE
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3866
        gclog_or_tty->print_cr("\nAfter recording pause start.\nYoung_list:");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3867
        _young_list->print();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3868
#endif // YOUNG_LIST_VERBOSE
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3869
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3870
        if (g1_policy()->during_initial_mark_pause()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3871
          concurrent_mark()->checkpointRootsInitialPre();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3872
        }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3873
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3874
#if YOUNG_LIST_VERBOSE
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3875
        gclog_or_tty->print_cr("\nBefore choosing collection set.\nYoung_list:");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3876
        _young_list->print();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3877
        g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3878
#endif // YOUNG_LIST_VERBOSE
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3879
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11754
diff changeset
  3880
        g1_policy()->finalize_cset(target_pause_time_ms);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3881
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3882
        _cm->note_start_of_gc();
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3883
        // We should not verify the per-thread SATB buffers given that
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3884
        // we have not filtered them yet (we'll do so during the
11756
28b6fe22e43d 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 11754
diff changeset
  3885
        // GC). We also call this after finalize_cset() to
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3886
        // ensure that the CSet has been finalized.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3887
        _cm->verify_no_cset_oops(true  /* verify_stacks */,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3888
                                 true  /* verify_enqueued_buffers */,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3889
                                 false /* verify_thread_buffers */,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3890
                                 true  /* verify_fingers */);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3891
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3892
        if (_hr_printer.is_active()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3893
          HeapRegion* hr = g1_policy()->collection_set();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3894
          while (hr != NULL) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3895
            G1HRPrinter::RegionType type;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3896
            if (!hr->is_young()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3897
              type = G1HRPrinter::Old;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3898
            } else if (hr->is_survivor()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3899
              type = G1HRPrinter::Survivor;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3900
            } else {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3901
              type = G1HRPrinter::Eden;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3902
            }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3903
            _hr_printer.cset(hr);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3904
            hr = hr->next_in_collection_set();
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  3905
          }
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  3906
        }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3907
10000
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3908
#ifdef ASSERT
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3909
        VerifyCSetClosure cl;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3910
        collection_set_iterate(&cl);
10000
5bbb58b0dbb9 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 9997
diff changeset
  3911
#endif // ASSERT
6249
39460062184b 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 6247
diff changeset
  3912
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3913
        setup_surviving_young_words();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3914
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3915
        // Initialize the GC alloc regions.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3916
        init_gc_alloc_regions();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3917
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3918
        // Actually do the work...
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3919
        evacuate_collection_set();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3920
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3921
        // We do this to mainly verify the per-thread SATB buffers
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3922
        // (which have been filtered by now) since we didn't verify
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3923
        // them earlier. No point in re-checking the stacks / enqueued
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3924
        // buffers given that the CSet has not changed since last time
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3925
        // we checked.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3926
        _cm->verify_no_cset_oops(false /* verify_stacks */,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3927
                                 false /* verify_enqueued_buffers */,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3928
                                 true  /* verify_thread_buffers */,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3929
                                 true  /* verify_fingers */);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  3930
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3931
        free_collection_set(g1_policy()->collection_set());
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3932
        g1_policy()->clear_collection_set();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3933
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3934
        cleanup_surviving_young_words();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3935
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3936
        // Start a new incremental collection set for the next pause.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3937
        g1_policy()->start_incremental_cset_building();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3938
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3939
        // Clear the _cset_fast_test bitmap in anticipation of adding
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3940
        // regions to the incremental collection set for the next
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3941
        // evacuation pause.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3942
        clear_cset_fast_test();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3943
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3944
        _young_list->reset_sampled_info();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3945
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3946
        // Don't check the whole heap at this point as the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3947
        // GC alloc regions from this pause have been tagged
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3948
        // as survivors and moved on to the survivor list.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3949
        // Survivor regions will fail the !is_young() check.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3950
        assert(check_young_list_empty(false /* check_heap */),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3951
          "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
  3952
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3953
#if YOUNG_LIST_VERBOSE
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3954
        gclog_or_tty->print_cr("Before recording survivors.\nYoung List:");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3955
        _young_list->print();
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3956
#endif // YOUNG_LIST_VERBOSE
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3957
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3958
        g1_policy()->record_survivor_regions(_young_list->survivor_length(),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3959
                                            _young_list->first_survivor_region(),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3960
                                            _young_list->last_survivor_region());
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3961
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3962
        _young_list->reset_auxilary_lists();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3963
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3964
        if (evacuation_failed()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3965
          _summary_bytes_used = recalculate_used();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3966
        } else {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3967
          // The "used" of the the collection set have already been subtracted
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3968
          // when they were freed.  Add in the bytes evacuated.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3969
          _summary_bytes_used += g1_policy()->bytes_copied_during_gc();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3970
        }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3971
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3972
        if (g1_policy()->during_initial_mark_pause()) {
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  3973
          // We have to do this before we notify the CM threads that
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  3974
          // they can start working to make sure that all the
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  3975
          // appropriate initialization is done on the CM object.
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3976
          concurrent_mark()->checkpointRootsInitialPost();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3977
          set_marking_started();
11578
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3978
          // Note that we don't actually trigger the CM thread at
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3979
          // this point. We do that later when we're sure that
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  3980
          // the current thread has completed its logging output.
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3981
        }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3982
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3983
        allocate_dummy_regions();
9334
640f1a6f0b85 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 8928
diff changeset
  3984
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3985
#if YOUNG_LIST_VERBOSE
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3986
        gclog_or_tty->print_cr("\nEnd of the pause.\nYoung_list:");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3987
        _young_list->print();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3988
        g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty);
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  3989
#endif // YOUNG_LIST_VERBOSE
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  3990
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3991
        init_mutator_alloc_region();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3992
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3993
        {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3994
          size_t expand_bytes = g1_policy()->expansion_amount();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3995
          if (expand_bytes > 0) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3996
            size_t bytes_before = capacity();
11453
c23a9a0665ce 7125281: G1: heap expansion code is replicated
tonyp
parents: 11452
diff changeset
  3997
            // No need for an ergo verbose message here,
c23a9a0665ce 7125281: G1: heap expansion code is replicated
tonyp
parents: 11452
diff changeset
  3998
            // expansion_amount() does this when it returns a value > 0.
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  3999
            if (!expand(expand_bytes)) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4000
              // We failed to expand the heap so let's verify that
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4001
              // committed/uncommitted amount match the backing store
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4002
              assert(capacity() == _g1_storage.committed_size(), "committed size mismatch");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4003
              assert(max_capacity() == _g1_storage.reserved_size(), "reserved size mismatch");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4004
            }
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  4005
          }
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  4006
        }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4007
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4008
        // We redo the verificaiton but now wrt to the new CSet which
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4009
        // has just got initialized after the previous CSet was freed.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4010
        _cm->verify_no_cset_oops(true  /* verify_stacks */,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4011
                                 true  /* verify_enqueued_buffers */,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4012
                                 true  /* verify_thread_buffers */,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4013
                                 true  /* verify_fingers */);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4014
        _cm->note_end_of_gc();
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4015
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4016
        // This timing is only used by the ergonomics to handle our pause target.
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4017
        // It is unclear why this should not include the full pause. We will
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4018
        // investigate this in CR 7178365.
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4019
        double sample_end_time_sec = os::elapsedTime();
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4020
        double pause_time_ms = (sample_end_time_sec - sample_start_time_sec) * MILLIUNITS;
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4021
        g1_policy()->record_collection_pause_end(pause_time_ms);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4022
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4023
        MemoryService::track_memory_usage();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4024
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4025
        // In prepare_for_verify() below we'll need to scan the deferred
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4026
        // update buffers to bring the RSets up-to-date if
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4027
        // G1HRRSFlushLogBuffersOnVerify has been set. While scanning
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4028
        // the update buffers we'll probably need to scan cards on the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4029
        // regions we just allocated to (i.e., the GC alloc
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4030
        // regions). However, during the last GC we called
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4031
        // set_saved_mark() on all the GC alloc regions, so card
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4032
        // scanning might skip the [saved_mark_word()...top()] area of
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4033
        // those regions (i.e., the area we allocated objects into
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4034
        // during the last GC). But it shouldn't. Given that
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4035
        // saved_mark_word() is conditional on whether the GC time stamp
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4036
        // on the region is current or not, by incrementing the GC time
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4037
        // stamp here we invalidate all the GC time stamps on all the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4038
        // regions and saved_mark_word() will simply return top() for
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4039
        // all the regions. This is a nicer way of ensuring this rather
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4040
        // than iterating over the regions and fixing them. In fact, the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4041
        // GC time stamp increment here also ensures that
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4042
        // saved_mark_word() will return top() between pauses, i.e.,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4043
        // during concurrent refinement. So we don't need the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4044
        // is_gc_active() check to decided which top to use when
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4045
        // scanning cards (see CR 7039627).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4046
        increment_gc_time_stamp();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4047
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  4048
        verify_after_gc();
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4049
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4050
        assert(!ref_processor_stw()->discovery_enabled(), "Postcondition");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4051
        ref_processor_stw()->verify_no_references_recorded();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4052
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4053
        // CM reference discovery will be re-enabled if necessary.
10529
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  4054
      }
9d5bbffbb322 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 10528
diff changeset
  4055
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  4056
      // We should do this after we potentially expand the heap so
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  4057
      // that all the COMMIT events are generated before the end GC
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  4058
      // event, and after we retire the GC alloc regions so that all
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  4059
      // RETIRE events are generated before the end GC event.
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  4060
      _hr_printer.end_gc(false /* full */, (size_t) total_collections());
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  4061
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  4062
      if (mark_in_progress()) {
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  4063
        concurrent_mark()->update_g1_committed();
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  4064
      }
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  4065
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  4066
#ifdef TRACESPINNING
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  4067
      ParallelTaskTerminator::print_termination_counts();
2010
c13462bbad17 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 2009
diff changeset
  4068
#endif
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4069
3191
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  4070
      gc_epilogue(false);
dd3cc90b9951 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 3000
diff changeset
  4071
    }
12935
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4072
14634
fdd9909928ae 8004170: G1: Verbose GC output is not getting flushed to log file using JDK 8
johnc
parents: 14074
diff changeset
  4073
    // Print the remainder of the GC log output.
fdd9909928ae 8004170: G1: Verbose GC output is not getting flushed to log file using JDK 8
johnc
parents: 14074
diff changeset
  4074
    log_gc_footer(os::elapsedTime() - pause_start_sec);
fdd9909928ae 8004170: G1: Verbose GC output is not getting flushed to log file using JDK 8
johnc
parents: 14074
diff changeset
  4075
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4076
    // It is not yet to safe to tell the concurrent mark to
12935
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4077
    // start as we have some optional output below. We don't want the
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4078
    // output from the concurrent mark thread interfering with this
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4079
    // logging output either.
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4080
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4081
    _hrs.verify_optional();
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4082
    verify_region_sets_optional();
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4083
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4084
    TASKQUEUE_STATS_ONLY(if (ParallelGCVerbose) print_taskqueue_stats());
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4085
    TASKQUEUE_STATS_ONLY(reset_taskqueue_stats());
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4086
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4087
    print_heap_after_gc();
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4088
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4089
    // We must call G1MonitoringSupport::update_sizes() in the same scoping level
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4090
    // as an active TraceMemoryManagerStats object (i.e. before the destructor for the
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4091
    // TraceMemoryManagerStats is called) so that the G1 memory pools are updated
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4092
    // before any GC notifications are raised.
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4093
    g1mm()->update_sizes();
2ae81fce3911 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 12934
diff changeset
  4094
  }
9338
05ee447bd420 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 9334
diff changeset
  4095
3584
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  4096
  if (G1SummarizeRSetStats &&
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  4097
      (G1SummarizeRSetStatsPeriod > 0) &&
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  4098
      (total_collections() % G1SummarizeRSetStatsPeriod == 0)) {
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  4099
    g1_rem_set()->print_summary_info();
42c1f7bbffa4 6866591: G1: print update buffer processing stats more often
tonyp
parents: 3583
diff changeset
  4100
  }
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  4101
11578
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4102
  // It should now be safe to tell the concurrent mark thread to start
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4103
  // without its logging output interfering with the logging output
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4104
  // that came from the pause.
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4105
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4106
  if (should_start_conc_mark) {
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4107
    // CAUTION: after the doConcurrentMark() call below,
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4108
    // the concurrent marking thread(s) could be running
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4109
    // concurrently with us. Make sure that anything after
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4110
    // this point does not assume that we are the only GC thread
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4111
    // running. Note: of course, the actual marking work will
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4112
    // not start until the safepoint itself is released in
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4113
    // ConcurrentGCThread::safepoint_desynchronize().
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4114
    doConcurrentMark();
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4115
  }
fc6f77eca886 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 11576
diff changeset
  4116
7398
e4aa6d9bda09 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 7397
diff changeset
  4117
  return true;
1374
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
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4120
size_t G1CollectedHeap::desired_plab_sz(GCAllocPurpose purpose)
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4121
{
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4122
  size_t gclab_word_size;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4123
  switch (purpose) {
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4124
    case GCAllocForSurvived:
13466
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4125
      gclab_word_size = _survivor_plab_stats.desired_plab_sz();
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4126
      break;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4127
    case GCAllocForTenured:
13466
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4128
      gclab_word_size = _old_plab_stats.desired_plab_sz();
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4129
      break;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4130
    default:
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4131
      assert(false, "unknown GCAllocPurpose");
13466
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4132
      gclab_word_size = _old_plab_stats.desired_plab_sz();
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4133
      break;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4134
  }
13466
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4135
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4136
  // Prevent humongous PLAB sizes for two reasons:
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4137
  // * PLABs are allocated using a similar paths as oops, but should
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4138
  //   never be in a humongous region
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4139
  // * Allowing humongous PLABs needlessly churns the region free lists
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4140
  return MIN2(_humongous_object_threshold_in_words, gclab_word_size);
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4141
}
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4142
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  4143
void G1CollectedHeap::init_mutator_alloc_region() {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  4144
  assert(_mutator_alloc_region.get() == NULL, "pre-condition");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  4145
  _mutator_alloc_region.init();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  4146
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  4147
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  4148
void G1CollectedHeap::release_mutator_alloc_region() {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  4149
  _mutator_alloc_region.release();
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  4150
  assert(_mutator_alloc_region.get() == NULL, "post-condition");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  4151
}
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4152
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4153
void G1CollectedHeap::init_gc_alloc_regions() {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4154
  assert_at_safepoint(true /* should_be_vm_thread */);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4155
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4156
  _survivor_gc_alloc_region.init();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4157
  _old_gc_alloc_region.init();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4158
  HeapRegion* retained_region = _retained_old_gc_alloc_region;
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4159
  _retained_old_gc_alloc_region = NULL;
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4160
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4161
  // We will discard the current GC alloc region if:
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4162
  // a) it's in the collection set (it can happen!),
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4163
  // b) it's already full (no point in using it),
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4164
  // c) it's empty (this means that it was emptied during
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4165
  // a cleanup and it should be on the free list now), or
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4166
  // d) it's humongous (this means that it was emptied
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4167
  // during a cleanup and was added to the free list, but
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4168
  // has been subseqently used to allocate a humongous
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4169
  // object that may be less than the region size).
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4170
  if (retained_region != NULL &&
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4171
      !retained_region->in_collection_set() &&
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4172
      !(retained_region->top() == retained_region->end()) &&
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4173
      !retained_region->is_empty() &&
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4174
      !retained_region->isHumongous()) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4175
    retained_region->set_saved_mark();
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  4176
    // The retained region was added to the old region set when it was
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  4177
    // retired. We have to remove it now, since we don't allow regions
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  4178
    // we allocate to in the region sets. We'll re-add it later, when
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  4179
    // it's retired again.
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  4180
    _old_set.remove(retained_region);
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4181
    bool during_im = g1_policy()->during_initial_mark_pause();
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4182
    retained_region->note_start_of_copying(during_im);
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4183
    _old_gc_alloc_region.set(retained_region);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4184
    _hr_printer.reuse(retained_region);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4185
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4186
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4187
13926
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  4188
void G1CollectedHeap::release_gc_alloc_regions(uint no_of_gc_workers) {
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4189
  _survivor_gc_alloc_region.release();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4190
  // If we have an old GC alloc region to release, we'll save it in
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4191
  // _retained_old_gc_alloc_region. If we don't
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4192
  // _retained_old_gc_alloc_region will become NULL. This is what we
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4193
  // want either way so no reason to check explicitly for either
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4194
  // condition.
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4195
  _retained_old_gc_alloc_region = _old_gc_alloc_region.release();
13466
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4196
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4197
  if (ResizePLAB) {
13926
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  4198
    _survivor_plab_stats.adjust_desired_plab_sz(no_of_gc_workers);
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  4199
    _old_plab_stats.adjust_desired_plab_sz(no_of_gc_workers);
13466
9fdf353d5f4c 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 13336
diff changeset
  4200
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4201
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4202
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4203
void G1CollectedHeap::abandon_gc_alloc_regions() {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4204
  assert(_survivor_gc_alloc_region.get() == NULL, "pre-condition");
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4205
  assert(_old_gc_alloc_region.get() == NULL, "pre-condition");
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4206
  _retained_old_gc_alloc_region = NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4207
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4208
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4209
void G1CollectedHeap::init_for_evac_failure(OopsInHeapRegionClosure* cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4210
  _drain_in_progress = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4211
  set_evac_failure_closure(cl);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12935
diff changeset
  4212
  _evac_failure_scan_stack = new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(40, true);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4213
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4214
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4215
void G1CollectedHeap::finalize_for_evac_failure() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4216
  assert(_evac_failure_scan_stack != NULL &&
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4217
         _evac_failure_scan_stack->length() == 0,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4218
         "Postcondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4219
  assert(!_drain_in_progress, "Postcondition");
4100
4f43ba12619a 6870843: G1: G1 GC memory leak
apetrusenko
parents: 4099
diff changeset
  4220
  delete _evac_failure_scan_stack;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4221
  _evac_failure_scan_stack = NULL;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4222
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4223
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4224
void G1CollectedHeap::remove_self_forwarding_pointers() {
11451
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4225
  assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity");
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4226
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4227
  G1ParRemoveSelfForwardPtrsTask rsfp_task(this);
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4228
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4229
  if (G1CollectedHeap::use_parallel_gc_threads()) {
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4230
    set_par_threads();
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4231
    workers()->run_task(&rsfp_task);
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4232
    set_par_threads(0);
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  4233
  } else {
11451
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4234
    rsfp_task.work(0);
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4235
  }
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4236
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4237
  assert(check_cset_heap_region_claim_values(HeapRegion::ParEvacFailureClaimValue), "sanity");
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4238
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4239
  // Reset the claim values in the regions in the collection set.
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4240
  reset_cset_heap_region_claim_values();
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4241
9c9aa4d85660 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 11449
diff changeset
  4242
  assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4243
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4244
  // Now restore saved marks, if any.
15608
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4245
  assert(_objs_with_preserved_marks.size() ==
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4246
            _preserved_marks_of_objs.size(), "Both or none.");
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4247
  while (!_objs_with_preserved_marks.is_empty()) {
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4248
    oop obj = _objs_with_preserved_marks.pop();
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4249
    markOop m = _preserved_marks_of_objs.pop();
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4250
    obj->set_mark(m);
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4251
  }
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4252
  _objs_with_preserved_marks.clear(true);
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4253
  _preserved_marks_of_objs.clear(true);
1374
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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4256
void G1CollectedHeap::push_on_evac_failure_scan_stack(oop obj) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4257
  _evac_failure_scan_stack->push(obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4258
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4259
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4260
void G1CollectedHeap::drain_evac_failure_scan_stack() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4261
  assert(_evac_failure_scan_stack != NULL, "precondition");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4262
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4263
  while (_evac_failure_scan_stack->length() > 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4264
     oop obj = _evac_failure_scan_stack->pop();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4265
     _evac_failure_closure->set_region(heap_region_containing(obj));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4266
     obj->oop_iterate_backwards(_evac_failure_closure);
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
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4269
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4270
oop
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4271
G1CollectedHeap::handle_evacuation_failure_par(OopsInHeapRegionClosure* cl,
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4272
                                               oop old) {
9424
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4273
  assert(obj_in_cs(old),
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4274
         err_msg("obj: "PTR_FORMAT" should still be in the CSet",
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4275
                 (HeapWord*) old));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4276
  markOop m = old->mark();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4277
  oop forward_ptr = old->forward_to_atomic(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4278
  if (forward_ptr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4279
    // Forward-to-self succeeded.
10664
702062c83bd7 7092412: G1: Some roots not marked during an initial mark that gets an evacuation failure
johnc
parents: 10529
diff changeset
  4280
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4281
    if (_evac_failure_closure != cl) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4282
      MutexLockerEx x(EvacFailureStack_lock, Mutex::_no_safepoint_check_flag);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4283
      assert(!_drain_in_progress,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4284
             "Should only be true while someone holds the lock.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4285
      // Set the global evac-failure closure to the current thread's.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4286
      assert(_evac_failure_closure == NULL, "Or locking has failed.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4287
      set_evac_failure_closure(cl);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4288
      // Now do the common part.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4289
      handle_evacuation_failure_common(old, m);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4290
      // Reset to NULL.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4291
      set_evac_failure_closure(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4292
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4293
      // The lock is already held, and this is recursive.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4294
      assert(_drain_in_progress, "This should only be the recursive case.");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4295
      handle_evacuation_failure_common(old, m);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4296
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4297
    return old;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4298
  } else {
9424
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4299
    // Forward-to-self failed. Either someone else managed to allocate
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4300
    // space for this object (old != forward_ptr) or they beat us in
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4301
    // self-forwarding it (old == forward_ptr).
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4302
    assert(old == forward_ptr || !obj_in_cs(forward_ptr),
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4303
           err_msg("obj: "PTR_FORMAT" forwarded to: "PTR_FORMAT" "
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4304
                   "should not be in the CSet",
acac49575ea0 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 9418
diff changeset
  4305
                   (HeapWord*) old, (HeapWord*) forward_ptr));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4306
    return forward_ptr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4307
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4308
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4309
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4310
void G1CollectedHeap::handle_evacuation_failure_common(oop old, markOop m) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4311
  set_evacuation_failed(true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4312
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4313
  preserve_mark_if_necessary(old, m);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4314
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4315
  HeapRegion* r = heap_region_containing(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4316
  if (!r->evacuation_failed()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4317
    r->set_evacuation_failed(true);
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  4318
    _hr_printer.evac_failure(r);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4319
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4320
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4321
  push_on_evac_failure_scan_stack(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4322
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4323
  if (!_drain_in_progress) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4324
    // prevent recursion in copy_to_survivor_space()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4325
    _drain_in_progress = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4326
    drain_evac_failure_scan_stack();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4327
    _drain_in_progress = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4328
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4329
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4330
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4331
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
  4332
  assert(evacuation_failed(), "Oversaving!");
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7657
diff changeset
  4333
  // 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
  4334
  // case of a promotion failure.
b970e410547a 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 7657
diff changeset
  4335
  if (m->must_be_preserved_for_promotion_failure(obj)) {
15608
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4336
    _objs_with_preserved_marks.push(obj);
a1fd1fc60c7d 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 15095
diff changeset
  4337
    _preserved_marks_of_objs.push(m);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4338
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4339
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4340
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4341
HeapWord* G1CollectedHeap::par_allocate_during_gc(GCAllocPurpose purpose,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4342
                                                  size_t word_size) {
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4343
  if (purpose == GCAllocForSurvived) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4344
    HeapWord* result = survivor_attempt_allocation(word_size);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4345
    if (result != NULL) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4346
      return result;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4347
    } else {
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4348
      // Let's try to allocate in the old gen in case we can fit the
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4349
      // object there.
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4350
      return old_attempt_allocation(word_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4351
    }
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4352
  } else {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4353
    assert(purpose ==  GCAllocForTenured, "sanity");
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4354
    HeapWord* result = old_attempt_allocation(word_size);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4355
    if (result != NULL) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4356
      return result;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4357
    } else {
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4358
      // Let's try to allocate in the survivors in case we can fit the
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4359
      // object there.
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4360
      return survivor_attempt_allocation(word_size);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4361
    }
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4362
  }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4363
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4364
  ShouldNotReachHere();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4365
  // Trying to keep some compilers happy.
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  4366
  return NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4367
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4368
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4369
G1ParGCAllocBuffer::G1ParGCAllocBuffer(size_t gclab_word_size) :
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4370
  ParGCAllocBuffer(gclab_word_size), _retired(false) { }
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4371
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11581
diff changeset
  4372
G1ParScanThreadState::G1ParScanThreadState(G1CollectedHeap* g1h, uint queue_num)
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4373
  : _g1h(g1h),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4374
    _refs(g1h->task_queue(queue_num)),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4375
    _dcq(&g1h->dirty_card_queue_set()),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4376
    _ct_bs((CardTableModRefBS*)_g1h->barrier_set()),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4377
    _g1_rem(g1h->g1_rem_set()),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4378
    _hash_seed(17), _queue_num(queue_num),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4379
    _term_attempts(0),
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4380
    _surviving_alloc_buffer(g1h->desired_plab_sz(GCAllocForSurvived)),
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4381
    _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
  4382
    _age_table(false),
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4383
    _strong_roots_time(0), _term_time(0),
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4384
    _alloc_buffer_waste(0), _undo_waste(0) {
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4385
  // we allocate G1YoungSurvRateNumRegions plus one entries, since
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4386
  // 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
  4387
  // non-young regions (where the age is -1)
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4388
  // 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
  4389
  // an attempt to eliminate cache contention
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  4390
  uint real_length = 1 + _g1h->g1_policy()->young_cset_region_length();
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  4391
  uint array_length = PADDING_ELEM_NUM +
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  4392
                      real_length +
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  4393
                      PADDING_ELEM_NUM;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12935
diff changeset
  4394
  _surviving_young_words_base = NEW_C_HEAP_ARRAY(size_t, array_length, mtGC);
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4395
  if (_surviving_young_words_base == NULL)
17087
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16994
diff changeset
  4396
    vm_exit_out_of_memory(array_length * sizeof(size_t), OOM_MALLOC_ERROR,
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4397
                          "Not enough space for young surv histo.");
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4398
  _surviving_young_words = _surviving_young_words_base + PADDING_ELEM_NUM;
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  4399
  memset(_surviving_young_words, 0, (size_t) real_length * sizeof(size_t));
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4400
5347
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4401
  _alloc_buffers[GCAllocForSurvived] = &_surviving_alloc_buffer;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4402
  _alloc_buffers[GCAllocForTenured]  = &_tenured_alloc_buffer;
1de2255c6c2e 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 5346
diff changeset
  4403
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4404
  _start = os::elapsedTime();
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4405
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4406
6251
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4407
void
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4408
G1ParScanThreadState::print_termination_stats_hdr(outputStream* const st)
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4409
{
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4410
  st->print_raw_cr("GC Termination Stats");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4411
  st->print_raw_cr("     elapsed  --strong roots-- -------termination-------"
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4412
                   " ------waste (KiB)------");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4413
  st->print_raw_cr("thr     ms        ms      %        ms      %    attempts"
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4414
                   "  total   alloc    undo");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4415
  st->print_raw_cr("--- --------- --------- ------ --------- ------ --------"
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4416
                   " ------- ------- -------");
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4417
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4418
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4419
void
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4420
G1ParScanThreadState::print_termination_stats(int i,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4421
                                              outputStream* const st) const
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4422
{
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4423
  const double elapsed_ms = elapsed_time() * 1000.0;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4424
  const double s_roots_ms = strong_roots_time() * 1000.0;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4425
  const double term_ms    = term_time() * 1000.0;
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4426
  st->print_cr("%3d %9.2f %9.2f %6.2f "
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4427
               "%9.2f %6.2f " SIZE_FORMAT_W(8) " "
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4428
               SIZE_FORMAT_W(7) " " SIZE_FORMAT_W(7) " " SIZE_FORMAT_W(7),
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4429
               i, elapsed_ms, s_roots_ms, s_roots_ms * 100 / elapsed_ms,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4430
               term_ms, term_ms * 100 / elapsed_ms, term_attempts(),
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4431
               (alloc_buffer_waste() + undo_waste()) * HeapWordSize / K,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4432
               alloc_buffer_waste() * HeapWordSize / K,
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4433
               undo_waste() * HeapWordSize / K);
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4434
}
90e562b9f1cc 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 6249
diff changeset
  4435
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4436
#ifdef ASSERT
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4437
bool G1ParScanThreadState::verify_ref(narrowOop* ref) const {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4438
  assert(ref != NULL, "invariant");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4439
  assert(UseCompressedOops, "sanity");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4440
  assert(!has_partial_array_mask(ref), err_msg("ref=" PTR_FORMAT, ref));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4441
  oop p = oopDesc::load_decode_heap_oop(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4442
  assert(_g1h->is_in_g1_reserved(p),
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4443
         err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4444
  return true;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4445
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4446
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4447
bool G1ParScanThreadState::verify_ref(oop* ref) const {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4448
  assert(ref != NULL, "invariant");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4449
  if (has_partial_array_mask(ref)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4450
    // Must be in the collection set--it's already been copied.
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4451
    oop p = clear_partial_array_mask(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4452
    assert(_g1h->obj_in_cs(p),
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4453
           err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4454
  } else {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4455
    oop p = oopDesc::load_decode_heap_oop(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4456
    assert(_g1h->is_in_g1_reserved(p),
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4457
           err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4458
  }
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4459
  return true;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4460
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4461
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4462
bool G1ParScanThreadState::verify_task(StarTask ref) const {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4463
  if (ref.is_narrow()) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4464
    return verify_ref((narrowOop*) ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4465
  } else {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4466
    return verify_ref((oop*) ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4467
  }
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4468
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4469
#endif // ASSERT
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4470
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4471
void G1ParScanThreadState::trim_queue() {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4472
  assert(_evac_cl != NULL, "not set");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4473
  assert(_evac_failure_cl != NULL, "not set");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4474
  assert(_partial_scan_cl != NULL, "not set");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4475
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4476
  StarTask ref;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4477
  do {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4478
    // Drain the overflow stack first, so other threads can steal.
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4479
    while (refs()->pop_overflow(ref)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4480
      deal_with_reference(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4481
    }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  4482
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4483
    while (refs()->pop_local(ref)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4484
      deal_with_reference(ref);
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4485
    }
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4486
  } while (!refs()->is_empty());
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4487
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4488
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4489
G1ParClosureSuper::G1ParClosureSuper(G1CollectedHeap* g1,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4490
                                     G1ParScanThreadState* par_scan_state) :
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4491
  _g1(g1), _g1_rem(_g1->g1_rem_set()), _cm(_g1->concurrent_mark()),
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4492
  _par_scan_state(par_scan_state),
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11581
diff changeset
  4493
  _worker_id(par_scan_state->queue_num()),
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4494
  _during_initial_mark(_g1->g1_policy()->during_initial_mark_pause()),
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4495
  _mark_in_progress(_g1->mark_in_progress()) { }
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4496
12271
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4497
template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4498
void G1ParCopyClosure<do_gen_barrier, barrier, do_mark_object>::mark_object(oop obj) {
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4499
#ifdef ASSERT
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4500
  HeapRegion* hr = _g1->heap_region_containing(obj);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4501
  assert(hr != NULL, "sanity");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4502
  assert(!hr->in_collection_set(), "should not mark objects in the CSet");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4503
#endif // ASSERT
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4504
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4505
  // We know that the object is not moving so it's safe to read its size.
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11581
diff changeset
  4506
  _cm->grayRoot(obj, (size_t) obj->size(), _worker_id);
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4507
}
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4508
12271
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4509
template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4510
void G1ParCopyClosure<do_gen_barrier, barrier, do_mark_object>
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4511
  ::mark_forwarded_object(oop from_obj, oop to_obj) {
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4512
#ifdef ASSERT
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4513
  assert(from_obj->is_forwarded(), "from obj should be forwarded");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4514
  assert(from_obj->forwardee() == to_obj, "to obj should be the forwardee");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4515
  assert(from_obj != to_obj, "should not be self-forwarded");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4516
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4517
  HeapRegion* from_hr = _g1->heap_region_containing(from_obj);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4518
  assert(from_hr != NULL, "sanity");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4519
  assert(from_hr->in_collection_set(), "from obj should be in the CSet");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4520
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4521
  HeapRegion* to_hr = _g1->heap_region_containing(to_obj);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4522
  assert(to_hr != NULL, "sanity");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4523
  assert(!to_hr->in_collection_set(), "should not mark objects in the CSet");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4524
#endif // ASSERT
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4525
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4526
  // The object might be in the process of being copied by another
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4527
  // worker so we cannot trust that its to-space image is
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4528
  // well-formed. So we have to read its size from its from-space
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4529
  // image which we know should not be changing.
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11581
diff changeset
  4530
  _cm->grayRoot(to_obj, (size_t) from_obj->size(), _worker_id);
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4531
}
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4532
12271
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4533
template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4534
oop G1ParCopyClosure<do_gen_barrier, barrier, do_mark_object>
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4535
  ::copy_to_survivor_space(oop old) {
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  4536
  size_t word_sz = old->size();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4537
  HeapRegion* from_region = _g1->heap_region_containing_raw(old);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4538
  // +1 to make the -1 indexes valid...
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4539
  int       young_index = from_region->young_index_in_cset()+1;
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4540
  assert( (from_region->is_young() && young_index >  0) ||
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4541
         (!from_region->is_young() && young_index == 0), "invariant" );
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4542
  G1CollectorPolicy* g1p = _g1->g1_policy();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4543
  markOop m = old->mark();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4544
  int age = m->has_displaced_mark_helper() ? m->displaced_mark_helper()->age()
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4545
                                           : m->age();
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4546
  GCAllocPurpose alloc_purpose = g1p->evacuation_destination(from_region, age,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4547
                                                             word_sz);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4548
  HeapWord* obj_ptr = _par_scan_state->allocate(alloc_purpose, word_sz);
13517
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4549
#ifndef PRODUCT
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4550
  // Should this evacuation fail?
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4551
  if (_g1->evacuation_should_fail()) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4552
    if (obj_ptr != NULL) {
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4553
      _par_scan_state->undo_allocation(alloc_purpose, obj_ptr, word_sz);
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4554
      obj_ptr = NULL;
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4555
    }
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4556
  }
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4557
#endif // !PRODUCT
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4558
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4559
  if (obj_ptr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4560
    // 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
  4561
    // installed a forwarding pointer.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4562
    OopsInHeapRegionClosure* cl = _par_scan_state->evac_failure_closure();
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4563
    return _g1->handle_evacuation_failure_par(cl, old);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4564
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4565
13517
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4566
  oop obj = oop(obj_ptr);
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  4567
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4568
  // We're going to allocate linearly, so might as well prefetch ahead.
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4569
  Prefetch::write(obj_ptr, PrefetchCopyIntervalInBytes);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4570
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4571
  oop forward_ptr = old->forward_to_atomic(obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4572
  if (forward_ptr == NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4573
    Copy::aligned_disjoint_words((HeapWord*) old, obj_ptr, word_sz);
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4574
    if (g1p->track_object_age(alloc_purpose)) {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4575
      // We could simply do obj->incr_age(). However, this causes a
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4576
      // performance issue. obj->incr_age() will first check whether
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4577
      // the object has a displaced mark by checking its mark word;
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4578
      // getting the mark word from the new location of the object
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4579
      // stalls. So, given that we already have the mark word and we
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4580
      // are about to install it anyway, it's better to increase the
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4581
      // age on the mark word, when the object does not have a
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4582
      // displaced mark word. We're not expecting many objects to have
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4583
      // a displaced marked word, so that case is not optimized
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4584
      // further (it could be...) and we simply call obj->incr_age().
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4585
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4586
      if (m->has_displaced_mark_helper()) {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4587
        // in this case, we have to install the mark word first,
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4588
        // otherwise obj looks to be forwarded (the old mark word,
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4589
        // which contains the forward pointer, was copied)
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4590
        obj->set_mark(m);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4591
        obj->incr_age();
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4592
      } else {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4593
        m = m->incr_age();
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4594
        obj->set_mark(m);
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4595
      }
2009
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4596
      _par_scan_state->age_table()->add(obj, word_sz);
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4597
    } else {
4adf43957a1b 6484959: G1: introduce survivor spaces
apetrusenko
parents: 1902
diff changeset
  4598
      obj->set_mark(m);
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4599
    }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4600
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4601
    size_t* surv_young_words = _par_scan_state->surviving_young_words();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4602
    surv_young_words[young_index] += word_sz;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4603
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4604
    if (obj->is_objArray() && arrayOop(obj)->length() >= ParGCArrayScanChunk) {
11452
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4605
      // We keep track of the next start index in the length field of
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4606
      // the to-space object. The actual length can be found in the
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4607
      // length field of the from-space object.
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4608
      arrayOop(obj)->set_length(0);
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4609
      oop* old_p = set_partial_array_mask(old);
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4610
      _par_scan_state->push_on_queue(old_p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4611
    } else {
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4612
      // No point in using the slower heap_region_containing() method,
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4613
      // given that we know obj is in the heap.
12271
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4614
      _scanner.set_region(_g1->heap_region_containing_raw(obj));
8cf95843833b 7130974: G1: Remove G1ParCopyHelper
brutisso
parents: 12270
diff changeset
  4615
      obj->oop_iterate_backwards(&_scanner);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4616
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4617
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4618
    _par_scan_state->undo_allocation(alloc_purpose, obj_ptr, word_sz);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4619
    obj = forward_ptr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4620
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4621
  return obj;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4622
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4623
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4624
template <class T>
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4625
void G1ParCopyHelper::do_klass_barrier(T* p, oop new_obj) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4626
  if (_g1->heap_region_containing_raw(new_obj)->is_young()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4627
    _scanned_klass->record_modified_oops();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4628
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4629
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4630
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4631
template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4632
template <class T>
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4633
void G1ParCopyClosure<do_gen_barrier, barrier, do_mark_object>
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4634
::do_oop_work(T* p) {
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4635
  oop obj = oopDesc::load_decode_heap_oop(p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4636
  assert(barrier != G1BarrierRS || obj != NULL,
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4637
         "Precondition: G1BarrierRS implies obj is non-NULL");
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4638
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11581
diff changeset
  4639
  assert(_worker_id == _par_scan_state->queue_num(), "sanity");
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11581
diff changeset
  4640
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4641
  // 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
  4642
  if (_g1->in_cset_fast_test(obj)) {
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4643
    oop forwardee;
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4644
    if (obj->is_forwarded()) {
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4645
      forwardee = obj->forwardee();
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4646
    } else {
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4647
      forwardee = copy_to_survivor_space(obj);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4648
    }
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4649
    assert(forwardee != NULL, "forwardee should not be NULL");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4650
    oopDesc::encode_store_heap_oop(p, forwardee);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4651
    if (do_mark_object && forwardee != obj) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4652
      // If the object is self-forwarded we don't need to explicitly
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4653
      // mark it, the evacuation failure protocol will do so.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4654
      mark_forwarded_object(obj, forwardee);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4655
    }
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4656
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4657
    // When scanning the RS, we only care about objs in CS.
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4658
    if (barrier == G1BarrierRS) {
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11581
diff changeset
  4659
      _par_scan_state->update_rs(_from, p, _worker_id);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4660
    } else if (barrier == G1BarrierKlass) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4661
      do_klass_barrier(p, forwardee);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4662
    }
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4663
  } else {
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4664
    // The object is not in collection set. If we're a root scanning
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4665
    // closure during an initial mark pause (i.e. do_mark_object will
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4666
    // be true) then attempt to mark the object.
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4667
    if (do_mark_object && _g1->is_in_g1_reserved(obj)) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  4668
      mark_object(obj);
10495
d20531ba2b31 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 10282
diff changeset
  4669
    }
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4670
  }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4671
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4672
  if (barrier == G1BarrierEvac && obj != NULL) {
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11581
diff changeset
  4673
    _par_scan_state->update_rs(_from, p, _worker_id);
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4674
  }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4675
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4676
  if (do_gen_barrier && obj != NULL) {
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4677
    par_do_barrier(p);
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4678
  }
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4679
}
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4680
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4681
template void G1ParCopyClosure<false, G1BarrierEvac, false>::do_oop_work(oop* p);
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 4886
diff changeset
  4682
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
  4683
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 3191
diff changeset
  4684
template <class T> void G1ParScanPartialArrayClosure::do_oop_nv(T* p) {
1902
bf5f0a3beffe 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 1675
diff changeset
  4685
  assert(has_partial_array_mask(p), "invariant");
11452
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4686
  oop from_obj = clear_partial_array_mask(p);
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4687
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4688
  assert(Universe::heap()->is_in_reserved(from_obj), "must be in heap.");
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4689
  assert(from_obj->is_objArray(), "must be obj array");
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4690
  objArrayOop from_obj_array = objArrayOop(from_obj);
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4691
  // The from-space object contains the real length.
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4692
  int length                 = from_obj_array->length();
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4693
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4694
  assert(from_obj->is_forwarded(), "must be forwarded");
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4695
  oop to_obj                 = from_obj->forwardee();
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4696
  assert(from_obj != to_obj, "should not be chunking self-forwarded objects");
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4697
  objArrayOop to_obj_array   = objArrayOop(to_obj);
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4698
  // We keep track of the next start index in the length field of the
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4699
  // to-space object.
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4700
  int next_index             = to_obj_array->length();
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4701
  assert(0 <= next_index && next_index < length,
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4702
         err_msg("invariant, next index: %d, length: %d", next_index, length));
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4703
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4704
  int start                  = next_index;
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4705
  int end                    = length;
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4706
  int remainder              = end - start;
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4707
  // We'll try not to push a range that's smaller than ParGCArrayScanChunk.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4708
  if (remainder > 2 * ParGCArrayScanChunk) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4709
    end = start + ParGCArrayScanChunk;
11452
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4710
    to_obj_array->set_length(end);
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4711
    // Push the remainder before we process the range in case another
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4712
    // worker has run out of things to do and can steal it.
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4713
    oop* from_obj_p = set_partial_array_mask(from_obj);
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4714
    _par_scan_state->push_on_queue(from_obj_p);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4715
  } else {
11452
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4716
    assert(length == end, "sanity");
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4717
    // We'll process the final range for this object. Restore the length
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4718
    // so that the heap remains parsable in case of evacuation failure.
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4719
    to_obj_array->set_length(end);
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4720
  }
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4721
  _scanner.set_region(_g1->heap_region_containing_raw(to_obj));
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4722
  // Process indexes [start,end). It will also process the header
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4723
  // along with the first chunk (i.e., the chunk with start == 0).
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4724
  // Note that at this point the length field of to_obj_array is not
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4725
  // correct given that we are using it to keep track of the next
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4726
  // start index. oop_iterate_range() (thankfully!) ignores the length
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4727
  // field and only relies on the start / end parameters.  It does
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4728
  // however return the size of the object which will be incorrect. So
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4729
  // we have to ignore it even if we wanted to use it.
b14db5162ecd 7121623: G1: always be able to reliably calculate the length of a forwarded chunked array
tonyp
parents: 11451
diff changeset
  4730
  to_obj_array->oop_iterate_range(&_scanner, start, end);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4731
}
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
class G1ParEvacuateFollowersClosure : public VoidClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4734
protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4735
  G1CollectedHeap*              _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4736
  G1ParScanThreadState*         _par_scan_state;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4737
  RefToScanQueueSet*            _queues;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4738
  ParallelTaskTerminator*       _terminator;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4739
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4740
  G1ParScanThreadState*   par_scan_state() { return _par_scan_state; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4741
  RefToScanQueueSet*      queues()         { return _queues; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4742
  ParallelTaskTerminator* terminator()     { return _terminator; }
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
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4745
  G1ParEvacuateFollowersClosure(G1CollectedHeap* g1h,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4746
                                G1ParScanThreadState* par_scan_state,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4747
                                RefToScanQueueSet* queues,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4748
                                ParallelTaskTerminator* terminator)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4749
    : _g1h(g1h), _par_scan_state(par_scan_state),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4750
      _queues(queues), _terminator(terminator) {}
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
  void do_void();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4753
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4754
private:
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4755
  inline bool offer_termination();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4756
};
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4757
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4758
bool G1ParEvacuateFollowersClosure::offer_termination() {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4759
  G1ParScanThreadState* const pss = par_scan_state();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4760
  pss->start_term_time();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4761
  const bool res = terminator()->offer_termination();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4762
  pss->end_term_time();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4763
  return res;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4764
}
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4765
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4766
void G1ParEvacuateFollowersClosure::do_void() {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4767
  StarTask stolen_task;
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4768
  G1ParScanThreadState* const pss = par_scan_state();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4769
  pss->trim_queue();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4770
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4771
  do {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4772
    while (queues()->steal(pss->queue_num(), pss->hash_seed(), stolen_task)) {
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4773
      assert(pss->verify_task(stolen_task), "sanity");
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4774
      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
  4775
        pss->deal_with_reference((narrowOop*) stolen_task);
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4776
      } else {
6980
d19831e79825 6990359: G1: don't push a stolen entry on the taskqueue, deal with it directly
tonyp
parents: 6959
diff changeset
  4777
        pss->deal_with_reference((oop*) stolen_task);
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4778
      }
6980
d19831e79825 6990359: G1: don't push a stolen entry on the taskqueue, deal with it directly
tonyp
parents: 6959
diff changeset
  4779
d19831e79825 6990359: G1: don't push a stolen entry on the taskqueue, deal with it directly
tonyp
parents: 6959
diff changeset
  4780
      // 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
  4781
      // 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
  4782
      // we drain the queues as necessary.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4783
      pss->trim_queue();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4784
    }
6959
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4785
  } while (!offer_termination());
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4786
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4787
  pss->retire_alloc_buffers();
01bebea2fd5c 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 6958
diff changeset
  4788
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4789
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4790
class G1KlassScanClosure : public KlassClosure {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4791
 G1ParCopyHelper* _closure;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4792
 bool             _process_only_dirty;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4793
 int              _count;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4794
 public:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4795
  G1KlassScanClosure(G1ParCopyHelper* closure, bool process_only_dirty)
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4796
      : _process_only_dirty(process_only_dirty), _closure(closure), _count(0) {}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4797
  void do_klass(Klass* klass) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4798
    // If the klass has not been dirtied we know that there's
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4799
    // no references into  the young gen and we can skip it.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4800
   if (!_process_only_dirty || klass->has_modified_oops()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4801
      // Clean the klass since we're going to scavenge all the metadata.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4802
      klass->clear_modified_oops();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4803
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4804
      // Tell the closure that this klass is the Klass to scavenge
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4805
      // and is the one to dirty if oops are left pointing into the young gen.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4806
      _closure->set_scanned_klass(klass);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4807
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4808
      klass->oops_do(_closure);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4809
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4810
      _closure->set_scanned_klass(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4811
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4812
    _count++;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4813
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4814
};
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4815
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4816
class G1ParTask : public AbstractGangTask {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4817
protected:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4818
  G1CollectedHeap*       _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4819
  RefToScanQueueSet      *_queues;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4820
  ParallelTaskTerminator _terminator;
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  4821
  uint _n_workers;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4822
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4823
  Mutex _stats_lock;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4824
  Mutex* stats_lock() { return &_stats_lock; }
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
  size_t getNCards() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4827
    return (_g1h->capacity() + G1BlockOffsetSharedArray::N_bytes - 1)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4828
      / G1BlockOffsetSharedArray::N_bytes;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4829
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4830
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4831
public:
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  4832
  G1ParTask(G1CollectedHeap* g1h,
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  4833
            RefToScanQueueSet *task_queues)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4834
    : AbstractGangTask("G1 collection"),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4835
      _g1h(g1h),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4836
      _queues(task_queues),
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  4837
      _terminator(0, _queues),
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  4838
      _stats_lock(Mutex::leaf, "parallel G1 stats lock", true)
1374
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
  RefToScanQueueSet* queues() { return _queues; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4842
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4843
  RefToScanQueue *work_queue(int i) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4844
    return queues()->queue(i);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4845
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4846
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  4847
  ParallelTaskTerminator* terminator() { return &_terminator; }
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  4848
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  4849
  virtual void set_for_termination(int active_workers) {
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  4850
    // This task calls set_n_termination() in par_non_clean_card_iterate_work()
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  4851
    // in the young space (_par_seq_tasks) in the G1 heap
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  4852
    // for SequentialSubTasksDone.
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  4853
    // This task also uses SubTasksDone in SharedHeap and G1CollectedHeap
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  4854
    // both of which need setting by set_n_termination().
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  4855
    _g1h->SharedHeap::set_n_termination(active_workers);
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  4856
    _g1h->set_n_termination(active_workers);
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  4857
    terminator()->reset_for_reuse(active_workers);
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  4858
    _n_workers = active_workers;
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  4859
  }
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  4860
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  4861
  void work(uint worker_id) {
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  4862
    if (worker_id >= _n_workers) return;  // no work needed this round
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4863
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4864
    double start_time_ms = os::elapsedTime() * 1000.0;
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4865
    _g1h->g1_policy()->phase_times()->record_gc_worker_start_time(worker_id, start_time_ms);
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4866
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4867
    {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4868
      ResourceMark rm;
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4869
      HandleMark   hm;
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4870
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4871
      ReferenceProcessor*             rp = _g1h->ref_processor_stw();
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4872
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4873
      G1ParScanThreadState            pss(_g1h, worker_id);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4874
      G1ParScanHeapEvacClosure        scan_evac_cl(_g1h, &pss, rp);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4875
      G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, rp);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4876
      G1ParScanPartialArrayClosure    partial_scan_cl(_g1h, &pss, rp);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4877
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4878
      pss.set_evac_closure(&scan_evac_cl);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4879
      pss.set_evac_failure_closure(&evac_failure_cl);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4880
      pss.set_partial_scan_closure(&partial_scan_cl);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4881
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4882
      G1ParScanExtRootClosure        only_scan_root_cl(_g1h, &pss, rp);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4883
      G1ParScanMetadataClosure       only_scan_metadata_cl(_g1h, &pss, rp);
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4884
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4885
      G1ParScanAndMarkExtRootClosure scan_mark_root_cl(_g1h, &pss, rp);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4886
      G1ParScanAndMarkMetadataClosure scan_mark_metadata_cl(_g1h, &pss, rp);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4887
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4888
      bool only_young                 = _g1h->g1_policy()->gcs_are_young();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4889
      G1KlassScanClosure              scan_mark_klasses_cl_s(&scan_mark_metadata_cl, false);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4890
      G1KlassScanClosure              only_scan_klasses_cl_s(&only_scan_metadata_cl, only_young);
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4891
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4892
      OopClosure*                    scan_root_cl = &only_scan_root_cl;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4893
      G1KlassScanClosure*            scan_klasses_cl = &only_scan_klasses_cl_s;
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4894
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4895
      if (_g1h->g1_policy()->during_initial_mark_pause()) {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4896
        // We also need to mark copied objects.
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4897
        scan_root_cl = &scan_mark_root_cl;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4898
        scan_klasses_cl = &scan_mark_klasses_cl_s;
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4899
      }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4900
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4901
      G1ParPushHeapRSClosure          push_heap_rs_cl(_g1h, &pss);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4902
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4903
      int so = SharedHeap::SO_AllClasses | SharedHeap::SO_Strings | SharedHeap::SO_CodeCache;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4904
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4905
      pss.start_strong_roots();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4906
      _g1h->g1_process_strong_roots(/* is scavenging */ true,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4907
                                    SharedHeap::ScanningOption(so),
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4908
                                    scan_root_cl,
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4909
                                    &push_heap_rs_cl,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  4910
                                    scan_klasses_cl,
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4911
                                    worker_id);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4912
      pss.end_strong_roots();
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4913
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4914
      {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4915
        double start = os::elapsedTime();
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4916
        G1ParEvacuateFollowersClosure evac(_g1h, &pss, _queues, &_terminator);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4917
        evac.do_void();
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4918
        double elapsed_ms = (os::elapsedTime()-start)*1000.0;
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4919
        double term_ms = pss.term_time()*1000.0;
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  4920
        _g1h->g1_policy()->phase_times()->add_obj_copy_time(worker_id, elapsed_ms-term_ms);
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4921
        _g1h->g1_policy()->phase_times()->record_termination(worker_id, term_ms, pss.term_attempts());
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4922
      }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4923
      _g1h->g1_policy()->record_thread_age_table(pss.age_table());
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4924
      _g1h->update_surviving_young_words(pss.surviving_young_words()+1);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4925
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4926
      if (ParallelGCVerbose) {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4927
        MutexLocker x(stats_lock());
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4928
        pss.print_termination_stats(worker_id);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4929
      }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4930
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4931
      assert(pss.refs()->is_empty(), "should be empty");
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4932
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4933
      // Close the inner scope so that the ResourceMark and HandleMark
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4934
      // destructors are executed here and are included as part of the
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4935
      // "GC Worker Time".
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4936
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4937
5891
59044ec3fca3 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 5702
diff changeset
  4938
    double end_time_ms = os::elapsedTime() * 1000.0;
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  4939
    _g1h->g1_policy()->phase_times()->record_gc_worker_end_time(worker_id, end_time_ms);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  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
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4943
// *** Common G1 Evacuation Stuff
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  4944
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4945
// Closures that support the filtering of CodeBlobs scanned during
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4946
// external root scanning.
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4947
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4948
// Closure applied to reference fields in code blobs (specifically nmethods)
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4949
// to determine whether an nmethod contains references that point into
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4950
// the collection set. Used as a predicate when walking code roots so
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4951
// that only nmethods that point into the collection set are added to the
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4952
// 'marked' list.
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4953
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4954
class G1FilteredCodeBlobToOopClosure : public CodeBlobToOopClosure {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4955
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4956
  class G1PointsIntoCSOopClosure : public OopClosure {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4957
    G1CollectedHeap* _g1;
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4958
    bool _points_into_cs;
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4959
  public:
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4960
    G1PointsIntoCSOopClosure(G1CollectedHeap* g1) :
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4961
      _g1(g1), _points_into_cs(false) { }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4962
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4963
    bool points_into_cs() const { return _points_into_cs; }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4964
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4965
    template <class T>
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4966
    void do_oop_nv(T* p) {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4967
      if (!_points_into_cs) {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4968
        T heap_oop = oopDesc::load_heap_oop(p);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4969
        if (!oopDesc::is_null(heap_oop) &&
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4970
            _g1->in_cset_fast_test(oopDesc::decode_heap_oop_not_null(heap_oop))) {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4971
          _points_into_cs = true;
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4972
        }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4973
      }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4974
    }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4975
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4976
    virtual void do_oop(oop* p)        { do_oop_nv(p); }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4977
    virtual void do_oop(narrowOop* p)  { do_oop_nv(p); }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4978
  };
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4979
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4980
  G1CollectedHeap* _g1;
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4981
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4982
public:
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4983
  G1FilteredCodeBlobToOopClosure(G1CollectedHeap* g1, OopClosure* cl) :
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4984
    CodeBlobToOopClosure(cl, true), _g1(g1) { }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4985
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4986
  virtual void do_code_blob(CodeBlob* cb) {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4987
    nmethod* nm = cb->as_nmethod_or_null();
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4988
    if (nm != NULL && !(nm->test_oops_do_mark())) {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4989
      G1PointsIntoCSOopClosure predicate_cl(_g1);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4990
      nm->oops_do(&predicate_cl);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4991
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4992
      if (predicate_cl.points_into_cs()) {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4993
        // At least one of the reference fields or the oop relocations
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4994
        // in the nmethod points into the collection set. We have to
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4995
        // 'mark' this nmethod.
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4996
        // Note: Revisit the following if CodeBlobToOopClosure::do_code_blob()
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4997
        // or MarkingCodeBlobClosure::do_code_blob() change.
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4998
        if (!nm->test_set_oops_do_mark()) {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  4999
          do_newly_marked_nmethod(nm);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5000
        }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5001
      }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5002
    }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5003
  }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5004
};
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5005
6759
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  5006
// This method is run in a GC worker.
67b1a69ef5aa 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 6425
diff changeset
  5007
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5008
void
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5009
G1CollectedHeap::
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5010
g1_process_strong_roots(bool is_scavenging,
11754
b003db88c6d6 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 11639
diff changeset
  5011
                        ScanningOption so,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5012
                        OopClosure* scan_non_heap_roots,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5013
                        OopsInHeapRegionClosure* scan_rs,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5014
                        G1KlassScanClosure* scan_klasses,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5015
                        int worker_i) {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5016
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5017
  // First scan the strong roots
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5018
  double ext_roots_start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5019
  double closure_app_time_sec = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5020
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5021
  BufferingOopClosure buf_scan_non_heap_roots(scan_non_heap_roots);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5022
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  5023
  // 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
  5024
  // unaligned oop locations.
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5025
  G1FilteredCodeBlobToOopClosure eager_scan_code_roots(this, scan_non_heap_roots);
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  5026
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  5027
  process_strong_roots(false, // no scoping; this is parallel code
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5028
                       is_scavenging, so,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5029
                       &buf_scan_non_heap_roots,
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  5030
                       &eager_scan_code_roots,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5031
                       scan_klasses
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5032
                       );
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5033
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5034
  // Now the CM ref_processor roots.
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  5035
  if (!_process_strong_tasks->is_task_claimed(G1H_PS_refProcessor_oops_do)) {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5036
    // We need to treat the discovered reference lists of the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5037
    // concurrent mark ref processor as roots and keep entries
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5038
    // (which are added by the marking threads) on them live
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5039
    // until they can be processed at the end of marking.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5040
    ref_processor_cm()->weak_oops_do(&buf_scan_non_heap_roots);
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  5041
  }
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  5042
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  5043
  // Finish up any enqueued closure apps (attributed as object copy time).
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5044
  buf_scan_non_heap_roots.done();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5045
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5046
  double obj_copy_time_sec = buf_scan_non_heap_roots.closure_app_seconds();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5047
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  5048
  g1_policy()->phase_times()->record_obj_copy_time(worker_i, obj_copy_time_sec * 1000.0);
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  5049
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5050
  double ext_root_time_ms =
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  5051
    ((os::elapsedTime() - ext_roots_start) - obj_copy_time_sec) * 1000.0;
10236
c4256e927bed 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 10001
diff changeset
  5052
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  5053
  g1_policy()->phase_times()->record_ext_root_scan_time(worker_i, ext_root_time_ms);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5054
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  5055
  // During conc marking we have to filter the per-thread SATB buffers
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  5056
  // to make sure we remove any oops into the CSet (which will show up
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  5057
  // as implicitly live).
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  5058
  double satb_filtering_ms = 0.0;
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  5059
  if (!_process_strong_tasks->is_task_claimed(G1H_PS_filter_satb_buffers)) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  5060
    if (mark_in_progress()) {
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  5061
      double satb_filter_start = os::elapsedTime();
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  5062
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  5063
      JavaThread::satb_mark_queue_set().filter_thread_buffers();
13516
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  5064
f7adc27fb367 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 13482
diff changeset
  5065
      satb_filtering_ms = (os::elapsedTime() - satb_filter_start) * 1000.0;
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  5066
    }
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  5067
  }
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  5068
  g1_policy()->phase_times()->record_satb_filtering_time(worker_i, satb_filtering_ms);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5069
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5070
  // Now scan the complement of the collection set.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5071
  if (scan_rs != NULL) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5072
    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
  5073
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5074
  _process_strong_tasks->all_tasks_completed();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5075
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5076
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5077
void
17105
25b392a7740d 8012687: Remove unused is_root checks and closures
stefank
parents: 16994
diff changeset
  5078
G1CollectedHeap::g1_process_weak_roots(OopClosure* root_closure) {
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  5079
  CodeBlobToOopClosure roots_in_blobs(root_closure, /*do_marking=*/ false);
17105
25b392a7740d 8012687: Remove unused is_root checks and closures
stefank
parents: 16994
diff changeset
  5080
  SharedHeap::process_weak_roots(root_closure, &roots_in_blobs);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5081
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5082
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5083
// Weak Reference Processing support
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5084
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5085
// An always "is_alive" closure that is used to preserve referents.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5086
// If the object is non-null then it's alive.  Used in the preservation
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5087
// of referent objects that are pointed to by reference objects
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5088
// discovered by the CM ref processor.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5089
class G1AlwaysAliveClosure: public BoolObjectClosure {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5090
  G1CollectedHeap* _g1;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5091
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5092
  G1AlwaysAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5093
  void do_object(oop p) { assert(false, "Do not call."); }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5094
  bool do_object_b(oop p) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5095
    if (p != NULL) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5096
      return true;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5097
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5098
    return false;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5099
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5100
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5101
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5102
bool G1STWIsAliveClosure::do_object_b(oop p) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5103
  // An object is reachable if it is outside the collection set,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5104
  // or is inside and copied.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5105
  return !_g1->obj_in_cs(p) || p->is_forwarded();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5106
}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5107
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5108
// Non Copying Keep Alive closure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5109
class G1KeepAliveClosure: public OopClosure {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5110
  G1CollectedHeap* _g1;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5111
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5112
  G1KeepAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5113
  void do_oop(narrowOop* p) { guarantee(false, "Not needed"); }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5114
  void do_oop(      oop* p) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5115
    oop obj = *p;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5116
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5117
    if (_g1->obj_in_cs(obj)) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5118
      assert( obj->is_forwarded(), "invariant" );
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5119
      *p = obj->forwardee();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5120
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5121
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5122
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5123
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5124
// Copying Keep Alive closure - can be called from both
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5125
// serial and parallel code as long as different worker
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5126
// threads utilize different G1ParScanThreadState instances
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5127
// and different queues.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5128
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5129
class G1CopyingKeepAliveClosure: public OopClosure {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5130
  G1CollectedHeap*         _g1h;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5131
  OopClosure*              _copy_non_heap_obj_cl;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5132
  OopsInHeapRegionClosure* _copy_metadata_obj_cl;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5133
  G1ParScanThreadState*    _par_scan_state;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5134
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5135
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5136
  G1CopyingKeepAliveClosure(G1CollectedHeap* g1h,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5137
                            OopClosure* non_heap_obj_cl,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5138
                            OopsInHeapRegionClosure* metadata_obj_cl,
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5139
                            G1ParScanThreadState* pss):
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5140
    _g1h(g1h),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5141
    _copy_non_heap_obj_cl(non_heap_obj_cl),
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5142
    _copy_metadata_obj_cl(metadata_obj_cl),
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5143
    _par_scan_state(pss)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5144
  {}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5145
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5146
  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5147
  virtual void do_oop(      oop* p) { do_oop_work(p); }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5148
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5149
  template <class T> void do_oop_work(T* p) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5150
    oop obj = oopDesc::load_decode_heap_oop(p);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5151
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5152
    if (_g1h->obj_in_cs(obj)) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5153
      // If the referent object has been forwarded (either copied
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5154
      // to a new location or to itself in the event of an
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5155
      // evacuation failure) then we need to update the reference
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5156
      // field and, if both reference and referent are in the G1
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5157
      // heap, update the RSet for the referent.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5158
      //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5159
      // If the referent has not been forwarded then we have to keep
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5160
      // it alive by policy. Therefore we have copy the referent.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5161
      //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5162
      // If the reference field is in the G1 heap then we can push
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5163
      // on the PSS queue. When the queue is drained (after each
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5164
      // phase of reference processing) the object and it's followers
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5165
      // will be copied, the reference field set to point to the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5166
      // new location, and the RSet updated. Otherwise we need to
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5167
      // use the the non-heap or metadata closures directly to copy
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5168
      // the refernt object and update the pointer, while avoiding
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5169
      // updating the RSet.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5170
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5171
      if (_g1h->is_in_g1_reserved(p)) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5172
        _par_scan_state->push_on_queue(p);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5173
      } else {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5174
        assert(!ClassLoaderDataGraph::contains((address)p),
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5175
               err_msg("Otherwise need to call _copy_metadata_obj_cl->do_oop(p) "
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5176
                              PTR_FORMAT, p));
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5177
          _copy_non_heap_obj_cl->do_oop(p);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5178
        }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5179
      }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5180
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5181
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5182
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5183
// Serial drain queue closure. Called as the 'complete_gc'
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5184
// closure for each discovered list in some of the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5185
// reference processing phases.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5186
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5187
class G1STWDrainQueueClosure: public VoidClosure {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5188
protected:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5189
  G1CollectedHeap* _g1h;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5190
  G1ParScanThreadState* _par_scan_state;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5191
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5192
  G1ParScanThreadState*   par_scan_state() { return _par_scan_state; }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5193
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5194
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5195
  G1STWDrainQueueClosure(G1CollectedHeap* g1h, G1ParScanThreadState* pss) :
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5196
    _g1h(g1h),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5197
    _par_scan_state(pss)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5198
  { }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5199
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5200
  void do_void() {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5201
    G1ParScanThreadState* const pss = par_scan_state();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5202
    pss->trim_queue();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5203
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5204
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5205
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5206
// Parallel Reference Processing closures
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5207
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5208
// Implementation of AbstractRefProcTaskExecutor for parallel reference
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5209
// processing during G1 evacuation pauses.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5210
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5211
class G1STWRefProcTaskExecutor: public AbstractRefProcTaskExecutor {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5212
private:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5213
  G1CollectedHeap*   _g1h;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5214
  RefToScanQueueSet* _queues;
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5215
  FlexibleWorkGang*  _workers;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5216
  int                _active_workers;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5217
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5218
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5219
  G1STWRefProcTaskExecutor(G1CollectedHeap* g1h,
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5220
                        FlexibleWorkGang* workers,
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5221
                        RefToScanQueueSet *task_queues,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5222
                        int n_workers) :
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5223
    _g1h(g1h),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5224
    _queues(task_queues),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5225
    _workers(workers),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5226
    _active_workers(n_workers)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5227
  {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5228
    assert(n_workers > 0, "shouldn't call this otherwise");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5229
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5230
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5231
  // Executes the given task using concurrent marking worker threads.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5232
  virtual void execute(ProcessTask& task);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5233
  virtual void execute(EnqueueTask& task);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5234
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5235
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5236
// Gang task for possibly parallel reference processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5237
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5238
class G1STWRefProcTaskProxy: public AbstractGangTask {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5239
  typedef AbstractRefProcTaskExecutor::ProcessTask ProcessTask;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5240
  ProcessTask&     _proc_task;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5241
  G1CollectedHeap* _g1h;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5242
  RefToScanQueueSet *_task_queues;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5243
  ParallelTaskTerminator* _terminator;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5244
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5245
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5246
  G1STWRefProcTaskProxy(ProcessTask& proc_task,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5247
                     G1CollectedHeap* g1h,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5248
                     RefToScanQueueSet *task_queues,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5249
                     ParallelTaskTerminator* terminator) :
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5250
    AbstractGangTask("Process reference objects in parallel"),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5251
    _proc_task(proc_task),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5252
    _g1h(g1h),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5253
    _task_queues(task_queues),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5254
    _terminator(terminator)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5255
  {}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5256
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5257
  virtual void work(uint worker_id) {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5258
    // The reference processing task executed by a single worker.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5259
    ResourceMark rm;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5260
    HandleMark   hm;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5261
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5262
    G1STWIsAliveClosure is_alive(_g1h);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5263
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5264
    G1ParScanThreadState pss(_g1h, worker_id);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5265
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5266
    G1ParScanHeapEvacClosure        scan_evac_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5267
    G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5268
    G1ParScanPartialArrayClosure    partial_scan_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5269
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5270
    pss.set_evac_closure(&scan_evac_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5271
    pss.set_evac_failure_closure(&evac_failure_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5272
    pss.set_partial_scan_closure(&partial_scan_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5273
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5274
    G1ParScanExtRootClosure        only_copy_non_heap_cl(_g1h, &pss, NULL);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5275
    G1ParScanMetadataClosure       only_copy_metadata_cl(_g1h, &pss, NULL);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5276
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5277
    G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(_g1h, &pss, NULL);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5278
    G1ParScanAndMarkMetadataClosure copy_mark_metadata_cl(_g1h, &pss, NULL);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5279
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5280
    OopClosure*                    copy_non_heap_cl = &only_copy_non_heap_cl;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5281
    OopsInHeapRegionClosure*       copy_metadata_cl = &only_copy_metadata_cl;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5282
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5283
    if (_g1h->g1_policy()->during_initial_mark_pause()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5284
      // We also need to mark copied objects.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5285
      copy_non_heap_cl = &copy_mark_non_heap_cl;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5286
      copy_metadata_cl = &copy_mark_metadata_cl;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5287
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5288
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5289
    // Keep alive closure.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5290
    G1CopyingKeepAliveClosure keep_alive(_g1h, copy_non_heap_cl, copy_metadata_cl, &pss);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5291
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5292
    // Complete GC closure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5293
    G1ParEvacuateFollowersClosure drain_queue(_g1h, &pss, _task_queues, _terminator);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5294
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5295
    // Call the reference processing task's work routine.
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5296
    _proc_task.work(worker_id, is_alive, keep_alive, drain_queue);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5297
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5298
    // Note we cannot assert that the refs array is empty here as not all
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5299
    // of the processing tasks (specifically phase2 - pp2_work) execute
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5300
    // the complete_gc closure (which ordinarily would drain the queue) so
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5301
    // the queue may not be empty.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5302
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5303
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5304
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5305
// Driver routine for parallel reference processing.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5306
// Creates an instance of the ref processing gang
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5307
// task and has the worker threads execute it.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5308
void G1STWRefProcTaskExecutor::execute(ProcessTask& proc_task) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5309
  assert(_workers != NULL, "Need parallel worker threads.");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5310
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5311
  ParallelTaskTerminator terminator(_active_workers, _queues);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5312
  G1STWRefProcTaskProxy proc_task_proxy(proc_task, _g1h, _queues, &terminator);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5313
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5314
  _g1h->set_par_threads(_active_workers);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5315
  _workers->run_task(&proc_task_proxy);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5316
  _g1h->set_par_threads(0);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5317
}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5318
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5319
// Gang task for parallel reference enqueueing.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5320
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5321
class G1STWRefEnqueueTaskProxy: public AbstractGangTask {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5322
  typedef AbstractRefProcTaskExecutor::EnqueueTask EnqueueTask;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5323
  EnqueueTask& _enq_task;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5324
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5325
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5326
  G1STWRefEnqueueTaskProxy(EnqueueTask& enq_task) :
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5327
    AbstractGangTask("Enqueue reference objects in parallel"),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5328
    _enq_task(enq_task)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5329
  { }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5330
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5331
  virtual void work(uint worker_id) {
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5332
    _enq_task.work(worker_id);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5333
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5334
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5335
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5336
// Driver routine for parallel reference enqueing.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5337
// Creates an instance of the ref enqueueing gang
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5338
// task and has the worker threads execute it.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5339
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5340
void G1STWRefProcTaskExecutor::execute(EnqueueTask& enq_task) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5341
  assert(_workers != NULL, "Need parallel worker threads.");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5342
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5343
  G1STWRefEnqueueTaskProxy enq_task_proxy(enq_task);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5344
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5345
  _g1h->set_par_threads(_active_workers);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5346
  _workers->run_task(&enq_task_proxy);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5347
  _g1h->set_par_threads(0);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5348
}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5349
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5350
// End of weak reference support closures
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5351
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5352
// Abstract task used to preserve (i.e. copy) any referent objects
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5353
// that are in the collection set and are pointed to by reference
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5354
// objects discovered by the CM ref processor.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5355
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5356
class G1ParPreserveCMReferentsTask: public AbstractGangTask {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5357
protected:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5358
  G1CollectedHeap* _g1h;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5359
  RefToScanQueueSet      *_queues;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5360
  ParallelTaskTerminator _terminator;
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5361
  uint _n_workers;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5362
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5363
public:
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5364
  G1ParPreserveCMReferentsTask(G1CollectedHeap* g1h,int workers, RefToScanQueueSet *task_queues) :
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5365
    AbstractGangTask("ParPreserveCMReferents"),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5366
    _g1h(g1h),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5367
    _queues(task_queues),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5368
    _terminator(workers, _queues),
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5369
    _n_workers(workers)
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5370
  { }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5371
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5372
  void work(uint worker_id) {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5373
    ResourceMark rm;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5374
    HandleMark   hm;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5375
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5376
    G1ParScanThreadState            pss(_g1h, worker_id);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5377
    G1ParScanHeapEvacClosure        scan_evac_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5378
    G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5379
    G1ParScanPartialArrayClosure    partial_scan_cl(_g1h, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5380
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5381
    pss.set_evac_closure(&scan_evac_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5382
    pss.set_evac_failure_closure(&evac_failure_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5383
    pss.set_partial_scan_closure(&partial_scan_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5384
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5385
    assert(pss.refs()->is_empty(), "both queue and overflow should be empty");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5386
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5387
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5388
    G1ParScanExtRootClosure        only_copy_non_heap_cl(_g1h, &pss, NULL);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5389
    G1ParScanMetadataClosure       only_copy_metadata_cl(_g1h, &pss, NULL);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5390
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5391
    G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(_g1h, &pss, NULL);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5392
    G1ParScanAndMarkMetadataClosure copy_mark_metadata_cl(_g1h, &pss, NULL);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5393
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5394
    OopClosure*                    copy_non_heap_cl = &only_copy_non_heap_cl;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5395
    OopsInHeapRegionClosure*       copy_metadata_cl = &only_copy_metadata_cl;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5396
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5397
    if (_g1h->g1_policy()->during_initial_mark_pause()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5398
      // We also need to mark copied objects.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5399
      copy_non_heap_cl = &copy_mark_non_heap_cl;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5400
      copy_metadata_cl = &copy_mark_metadata_cl;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5401
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5402
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5403
    // Is alive closure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5404
    G1AlwaysAliveClosure always_alive(_g1h);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5405
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5406
    // Copying keep alive closure. Applied to referent objects that need
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5407
    // to be copied.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5408
    G1CopyingKeepAliveClosure keep_alive(_g1h, copy_non_heap_cl, copy_metadata_cl, &pss);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5409
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5410
    ReferenceProcessor* rp = _g1h->ref_processor_cm();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5411
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5412
    uint limit = ReferenceProcessor::number_of_subclasses_of_ref() * rp->max_num_q();
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5413
    uint stride = MIN2(MAX2(_n_workers, 1U), limit);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5414
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5415
    // limit is set using max_num_q() - which was set using ParallelGCThreads.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5416
    // So this must be true - but assert just in case someone decides to
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5417
    // change the worker ids.
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5418
    assert(0 <= worker_id && worker_id < limit, "sanity");
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5419
    assert(!rp->discovery_is_atomic(), "check this code");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5420
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5421
    // Select discovered lists [i, i+stride, i+2*stride,...,limit)
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5422
    for (uint idx = worker_id; idx < limit; idx += stride) {
10747
dfdb9eb56e49 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 10746
diff changeset
  5423
      DiscoveredList& ref_list = rp->discovered_refs()[idx];
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5424
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5425
      DiscoveredListIterator iter(ref_list, &keep_alive, &always_alive);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5426
      while (iter.has_next()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5427
        // Since discovery is not atomic for the CM ref processor, we
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5428
        // can see some null referent objects.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5429
        iter.load_ptrs(DEBUG_ONLY(true));
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5430
        oop ref = iter.obj();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5431
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5432
        // This will filter nulls.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5433
        if (iter.is_referent_alive()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5434
          iter.make_referent_alive();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5435
        }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5436
        iter.move_to_next();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5437
      }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5438
    }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5439
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5440
    // Drain the queue - which may cause stealing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5441
    G1ParEvacuateFollowersClosure drain_queue(_g1h, &pss, _queues, &_terminator);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5442
    drain_queue.do_void();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5443
    // Allocation buffers were retired at the end of G1ParEvacuateFollowersClosure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5444
    assert(pss.refs()->is_empty(), "should be");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5445
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5446
};
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5447
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5448
// Weak Reference processing during an evacuation pause (part 1).
13926
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5449
void G1CollectedHeap::process_discovered_references(uint no_of_gc_workers) {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5450
  double ref_proc_start = os::elapsedTime();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5451
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5452
  ReferenceProcessor* rp = _ref_processor_stw;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5453
  assert(rp->discovery_enabled(), "should have been enabled");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5454
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5455
  // Any reference objects, in the collection set, that were 'discovered'
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5456
  // by the CM ref processor should have already been copied (either by
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5457
  // applying the external root copy closure to the discovered lists, or
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5458
  // by following an RSet entry).
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5459
  //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5460
  // But some of the referents, that are in the collection set, that these
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5461
  // reference objects point to may not have been copied: the STW ref
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5462
  // processor would have seen that the reference object had already
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5463
  // been 'discovered' and would have skipped discovering the reference,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5464
  // but would not have treated the reference object as a regular oop.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5465
  // As a reult the copy closure would not have been applied to the
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5466
  // referent object.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5467
  //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5468
  // We need to explicitly copy these referent objects - the references
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5469
  // will be processed at the end of remarking.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5470
  //
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5471
  // We also need to do this copying before we process the reference
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5472
  // objects discovered by the STW ref processor in case one of these
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5473
  // referents points to another object which is also referenced by an
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5474
  // object discovered by the STW ref processor.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5475
11250
ef1ab0772513 7120038: G1: ParallelGCThreads==0 is broken
johnc
parents: 11249
diff changeset
  5476
  assert(!G1CollectedHeap::use_parallel_gc_threads() ||
13926
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5477
           no_of_gc_workers == workers()->active_workers(),
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5478
           "Need to reset active GC workers");
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5479
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5480
  set_par_threads(no_of_gc_workers);
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5481
  G1ParPreserveCMReferentsTask keep_cm_referents(this,
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5482
                                                 no_of_gc_workers,
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5483
                                                 _task_queues);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5484
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5485
  if (G1CollectedHeap::use_parallel_gc_threads()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5486
    workers()->run_task(&keep_cm_referents);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5487
  } else {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5488
    keep_cm_referents.work(0);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5489
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5490
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5491
  set_par_threads(0);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5492
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5493
  // Closure to test whether a referent is alive.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5494
  G1STWIsAliveClosure is_alive(this);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5495
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5496
  // Even when parallel reference processing is enabled, the processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5497
  // of JNI refs is serial and performed serially by the current thread
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5498
  // rather than by a worker. The following PSS will be used for processing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5499
  // JNI refs.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5500
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5501
  // Use only a single queue for this PSS.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5502
  G1ParScanThreadState pss(this, 0);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5503
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5504
  // We do not embed a reference processor in the copying/scanning
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5505
  // closures while we're actually processing the discovered
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5506
  // reference objects.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5507
  G1ParScanHeapEvacClosure        scan_evac_cl(this, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5508
  G1ParScanHeapEvacFailureClosure evac_failure_cl(this, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5509
  G1ParScanPartialArrayClosure    partial_scan_cl(this, &pss, NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5510
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5511
  pss.set_evac_closure(&scan_evac_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5512
  pss.set_evac_failure_closure(&evac_failure_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5513
  pss.set_partial_scan_closure(&partial_scan_cl);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5514
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5515
  assert(pss.refs()->is_empty(), "pre-condition");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5516
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5517
  G1ParScanExtRootClosure        only_copy_non_heap_cl(this, &pss, NULL);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5518
  G1ParScanMetadataClosure       only_copy_metadata_cl(this, &pss, NULL);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5519
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5520
  G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(this, &pss, NULL);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5521
  G1ParScanAndMarkMetadataClosure copy_mark_metadata_cl(this, &pss, NULL);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5522
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5523
  OopClosure*                    copy_non_heap_cl = &only_copy_non_heap_cl;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5524
  OopsInHeapRegionClosure*       copy_metadata_cl = &only_copy_metadata_cl;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5525
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5526
  if (_g1h->g1_policy()->during_initial_mark_pause()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5527
    // We also need to mark copied objects.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5528
    copy_non_heap_cl = &copy_mark_non_heap_cl;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5529
    copy_metadata_cl = &copy_mark_metadata_cl;
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5530
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5531
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5532
  // Keep alive closure.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  5533
  G1CopyingKeepAliveClosure keep_alive(this, copy_non_heap_cl, copy_metadata_cl, &pss);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5534
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5535
  // Serial Complete GC closure
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5536
  G1STWDrainQueueClosure drain_queue(this, &pss);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5537
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5538
  // Setup the soft refs policy...
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5539
  rp->setup_policy(false);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5540
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5541
  if (!rp->processing_is_mt()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5542
    // Serial reference processing...
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5543
    rp->process_discovered_references(&is_alive,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5544
                                      &keep_alive,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5545
                                      &drain_queue,
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5546
                                      NULL);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5547
  } else {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5548
    // Parallel reference processing
13926
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5549
    assert(rp->num_q() == no_of_gc_workers, "sanity");
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5550
    assert(no_of_gc_workers <= rp->max_num_q(), "sanity");
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5551
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5552
    G1STWRefProcTaskExecutor par_task_executor(this, workers(), _task_queues, no_of_gc_workers);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5553
    rp->process_discovered_references(&is_alive, &keep_alive, &drain_queue, &par_task_executor);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5554
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5555
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5556
  // We have completed copying any necessary live referent objects
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5557
  // (that were not copied during the actual pause) so we can
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5558
  // retire any active alloc buffers
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5559
  pss.retire_alloc_buffers();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5560
  assert(pss.refs()->is_empty(), "both queue and overflow should be empty");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5561
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5562
  double ref_proc_time = os::elapsedTime() - ref_proc_start;
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  5563
  g1_policy()->phase_times()->record_ref_proc_time(ref_proc_time * 1000.0);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5564
}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5565
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5566
// Weak Reference processing during an evacuation pause (part 2).
13926
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5567
void G1CollectedHeap::enqueue_discovered_references(uint no_of_gc_workers) {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5568
  double ref_enq_start = os::elapsedTime();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5569
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5570
  ReferenceProcessor* rp = _ref_processor_stw;
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5571
  assert(!rp->discovery_enabled(), "should have been disabled as part of processing");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5572
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5573
  // Now enqueue any remaining on the discovered lists on to
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5574
  // the pending list.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5575
  if (!rp->processing_is_mt()) {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5576
    // Serial reference processing...
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5577
    rp->enqueue_discovered_references();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5578
  } else {
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5579
    // Parallel reference enqueuing
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5580
13926
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5581
    assert(no_of_gc_workers == workers()->active_workers(),
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5582
           "Need to reset active workers");
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5583
    assert(rp->num_q() == no_of_gc_workers, "sanity");
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5584
    assert(no_of_gc_workers <= rp->max_num_q(), "sanity");
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5585
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5586
    G1STWRefProcTaskExecutor par_task_executor(this, workers(), _task_queues, no_of_gc_workers);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5587
    rp->enqueue_discovered_references(&par_task_executor);
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5588
  }
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5589
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5590
  rp->verify_no_references_recorded();
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5591
  assert(!rp->discovery_enabled(), "should have been disabled");
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5592
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5593
  // FIXME
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5594
  // CM's reference processing also cleans up the string and symbol tables.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5595
  // Should we do that here also? We could, but it is a serial operation
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5596
  // and could signicantly increase the pause time.
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5597
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5598
  double ref_enq_time = os::elapsedTime() - ref_enq_start;
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  5599
  g1_policy()->phase_times()->record_ref_enq_time(ref_enq_time * 1000.0);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5600
}
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5601
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5602
void G1CollectedHeap::evacuate_collection_set() {
11449
8abed3466567 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 11396
diff changeset
  5603
  _expand_heap_after_alloc_failure = true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5604
  set_evacuation_failed(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5605
13517
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  5606
  // Should G1EvacuationFailureALot be in effect for this GC?
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  5607
  NOT_PRODUCT(set_evacuation_failure_alot_for_current_gc();)
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  5608
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5609
  g1_rem_set()->prepare_for_oops_into_collection_set_do();
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5610
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5611
  // Disable the hot card cache.
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5612
  G1HotCardCache* hot_card_cache = _cg1r->hot_card_cache();
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5613
  hot_card_cache->reset_hot_cache_claimed_index();
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5614
  hot_card_cache->set_use_cache(false);
3589
abdd970c243d 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 3584
diff changeset
  5615
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5616
  uint n_workers;
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5617
  if (G1CollectedHeap::use_parallel_gc_threads()) {
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5618
    n_workers =
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5619
      AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(),
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5620
                                     workers()->active_workers(),
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5621
                                     Threads::number_of_non_daemon_threads());
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5622
    assert(UseDynamicNumberOfGCThreads ||
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5623
           n_workers == workers()->total_workers(),
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5624
           "If not dynamic should be using all the  workers");
11250
ef1ab0772513 7120038: G1: ParallelGCThreads==0 is broken
johnc
parents: 11249
diff changeset
  5625
    workers()->set_active_workers(n_workers);
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5626
    set_par_threads(n_workers);
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5627
  } else {
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5628
    assert(n_par_threads() == 0,
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5629
           "Should be the original non-parallel value");
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5630
    n_workers = 1;
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5631
  }
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5632
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5633
  G1ParTask g1_par_task(this, _task_queues);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5634
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5635
  init_for_evac_failure(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5636
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5637
  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
  5638
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5639
  assert(dirty_card_queue_set().completed_buffers_num() == 0, "Should be empty");
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5640
  double start_par_time_sec = os::elapsedTime();
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5641
  double end_par_time_sec;
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5642
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5643
  {
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3590
diff changeset
  5644
    StrongRootsScope srs(this);
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5645
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5646
    if (G1CollectedHeap::use_parallel_gc_threads()) {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5647
      // The individual threads will set their evac-failure closures.
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5648
      if (ParallelGCVerbose) G1ParScanThreadState::print_termination_stats_hdr();
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5649
      // These tasks use ShareHeap::_process_strong_tasks
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5650
      assert(UseDynamicNumberOfGCThreads ||
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5651
             workers()->active_workers() == workers()->total_workers(),
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5652
             "If not dynamic should be using all the  workers");
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5653
      workers()->run_task(&g1_par_task);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5654
    } else {
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5655
      g1_par_task.set_for_termination(n_workers);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5656
      g1_par_task.work(0);
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5657
    }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5658
    end_par_time_sec = os::elapsedTime();
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5659
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5660
    // Closing the inner scope will execute the destructor
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5661
    // for the StrongRootsScope object. We record the current
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5662
    // elapsed time before closing the scope so that time
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5663
    // taken for the SRS destructor is NOT included in the
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5664
    // reported parallel time.
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5665
  }
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5666
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5667
  double par_time_ms = (end_par_time_sec - start_par_time_sec) * 1000.0;
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  5668
  g1_policy()->phase_times()->record_par_time(par_time_ms);
12270
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5669
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5670
  double code_root_fixup_time_ms =
9625585c6047 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 12227
diff changeset
  5671
        (os::elapsedTime() - end_par_time_sec) * 1000.0;
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  5672
  g1_policy()->phase_times()->record_code_root_fixup_time(code_root_fixup_time_ms);
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  5673
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5674
  set_par_threads(0);
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  5675
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5676
  // Process any discovered reference objects - we have
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5677
  // to do this _before_ we retire the GC alloc regions
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5678
  // as we may have to copy some 'reachable' referent
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5679
  // objects (and their reachable sub-graphs) that were
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5680
  // not copied during the pause.
13926
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5681
  process_discovered_references(n_workers);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5682
7399
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  5683
  // Weak root processing.
4ecd771fa2d1 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 7398
diff changeset
  5684
  // 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
  5685
  // 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
  5686
  // here too.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5687
  {
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5688
    G1STWIsAliveClosure is_alive(this);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5689
    G1KeepAliveClosure keep_alive(this);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5690
    JNIHandles::weak_oops_do(&is_alive, &keep_alive);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5691
  }
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5692
13926
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5693
  release_gc_alloc_regions(n_workers);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5694
  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
  5695
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5696
  // Reset and re-enable the hot card cache.
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5697
  // Note the counts for the cards in the regions in the
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5698
  // collection set are reset when the collection set is freed.
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5699
  hot_card_cache->reset_hot_cache();
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5700
  hot_card_cache->set_use_cache(true);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5701
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5702
  finalize_for_evac_failure();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5703
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5704
  if (evacuation_failed()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5705
    remove_self_forwarding_pointers();
13517
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  5706
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  5707
    // Reset the G1EvacuationFailureALot counters and flags
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  5708
    // Note: the values are reset only when an actual
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  5709
    // evacuation failure occurs.
f158a0c702d4 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 13516
diff changeset
  5710
    NOT_PRODUCT(reset_evacuation_should_fail();)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5711
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5712
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5713
  // Enqueue any remaining references remaining on the STW
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5714
  // reference processor's discovered lists. We need to do
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5715
  // this after the card table is cleaned (and verified) as
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5716
  // the act of enqueuing entries on to the pending list
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5717
  // will log these updates (and dirty their associated
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5718
  // cards). We need these updates logged to update any
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5719
  // RSets.
13926
289339903fcf 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 13876
diff changeset
  5720
  enqueue_discovered_references(n_workers);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10664
diff changeset
  5721
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5722
  if (G1DeferredRSUpdate) {
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5723
    RedirtyLoggedCardTableEntryFastClosure redirty;
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5724
    dirty_card_queue_set().set_closure(&redirty);
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5725
    dirty_card_queue_set().apply_closure_to_all_completed_buffers();
4481
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  5726
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  5727
    DirtyCardQueueSet& dcq = JavaThread::dirty_card_queue_set();
de92ec484f5e 6862387: tune concurrent refinement further
iveresov
parents: 4462
diff changeset
  5728
    dcq.merge_bufferlists(&dirty_card_queue_set());
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2121
diff changeset
  5729
    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
  5730
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5731
  COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5732
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5733
8072
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7923
diff changeset
  5734
void G1CollectedHeap::free_region_if_empty(HeapRegion* hr,
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5735
                                     size_t* pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5736
                                     FreeRegionList* free_list,
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  5737
                                     OldRegionSet* old_proxy_set,
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5738
                                     HumongousRegionSet* humongous_proxy_set,
8072
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7923
diff changeset
  5739
                                     HRRSCleanupTask* hrrs_cleanup_task,
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5740
                                     bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5741
  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
  5742
    if (hr->isHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5743
      assert(hr->startsHumongous(), "we should only see starts humongous");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5744
      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
  5745
    } else {
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  5746
      _old_set.remove_with_proxy(hr, old_proxy_set);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5747
      free_region(hr, pre_used, free_list, par);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5748
    }
8072
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7923
diff changeset
  5749
  } else {
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7923
diff changeset
  5750
    hr->rem_set()->do_cleanup_work(hrrs_cleanup_task);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5751
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5752
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5753
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5754
void G1CollectedHeap::free_region(HeapRegion* hr,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5755
                                  size_t* pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5756
                                  FreeRegionList* free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5757
                                  bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5758
  assert(!hr->isHumongous(), "this is only for non-humongous regions");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5759
  assert(!hr->is_empty(), "the region should not be empty");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5760
  assert(free_list != NULL, "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5761
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5762
  // Clear the card counts for this region.
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5763
  // Note: we only need to do this if the region is not young
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5764
  // (since we don't refine cards in young regions).
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5765
  if (!hr->is_young()) {
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5766
    _cg1r->hot_card_cache()->reset_card_counts(hr);
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17323
diff changeset
  5767
  }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5768
  *pre_used += hr->used();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5769
  hr->hr_clear(par, true /* clear_space */);
8927
461fa7ee5254 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 8688
diff changeset
  5770
  free_list->add_as_head(hr);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5771
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5772
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5773
void G1CollectedHeap::free_humongous_region(HeapRegion* hr,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5774
                                     size_t* pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5775
                                     FreeRegionList* free_list,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5776
                                     HumongousRegionSet* humongous_proxy_set,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5777
                                     bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5778
  assert(hr->startsHumongous(), "this is only for starts humongous regions");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5779
  assert(free_list != NULL, "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5780
  assert(humongous_proxy_set != NULL, "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5781
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5782
  size_t hr_used = hr->used();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5783
  size_t hr_capacity = hr->capacity();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5784
  size_t hr_pre_used = 0;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5785
  _humongous_set.remove_with_proxy(hr, humongous_proxy_set);
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  5786
  // We need to read this before we make the region non-humongous,
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  5787
  // otherwise the information will be gone.
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  5788
  uint last_index = hr->last_hc_index();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5789
  hr->set_notHumongous();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5790
  free_region(hr, &hr_pre_used, free_list, par);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5791
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  5792
  uint i = hr->hrs_index() + 1;
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  5793
  while (i < last_index) {
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  5794
    HeapRegion* curr_hr = region_at(i);
13336
e582172ff6ff 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 13289
diff changeset
  5795
    assert(curr_hr->continuesHumongous(), "invariant");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5796
    curr_hr->set_notHumongous();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5797
    free_region(curr_hr, &hr_pre_used, free_list, par);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5798
    i += 1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5799
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5800
  assert(hr_pre_used == hr_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5801
         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
  5802
                 "should be the same", hr_pre_used, hr_used));
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5803
  *pre_used += hr_pre_used;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5804
}
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5805
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5806
void G1CollectedHeap::update_sets_after_freeing_regions(size_t pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5807
                                       FreeRegionList* free_list,
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  5808
                                       OldRegionSet* old_proxy_set,
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5809
                                       HumongousRegionSet* humongous_proxy_set,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5810
                                       bool par) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5811
  if (pre_used > 0) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5812
    Mutex* lock = (par) ? ParGCRareEvent_lock : NULL;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5813
    MutexLockerEx x(lock, Mutex::_no_safepoint_check_flag);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5814
    assert(_summary_bytes_used >= pre_used,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5815
           err_msg("invariant: _summary_bytes_used: "SIZE_FORMAT" "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5816
                   "should be >= pre_used: "SIZE_FORMAT,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5817
                   _summary_bytes_used, pre_used));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5818
    _summary_bytes_used -= pre_used;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5819
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5820
  if (free_list != NULL && !free_list->is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5821
    MutexLockerEx x(FreeList_lock, Mutex::_no_safepoint_check_flag);
8927
461fa7ee5254 7029458: G1: Add newly-reclaimed regions to the beginning of the region free list, not the end
tonyp
parents: 8688
diff changeset
  5822
    _free_list.add_as_head(free_list);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5823
  }
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  5824
  if (old_proxy_set != NULL && !old_proxy_set->is_empty()) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  5825
    MutexLockerEx x(OldSets_lock, Mutex::_no_safepoint_check_flag);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  5826
    _old_set.update_from_proxy(old_proxy_set);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  5827
  }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5828
  if (humongous_proxy_set != NULL && !humongous_proxy_set->is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5829
    MutexLockerEx x(OldSets_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5830
    _humongous_set.update_from_proxy(humongous_proxy_set);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5831
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5832
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5833
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5834
class G1ParCleanupCTTask : public AbstractGangTask {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5835
  CardTableModRefBS* _ct_bs;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5836
  G1CollectedHeap* _g1h;
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5837
  HeapRegion* volatile _su_head;
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5838
public:
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5839
  G1ParCleanupCTTask(CardTableModRefBS* ct_bs,
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5840
                     G1CollectedHeap* g1h) :
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5841
    AbstractGangTask("G1 Par Cleanup CT Task"),
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5842
    _ct_bs(ct_bs), _g1h(g1h) { }
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5843
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  5844
  void work(uint worker_id) {
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5845
    HeapRegion* r;
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5846
    while (r = _g1h->pop_dirty_cards_region()) {
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5847
      clear_cards(r);
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5848
    }
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5849
  }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5850
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5851
  void clear_cards(HeapRegion* r) {
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  5852
    // Cards of the survivors should have already been dirtied.
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5853
    if (!r->is_survivor()) {
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5854
      _ct_bs->clear(MemRegion(r->bottom(), r->end()));
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5855
    }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5856
  }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5857
};
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5858
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5859
#ifndef PRODUCT
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5860
class G1VerifyCardTableCleanup: public HeapRegionClosure {
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5861
  G1CollectedHeap* _g1h;
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5862
  CardTableModRefBS* _ct_bs;
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5863
public:
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5864
  G1VerifyCardTableCleanup(G1CollectedHeap* g1h, CardTableModRefBS* ct_bs)
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5865
    : _g1h(g1h), _ct_bs(ct_bs) { }
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5866
  virtual bool doHeapRegion(HeapRegion* r) {
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5867
    if (r->is_survivor()) {
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5868
      _g1h->verify_dirty_region(r);
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5869
    } else {
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5870
      _g1h->verify_not_dirty_region(r);
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5871
    }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5872
    return false;
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5873
  }
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5874
};
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5875
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5876
void G1CollectedHeap::verify_not_dirty_region(HeapRegion* hr) {
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5877
  // All of the region should be clean.
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5878
  CardTableModRefBS* ct_bs = (CardTableModRefBS*)barrier_set();
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5879
  MemRegion mr(hr->bottom(), hr->end());
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5880
  ct_bs->verify_not_dirty_region(mr);
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5881
}
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5882
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5883
void G1CollectedHeap::verify_dirty_region(HeapRegion* hr) {
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5884
  // We cannot guarantee that [bottom(),end()] is dirty.  Threads
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5885
  // dirty allocated blocks as they allocate them. The thread that
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5886
  // retires each region and replaces it with a new one will do a
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5887
  // maximal allocation to fill in [pre_dummy_top(),end()] but will
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5888
  // not dirty that area (one less thing to have to do while holding
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5889
  // a lock). So we can only verify that [bottom(),pre_dummy_top()]
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5890
  // is dirty.
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5891
  CardTableModRefBS* ct_bs = (CardTableModRefBS*) barrier_set();
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5892
  MemRegion mr(hr->bottom(), hr->pre_dummy_top());
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5893
  ct_bs->verify_dirty_region(mr);
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5894
}
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5895
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5896
void G1CollectedHeap::verify_dirty_young_list(HeapRegion* head) {
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5897
  CardTableModRefBS* ct_bs = (CardTableModRefBS*) barrier_set();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5898
  for (HeapRegion* hr = head; hr != NULL; hr = hr->get_next_young_region()) {
9418
32a87dd6b746 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 9342
diff changeset
  5899
    verify_dirty_region(hr);
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5900
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5901
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5902
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5903
void G1CollectedHeap::verify_dirty_young_regions() {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5904
  verify_dirty_young_list(_young_list->first_region());
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  5905
}
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5906
#endif
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5907
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5908
void G1CollectedHeap::cleanUpCardTable() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5909
  CardTableModRefBS* ct_bs = (CardTableModRefBS*) (barrier_set());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5910
  double start = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5911
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5912
  {
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5913
    // Iterate over the dirty cards region list.
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5914
    G1ParCleanupCTTask cleanup_task(ct_bs, this);
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5915
11250
ef1ab0772513 7120038: G1: ParallelGCThreads==0 is broken
johnc
parents: 11249
diff changeset
  5916
    if (G1CollectedHeap::use_parallel_gc_threads()) {
ef1ab0772513 7120038: G1: ParallelGCThreads==0 is broken
johnc
parents: 11249
diff changeset
  5917
      set_par_threads();
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5918
      workers()->run_task(&cleanup_task);
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5919
      set_par_threads(0);
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5920
    } else {
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5921
      while (_dirty_cards_region_list) {
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5922
        HeapRegion* r = _dirty_cards_region_list;
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5923
        cleanup_task.clear_cards(r);
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5924
        _dirty_cards_region_list = r->get_next_dirty_cards_region();
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5925
        if (_dirty_cards_region_list == r) {
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5926
          // The last region.
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5927
          _dirty_cards_region_list = NULL;
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5928
        }
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5929
        r->set_next_dirty_cards_region(NULL);
2883
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5930
      }
406d1e6d1aa1 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 2881
diff changeset
  5931
    }
10770
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5932
#ifndef PRODUCT
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5933
    if (G1VerifyCTCleanup || VerifyAfterGC) {
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5934
      G1VerifyCardTableCleanup cleanup_verifier(this, ct_bs);
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5935
      heap_region_iterate(&cleanup_verifier);
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5936
    }
de4ae3b50648 7096030: G1: PrintGCDetails enhancements
johnc
parents: 10747
diff changeset
  5937
#endif
3695
421cfcc8843c 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 3691
diff changeset
  5938
  }
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5939
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5940
  double elapsed = os::elapsedTime() - start;
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  5941
  g1_policy()->phase_times()->record_clear_ct_time(elapsed * 1000.0);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5942
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5943
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5944
void G1CollectedHeap::free_collection_set(HeapRegion* cs_head) {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5945
  size_t pre_used = 0;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5946
  FreeRegionList local_free_list("Local List for CSet Freeing");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  5947
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5948
  double young_time_ms     = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5949
  double non_young_time_ms = 0.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5950
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5951
  // 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
  5952
  // 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
  5953
  // 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
  5954
  _young_list->clear();
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  5955
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5956
  G1CollectorPolicy* policy = g1_policy();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5957
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5958
  double start_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5959
  bool non_young = true;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5960
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5961
  HeapRegion* cur = cs_head;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5962
  int age_bound = -1;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5963
  size_t rs_lengths = 0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5964
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5965
  while (cur != NULL) {
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  5966
    assert(!is_on_master_free_list(cur), "sanity");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5967
    if (non_young) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5968
      if (cur->is_young()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5969
        double end_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5970
        double elapsed_ms = (end_sec - start_sec) * 1000.0;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5971
        non_young_time_ms += elapsed_ms;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5972
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5973
        start_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5974
        non_young = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5975
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5976
    } else {
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  5977
      if (!cur->is_young()) {
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  5978
        double end_sec = os::elapsedTime();
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  5979
        double elapsed_ms = (end_sec - start_sec) * 1000.0;
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  5980
        young_time_ms += elapsed_ms;
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  5981
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  5982
        start_sec = os::elapsedTime();
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  5983
        non_young = true;
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  5984
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5985
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5986
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5987
    rs_lengths += cur->rem_set()->occupied();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5988
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5989
    HeapRegion* next = cur->next_in_collection_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5990
    assert(cur->in_collection_set(), "bad CS");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5991
    cur->set_next_in_collection_set(NULL);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5992
    cur->set_in_collection_set(false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5993
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5994
    if (cur->is_young()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5995
      int index = cur->young_index_in_cset();
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10997
diff changeset
  5996
      assert(index != -1, "invariant");
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  5997
      assert((uint) index < policy->young_cset_region_length(), "invariant");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5998
      size_t words_survived = _surviving_young_words[index];
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  5999
      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
  6000
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6001
      // 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
  6002
      // (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
  6003
      // 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
  6004
      // _next_young_region field.
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6005
      cur->set_next_young_region(NULL);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6006
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6007
      int index = cur->young_index_in_cset();
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10997
diff changeset
  6008
      assert(index == -1, "invariant");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6009
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6010
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6011
    assert( (cur->is_young() && cur->young_index_in_cset() > -1) ||
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6012
            (!cur->is_young() && cur->young_index_in_cset() == -1),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6013
            "invariant" );
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6014
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6015
    if (!cur->evacuation_failed()) {
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6016
      MemRegion used_mr = cur->used_region();
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6017
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6018
      // And the region is empty.
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6019
      assert(!used_mr.is_empty(), "Should not have empty regions in a CS.");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6020
      free_region(cur, &pre_used, &local_free_list, false /* par */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6021
    } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6022
      cur->uninstall_surv_rate_group();
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10997
diff changeset
  6023
      if (cur->is_young()) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6024
        cur->set_young_index_in_cset(-1);
11169
0cfe4d79060c 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 10997
diff changeset
  6025
      }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6026
      cur->set_not_young();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6027
      cur->set_evacuation_failed(false);
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6028
      // The region is now considered to be old.
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6029
      _old_set.add(cur);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6030
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6031
    cur = next;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6032
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6033
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6034
  policy->record_max_rs_lengths(rs_lengths);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6035
  policy->cset_regions_freed();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6036
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6037
  double end_sec = os::elapsedTime();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6038
  double elapsed_ms = (end_sec - start_sec) * 1000.0;
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6039
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6040
  if (non_young) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6041
    non_young_time_ms += elapsed_ms;
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6042
  } else {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6043
    young_time_ms += elapsed_ms;
11176
9bb1ddd8da51 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 11174
diff changeset
  6044
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6045
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6046
  update_sets_after_freeing_regions(pre_used, &local_free_list,
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6047
                                    NULL /* old_proxy_set */,
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6048
                                    NULL /* humongous_proxy_set */,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6049
                                    false /* par */);
13288
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  6050
  policy->phase_times()->record_young_free_cset_time_ms(young_time_ms);
331d5b6725f3 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 13113
diff changeset
  6051
  policy->phase_times()->record_non_young_free_cset_time_ms(non_young_time_ms);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6052
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6053
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6054
// 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
  6055
// 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
  6056
// 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
  6057
// 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
  6058
// 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
  6059
// 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
  6060
// 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
  6061
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6062
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
  6063
  HeapRegion* cur = cs_head;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6064
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6065
  while (cur != NULL) {
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6066
    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
  6067
    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
  6068
    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
  6069
    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
  6070
    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
  6071
    cur = next;
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6072
  }
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6073
}
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6074
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6075
void G1CollectedHeap::set_free_regions_coming() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6076
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6077
    gclog_or_tty->print_cr("G1ConcRegionFreeing [cm thread] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6078
                           "setting free regions coming");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6079
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6080
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6081
  assert(!free_regions_coming(), "pre-condition");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6082
  _free_regions_coming = true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6083
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6084
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6085
void G1CollectedHeap::reset_free_regions_coming() {
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  6086
  assert(free_regions_coming(), "pre-condition");
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
  6087
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6088
  {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6089
    MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6090
    _free_regions_coming = false;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6091
    SecondaryFreeList_lock->notify_all();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6092
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6093
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6094
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6095
    gclog_or_tty->print_cr("G1ConcRegionFreeing [cm thread] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6096
                           "reset free regions coming");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6097
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6098
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6099
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6100
void G1CollectedHeap::wait_while_free_regions_coming() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6101
  // 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
  6102
  // first before we take the lock.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6103
  if (!free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6104
    return;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6105
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6106
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6107
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6108
    gclog_or_tty->print_cr("G1ConcRegionFreeing [other] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6109
                           "waiting for free regions");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6110
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6111
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6112
  {
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6113
    MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6114
    while (free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6115
      SecondaryFreeList_lock->wait(Mutex::_no_safepoint_check_flag);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6116
    }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6117
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6118
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6119
  if (G1ConcRegionFreeingVerbose) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6120
    gclog_or_tty->print_cr("G1ConcRegionFreeing [other] : "
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6121
                           "done waiting for free regions");
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6122
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6123
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6124
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6125
void G1CollectedHeap::set_region_short_lived_locked(HeapRegion* hr) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6126
  assert(heap_lock_held_for_gc(),
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6127
              "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
  6128
  _young_list->push_region(hr);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6129
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6130
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6131
class NoYoungRegionsClosure: public HeapRegionClosure {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6132
private:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6133
  bool _success;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6134
public:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6135
  NoYoungRegionsClosure() : _success(true) { }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6136
  bool doHeapRegion(HeapRegion* r) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6137
    if (r->is_young()) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6138
      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
  6139
                             r->bottom(), r->end());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6140
      _success = false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6141
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6142
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6143
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6144
  bool success() { return _success; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6145
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6146
5350
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6147
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
  6148
  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
  6149
cccf0925702e 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 5347
diff changeset
  6150
  if (check_heap) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6151
    NoYoungRegionsClosure closure;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6152
    heap_region_iterate(&closure);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6153
    ret = ret && closure.success();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6154
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6155
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6156
  return ret;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6157
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6158
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6159
class TearDownRegionSetsClosure : public HeapRegionClosure {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6160
private:
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6161
  OldRegionSet *_old_set;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6162
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6163
public:
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6164
  TearDownRegionSetsClosure(OldRegionSet* old_set) : _old_set(old_set) { }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6165
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6166
  bool doHeapRegion(HeapRegion* r) {
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6167
    if (r->is_empty()) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6168
      // We ignore empty regions, we'll empty the free list afterwards
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6169
    } else if (r->is_young()) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6170
      // We ignore young regions, we'll empty the young list afterwards
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6171
    } else if (r->isHumongous()) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6172
      // We ignore humongous regions, we're not tearing down the
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6173
      // humongous region set
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6174
    } else {
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6175
      // The rest should be old
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6176
      _old_set->remove(r);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6177
    }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6178
    return false;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6179
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6180
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6181
  ~TearDownRegionSetsClosure() {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6182
    assert(_old_set->is_empty(), "post-condition");
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6183
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6184
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6185
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6186
void G1CollectedHeap::tear_down_region_sets(bool free_list_only) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6187
  assert_at_safepoint(true /* should_be_vm_thread */);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6188
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6189
  if (!free_list_only) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6190
    TearDownRegionSetsClosure cl(&_old_set);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6191
    heap_region_iterate(&cl);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6192
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6193
    // Need to do this after the heap iteration to be able to
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6194
    // recognize the young regions and ignore them during the iteration.
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6195
    _young_list->empty_list();
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6196
  }
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6197
  _free_list.remove_all();
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6198
}
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6199
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6200
class RebuildRegionSetsClosure : public HeapRegionClosure {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6201
private:
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6202
  bool            _free_list_only;
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6203
  OldRegionSet*   _old_set;
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6204
  FreeRegionList* _free_list;
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6205
  size_t          _total_used;
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6206
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6207
public:
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6208
  RebuildRegionSetsClosure(bool free_list_only,
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6209
                           OldRegionSet* old_set, FreeRegionList* free_list) :
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6210
    _free_list_only(free_list_only),
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6211
    _old_set(old_set), _free_list(free_list), _total_used(0) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6212
    assert(_free_list->is_empty(), "pre-condition");
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6213
    if (!free_list_only) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6214
      assert(_old_set->is_empty(), "pre-condition");
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6215
    }
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6216
  }
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6217
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6218
  bool doHeapRegion(HeapRegion* r) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6219
    if (r->continuesHumongous()) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6220
      return false;
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6221
    }
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6222
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6223
    if (r->is_empty()) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6224
      // Add free regions to the free list
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6225
      _free_list->add_as_tail(r);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6226
    } else if (!_free_list_only) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6227
      assert(!r->is_young(), "we should not come across young regions");
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6228
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6229
      if (r->isHumongous()) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6230
        // We ignore humongous regions, we left the humongous set unchanged
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6231
      } else {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6232
        // The rest should be old, add them to the old set
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6233
        _old_set->add(r);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6234
      }
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6235
      _total_used += r->used();
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6236
    }
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6237
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6238
    return false;
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6239
  }
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6240
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6241
  size_t total_used() {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6242
    return _total_used;
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6243
  }
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6244
};
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6245
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6246
void G1CollectedHeap::rebuild_region_sets(bool free_list_only) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6247
  assert_at_safepoint(true /* should_be_vm_thread */);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6248
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6249
  RebuildRegionSetsClosure cl(free_list_only, &_old_set, &_free_list);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6250
  heap_region_iterate(&cl);
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6251
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6252
  if (!free_list_only) {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6253
    _summary_bytes_used = cl.total_used();
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6254
  }
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6255
  assert(_summary_bytes_used == recalculate_used(),
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6256
         err_msg("inconsistent _summary_bytes_used, "
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6257
                 "value: "SIZE_FORMAT" recalculated: "SIZE_FORMAT,
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6258
                 _summary_bytes_used, recalculate_used()));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6259
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6260
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6261
void G1CollectedHeap::set_refine_cte_cl_concurrency(bool concurrent) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6262
  _refine_cte_cl->set_concurrent(concurrent);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6263
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6264
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6265
bool G1CollectedHeap::is_in_closed_subset(const void* p) const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6266
  HeapRegion* hr = heap_region_containing(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6267
  if (hr == NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13517
diff changeset
  6268
    return false;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6269
  } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6270
    return hr->is_in(p);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6271
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6272
}
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6273
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6274
// Methods for the mutator alloc region
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6275
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6276
HeapRegion* G1CollectedHeap::new_mutator_alloc_region(size_t word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6277
                                                      bool force) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6278
  assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6279
  assert(!force || g1_policy()->can_expand_young_list(),
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6280
         "if force is true we should be able to expand the young list");
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  6281
  bool young_list_full = g1_policy()->is_young_list_full();
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  6282
  if (force || !young_list_full) {
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6283
    HeapRegion* new_alloc_region = new_region(word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6284
                                              false /* do_expand */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6285
    if (new_alloc_region != NULL) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6286
      set_region_short_lived_locked(new_alloc_region);
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  6287
      _hr_printer.alloc(new_alloc_region, G1HRPrinter::Eden, young_list_full);
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6288
      return new_alloc_region;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6289
    }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6290
  }
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6291
  return NULL;
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6292
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6293
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6294
void G1CollectedHeap::retire_mutator_alloc_region(HeapRegion* alloc_region,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6295
                                                  size_t allocated_bytes) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6296
  assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6297
  assert(alloc_region->is_young(), "all mutator alloc regions should be young");
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6298
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6299
  g1_policy()->add_region_to_incremental_cset_lhs(alloc_region);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6300
  _summary_bytes_used += allocated_bytes;
10001
8aa7f885326e 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 10000
diff changeset
  6301
  _hr_printer.retire(alloc_region);
10671
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
  6302
  // We update the eden sizes here, when the region is retired,
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
  6303
  // instead of when it's allocated, since this is the point that its
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
  6304
  // used space has been recored in _summary_bytes_used.
431ff8629f97 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 10670
diff changeset
  6305
  g1mm()->update_eden_size();
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6306
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6307
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6308
HeapRegion* MutatorAllocRegion::allocate_new_region(size_t word_size,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6309
                                                    bool force) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6310
  return _g1h->new_mutator_alloc_region(word_size, force);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6311
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6312
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6313
void G1CollectedHeap::set_par_threads() {
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6314
  // Don't change the number of workers.  Use the value previously set
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6315
  // in the workgroup.
11250
ef1ab0772513 7120038: G1: ParallelGCThreads==0 is broken
johnc
parents: 11249
diff changeset
  6316
  assert(G1CollectedHeap::use_parallel_gc_threads(), "shouldn't be here otherwise");
11396
917d8673b5ef 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 11250
diff changeset
  6317
  uint n_workers = workers()->active_workers();
11250
ef1ab0772513 7120038: G1: ParallelGCThreads==0 is broken
johnc
parents: 11249
diff changeset
  6318
  assert(UseDynamicNumberOfGCThreads ||
11174
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6319
           n_workers == workers()->total_workers(),
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6320
      "Otherwise should be using the total number of workers");
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6321
  if (n_workers == 0) {
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6322
    assert(false, "Should have been set in prior evacuation pause.");
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6323
    n_workers = ParallelGCThreads;
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6324
    workers()->set_active_workers(n_workers);
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6325
  }
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6326
  set_par_threads(n_workers);
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6327
}
fccee5238e70 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 11169
diff changeset
  6328
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6329
void MutatorAllocRegion::retire_region(HeapRegion* alloc_region,
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6330
                                       size_t allocated_bytes) {
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6331
  _g1h->retire_mutator_alloc_region(alloc_region, allocated_bytes);
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6332
}
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6333
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6334
// Methods for the GC alloc regions
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6335
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6336
HeapRegion* G1CollectedHeap::new_gc_alloc_region(size_t word_size,
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  6337
                                                 uint count,
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6338
                                                 GCAllocPurpose ap) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6339
  assert(FreeList_lock->owned_by_self(), "pre-condition");
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6340
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6341
  if (count < g1_policy()->max_regions(ap)) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6342
    HeapRegion* new_alloc_region = new_region(word_size,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6343
                                              true /* do_expand */);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6344
    if (new_alloc_region != NULL) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6345
      // We really only need to do this for old regions given that we
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6346
      // should never scan survivors. But it doesn't hurt to do it
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6347
      // for survivors too.
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6348
      new_alloc_region->set_saved_mark();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6349
      if (ap == GCAllocForSurvived) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6350
        new_alloc_region->set_survivor();
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6351
        _hr_printer.alloc(new_alloc_region, G1HRPrinter::Survivor);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6352
      } else {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6353
        _hr_printer.alloc(new_alloc_region, G1HRPrinter::Old);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6354
      }
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  6355
      bool during_im = g1_policy()->during_initial_mark_pause();
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  6356
      new_alloc_region->note_start_of_copying(during_im);
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6357
      return new_alloc_region;
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6358
    } else {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6359
      g1_policy()->note_alloc_region_limit_reached(ap);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6360
    }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6361
  }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6362
  return NULL;
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6363
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6364
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6365
void G1CollectedHeap::retire_gc_alloc_region(HeapRegion* alloc_region,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6366
                                             size_t allocated_bytes,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6367
                                             GCAllocPurpose ap) {
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  6368
  bool during_im = g1_policy()->during_initial_mark_pause();
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 11453
diff changeset
  6369
  alloc_region->note_end_of_copying(during_im);
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6370
  g1_policy()->record_bytes_copied_during_gc(allocated_bytes);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6371
  if (ap == GCAllocForSurvived) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6372
    young_list()->add_survivor_region(alloc_region);
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6373
  } else {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6374
    _old_set.add(alloc_region);
10243
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6375
  }
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6376
  _hr_printer.retire(alloc_region);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6377
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6378
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6379
HeapRegion* SurvivorGCAllocRegion::allocate_new_region(size_t word_size,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6380
                                                       bool force) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6381
  assert(!force, "not supported for GC alloc regions");
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6382
  return _g1h->new_gc_alloc_region(word_size, count(), GCAllocForSurvived);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6383
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6384
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6385
void SurvivorGCAllocRegion::retire_region(HeapRegion* alloc_region,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6386
                                          size_t allocated_bytes) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6387
  _g1h->retire_gc_alloc_region(alloc_region, allocated_bytes,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6388
                               GCAllocForSurvived);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6389
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6390
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6391
HeapRegion* OldGCAllocRegion::allocate_new_region(size_t word_size,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6392
                                                  bool force) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6393
  assert(!force, "not supported for GC alloc regions");
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6394
  return _g1h->new_gc_alloc_region(word_size, count(), GCAllocForTenured);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6395
}
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6396
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6397
void OldGCAllocRegion::retire_region(HeapRegion* alloc_region,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6398
                                     size_t allocated_bytes) {
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6399
  _g1h->retire_gc_alloc_region(alloc_region, allocated_bytes,
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6400
                               GCAllocForTenured);
d00a21009f1f 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 10237
diff changeset
  6401
}
8928
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6402
// Heap region set verification
e5c53268bef5 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 8927
diff changeset
  6403
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6404
class VerifyRegionListsClosure : public HeapRegionClosure {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6405
private:
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6406
  FreeRegionList*     _free_list;
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6407
  OldRegionSet*       _old_set;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6408
  HumongousRegionSet* _humongous_set;
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  6409
  uint                _region_count;
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6410
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6411
public:
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6412
  VerifyRegionListsClosure(OldRegionSet* old_set,
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6413
                           HumongousRegionSet* humongous_set,
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6414
                           FreeRegionList* free_list) :
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6415
    _old_set(old_set), _humongous_set(humongous_set),
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6416
    _free_list(free_list), _region_count(0) { }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6417
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  6418
  uint region_count() { return _region_count; }
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6419
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6420
  bool doHeapRegion(HeapRegion* hr) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6421
    _region_count += 1;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6422
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6423
    if (hr->continuesHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6424
      return false;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6425
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6426
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6427
    if (hr->is_young()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6428
      // TODO
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6429
    } else if (hr->startsHumongous()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6430
      _humongous_set->verify_next_region(hr);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6431
    } else if (hr->is_empty()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6432
      _free_list->verify_next_region(hr);
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6433
    } else {
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6434
      _old_set->verify_next_region(hr);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6435
    }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6436
    return false;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6437
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6438
};
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6439
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 12379
diff changeset
  6440
HeapRegion* G1CollectedHeap::new_heap_region(uint hrs_index,
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  6441
                                             HeapWord* bottom) {
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  6442
  HeapWord* end = bottom + HeapRegion::GrainWords;
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  6443
  MemRegion mr(bottom, end);
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  6444
  assert(_g1_reserved.contains(mr), "invariant");
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  6445
  // This might return NULL if the allocation fails
13756
3b72f3da8cd4 7016955: G1: remove the is_zeroed parameter from the HeapRegion constructor
johnc
parents: 13754
diff changeset
  6446
  return new HeapRegion(hrs_index, _bot_shared, mr);
9989
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  6447
}
305a76435cf1 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 9987
diff changeset
  6448
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6449
void G1CollectedHeap::verify_region_sets() {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6450
  assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6451
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6452
  // First, check the explicit lists.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6453
  _free_list.verify();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6454
  {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6455
    // Given that a concurrent operation might be adding regions to
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6456
    // the secondary free list we have to take the lock before
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6457
    // verifying it.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6458
    MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6459
    _secondary_free_list.verify();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6460
  }
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6461
  _old_set.verify();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6462
  _humongous_set.verify();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6463
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6464
  // If a concurrent region freeing operation is in progress it will
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6465
  // be difficult to correctly attributed any free regions we come
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6466
  // 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
  6467
  // one of several (free_list, secondary_free_list, any local lists,
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6468
  // 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
  6469
  // verification operation. Alternatively, waiting for the concurrent
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6470
  // 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
  6471
  // operation (no concurrent operation will last longer than the
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6472
  // interval between two calls to verification) and it might hide
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6473
  // any issues that we would like to catch during testing.
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6474
  if (free_regions_coming()) {
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6475
    return;
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6476
  }
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6477
8680
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  6478
  // Make sure we append the secondary_free_list on the free_list so
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  6479
  // that all free regions we will come across can be safely
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  6480
  // attributed to the free_list.
f1c414e16a4c 7014923: G1: code cleanup
tonyp
parents: 8485
diff changeset
  6481
  append_secondary_free_list_if_not_empty_with_lock();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6482
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6483
  // Finally, make sure that the region accounting in the lists is
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6484
  // consistent with what we see in the heap.
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6485
  _old_set.verify_start();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6486
  _humongous_set.verify_start();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6487
  _free_list.verify_start();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6488
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6489
  VerifyRegionListsClosure cl(&_old_set, &_humongous_set, &_free_list);
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6490
  heap_region_iterate(&cl);
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6491
10996
b9d07748e5b3 7092309: G1: introduce old region set
tonyp
parents: 10770
diff changeset
  6492
  _old_set.verify_end();
7923
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6493
  _humongous_set.verify_end();
fc200fcd4e05 6977804: G1: remove the zero-filling thread
tonyp
parents: 7908
diff changeset
  6494
  _free_list.verify_end();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
  6495
}