src/hotspot/share/gc/g1/g1RemSet.cpp
author tschatzl
Mon, 26 Mar 2018 16:51:43 +0200
changeset 49607 acffe6ff3ae7
parent 49347 edb65305d3ac
child 49632 64f9ebc85e67
permissions -rw-r--r--
8180415: Rebuild remembered sets during the concurrent cycle Summary: In general maintain remembered sets of old regions only from the start of the concurrent cycle to the mixed gc they are used, at most until the end of the mixed phase. Reviewed-by: sjohanss, sangheki
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
/*
48955
e22914003cf0 8194691: Cleanup unnecessary casts in Atomic/OrderAccess uses
kbarrett
parents: 48954
diff changeset
     2
 * Copyright (c) 2001, 2018, 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: 5033
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5033
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: 5033
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"
35210
eb1d5c68bf64 8145672: Remove dependency of G1FromCardCache to HeapRegionRemSet
tschatzl
parents: 35198
diff changeset
    26
#include "gc/g1/dirtyCardQueue.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30175
diff changeset
    27
#include "gc/g1/g1BlockOffsetTable.inline.hpp"
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
    28
#include "gc/g1/g1CardTable.inline.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30175
diff changeset
    29
#include "gc/g1/g1CollectedHeap.inline.hpp"
47789
a77a7d3bc4f6 8149127: Rename g1/concurrentMarkThread.* to g1/g1ConcurrentMarkThread.*
tschatzl
parents: 47647
diff changeset
    30
#include "gc/g1/g1ConcurrentRefine.hpp"
35210
eb1d5c68bf64 8145672: Remove dependency of G1FromCardCache to HeapRegionRemSet
tschatzl
parents: 35198
diff changeset
    31
#include "gc/g1/g1FromCardCache.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30175
diff changeset
    32
#include "gc/g1/g1GCPhaseTimes.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30175
diff changeset
    33
#include "gc/g1/g1HotCardCache.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30175
diff changeset
    34
#include "gc/g1/g1OopClosures.inline.hpp"
47885
5caa1d5f74c1 8186571: Implementation: JEP 307: Parallel Full GC for G1
sjohanss
parents: 47789
diff changeset
    35
#include "gc/g1/g1RemSet.hpp"
35198
1365be812a7d 8145674: Fix includes and forward declarations in g1Remset files
tschatzl
parents: 35068
diff changeset
    36
#include "gc/g1/heapRegion.inline.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30175
diff changeset
    37
#include "gc/g1/heapRegionManager.inline.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30175
diff changeset
    38
#include "gc/g1/heapRegionRemSet.hpp"
37414
2672ba9af0dc 8151386: Extract card live data out of G1ConcurrentMark
tschatzl
parents: 37248
diff changeset
    39
#include "gc/shared/gcTraceTime.inline.hpp"
47647
64dba69fc528 8189276: Make SuspendibleThreadSet and related code available to other GCs
rkennke
parents: 47216
diff changeset
    40
#include "gc/shared/suspendibleThreadSet.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    41
#include "memory/iterator.hpp"
37248
11a660dbbb8e 8132524: Missing includes to resourceArea.hpp
jprovino
parents: 37242
diff changeset
    42
#include "memory/resourceArea.hpp"
49607
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
    43
#include "oops/access.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    44
#include "oops/oop.inline.hpp"
46625
edefffab74e2 8183552: Move align functions to align.hpp
stefank
parents: 46619
diff changeset
    45
#include "utilities/align.hpp"
24098
48f07e2c74de 8039957: Replace the last few %p usages with PTR_FORMAT in the GC code
stefank
parents: 23858
diff changeset
    46
#include "utilities/globalDefinitions.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7385
diff changeset
    47
#include "utilities/intHisto.hpp"
30175
543725014c9d 8076457: Fix includes of inline.hpp in GC code
stefank
parents: 29796
diff changeset
    48
#include "utilities/stack.inline.hpp"
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    49
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
    50
// Collects information about the overall remembered set scan progress during an evacuation.
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
    51
class G1RemSetScanState : public CHeapObj<mtGC> {
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
    52
private:
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    53
  class G1ClearCardTableTask : public AbstractGangTask {
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    54
    G1CollectedHeap* _g1h;
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    55
    uint* _dirty_region_list;
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    56
    size_t _num_dirty_regions;
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    57
    size_t _chunk_length;
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    58
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    59
    size_t volatile _cur_dirty_regions;
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    60
  public:
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    61
    G1ClearCardTableTask(G1CollectedHeap* g1h,
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    62
                         uint* dirty_region_list,
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    63
                         size_t num_dirty_regions,
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    64
                         size_t chunk_length) :
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    65
      AbstractGangTask("G1 Clear Card Table Task"),
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    66
      _g1h(g1h),
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    67
      _dirty_region_list(dirty_region_list),
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    68
      _num_dirty_regions(num_dirty_regions),
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    69
      _chunk_length(chunk_length),
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    70
      _cur_dirty_regions(0) {
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    71
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    72
      assert(chunk_length > 0, "must be");
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    73
    }
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    74
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    75
    static size_t chunk_size() { return M; }
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    76
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    77
    void work(uint worker_id) {
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
    78
      G1CardTable* ct = _g1h->card_table();
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    79
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    80
      while (_cur_dirty_regions < _num_dirty_regions) {
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    81
        size_t next = Atomic::add(_chunk_length, &_cur_dirty_regions) - _chunk_length;
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    82
        size_t max = MIN2(next + _chunk_length, _num_dirty_regions);
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    83
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    84
        for (size_t i = next; i < max; i++) {
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    85
          HeapRegion* r = _g1h->region_at(_dirty_region_list[i]);
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    86
          if (!r->is_survivor()) {
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
    87
            ct->clear(MemRegion(r->bottom(), r->end()));
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    88
          }
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    89
        }
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    90
      }
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    91
    }
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    92
  };
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
    93
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
    94
  size_t _max_regions;
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
    95
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
    96
  // Scan progress for the remembered set of a single region. Transitions from
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
    97
  // Unclaimed -> Claimed -> Complete.
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
    98
  // At each of the transitions the thread that does the transition needs to perform
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
    99
  // some special action once. This is the reason for the extra "Claimed" state.
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   100
  typedef jint G1RemsetIterState;
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   101
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   102
  static const G1RemsetIterState Unclaimed = 0; // The remembered set has not been scanned yet.
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   103
  static const G1RemsetIterState Claimed = 1;   // The remembered set is currently being scanned.
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   104
  static const G1RemsetIterState Complete = 2;  // The remembered set has been completely scanned.
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   105
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   106
  G1RemsetIterState volatile* _iter_states;
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   107
  // The current location where the next thread should continue scanning in a region's
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   108
  // remembered set.
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   109
  size_t volatile* _iter_claims;
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   110
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   111
  // Temporary buffer holding the regions we used to store remembered set scan duplicate
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   112
  // information. These are also called "dirty". Valid entries are from [0.._cur_dirty_region)
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   113
  uint* _dirty_region_buffer;
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   114
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   115
  typedef jbyte IsDirtyRegionState;
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   116
  static const IsDirtyRegionState Clean = 0;
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   117
  static const IsDirtyRegionState Dirty = 1;
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   118
  // Holds a flag for every region whether it is in the _dirty_region_buffer already
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   119
  // to avoid duplicates. Uses jbyte since there are no atomic instructions for bools.
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   120
  IsDirtyRegionState* _in_dirty_region_buffer;
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   121
  size_t _cur_dirty_region;
46520
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   122
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   123
  // Creates a snapshot of the current _top values at the start of collection to
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   124
  // filter out card marks that we do not want to scan.
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   125
  class G1ResetScanTopClosure : public HeapRegionClosure {
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   126
  private:
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   127
    HeapWord** _scan_top;
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   128
  public:
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   129
    G1ResetScanTopClosure(HeapWord** scan_top) : _scan_top(scan_top) { }
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   130
48950
f323537c9b75 8196602: Change HeapRegionClosure to comply to naming conventions
tschatzl
parents: 48103
diff changeset
   131
    virtual bool do_heap_region(HeapRegion* r) {
46520
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   132
      uint hrm_index = r->hrm_index();
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   133
      if (!r->in_collection_set() && r->is_old_or_humongous()) {
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   134
        _scan_top[hrm_index] = r->top();
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   135
      } else {
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   136
        _scan_top[hrm_index] = r->bottom();
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   137
      }
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   138
      return false;
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   139
    }
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   140
  };
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   141
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   142
  // For each region, contains the maximum top() value to be used during this garbage
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   143
  // collection. Subsumes common checks like filtering out everything but old and
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   144
  // humongous regions outside the collection set.
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   145
  // This is valid because we are not interested in scanning stray remembered set
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   146
  // entries from free or archive regions.
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   147
  HeapWord** _scan_top;
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   148
public:
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   149
  G1RemSetScanState() :
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   150
    _max_regions(0),
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   151
    _iter_states(NULL),
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   152
    _iter_claims(NULL),
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   153
    _dirty_region_buffer(NULL),
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   154
    _in_dirty_region_buffer(NULL),
46520
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   155
    _cur_dirty_region(0),
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   156
    _scan_top(NULL) {
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   157
  }
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   158
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   159
  ~G1RemSetScanState() {
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   160
    if (_iter_states != NULL) {
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   161
      FREE_C_HEAP_ARRAY(G1RemsetIterState, _iter_states);
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   162
    }
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   163
    if (_iter_claims != NULL) {
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   164
      FREE_C_HEAP_ARRAY(size_t, _iter_claims);
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   165
    }
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   166
    if (_dirty_region_buffer != NULL) {
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   167
      FREE_C_HEAP_ARRAY(uint, _dirty_region_buffer);
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   168
    }
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   169
    if (_in_dirty_region_buffer != NULL) {
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   170
      FREE_C_HEAP_ARRAY(IsDirtyRegionState, _in_dirty_region_buffer);
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   171
    }
46520
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   172
    if (_scan_top != NULL) {
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   173
      FREE_C_HEAP_ARRAY(HeapWord*, _scan_top);
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   174
    }
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   175
  }
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   176
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   177
  void initialize(uint max_regions) {
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   178
    assert(_iter_states == NULL, "Must not be initialized twice");
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   179
    assert(_iter_claims == NULL, "Must not be initialized twice");
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   180
    _max_regions = max_regions;
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   181
    _iter_states = NEW_C_HEAP_ARRAY(G1RemsetIterState, max_regions, mtGC);
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   182
    _iter_claims = NEW_C_HEAP_ARRAY(size_t, max_regions, mtGC);
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   183
    _dirty_region_buffer = NEW_C_HEAP_ARRAY(uint, max_regions, mtGC);
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   184
    _in_dirty_region_buffer = NEW_C_HEAP_ARRAY(IsDirtyRegionState, max_regions, mtGC);
46520
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   185
    _scan_top = NEW_C_HEAP_ARRAY(HeapWord*, max_regions, mtGC);
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   186
  }
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   187
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   188
  void reset() {
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   189
    for (uint i = 0; i < _max_regions; i++) {
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   190
      _iter_states[i] = Unclaimed;
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   191
    }
46520
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   192
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   193
    G1ResetScanTopClosure cl(_scan_top);
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   194
    G1CollectedHeap::heap()->heap_region_iterate(&cl);
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   195
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   196
    memset((void*)_iter_claims, 0, _max_regions * sizeof(size_t));
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   197
    memset(_in_dirty_region_buffer, Clean, _max_regions * sizeof(IsDirtyRegionState));
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   198
    _cur_dirty_region = 0;
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   199
  }
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   200
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   201
  // Attempt to claim the remembered set of the region for iteration. Returns true
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   202
  // if this call caused the transition from Unclaimed to Claimed.
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   203
  inline bool claim_iter(uint region) {
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   204
    assert(region < _max_regions, "Tried to access invalid region %u", region);
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   205
    if (_iter_states[region] != Unclaimed) {
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   206
      return false;
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   207
    }
48955
e22914003cf0 8194691: Cleanup unnecessary casts in Atomic/OrderAccess uses
kbarrett
parents: 48954
diff changeset
   208
    G1RemsetIterState res = Atomic::cmpxchg(Claimed, &_iter_states[region], Unclaimed);
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   209
    return (res == Unclaimed);
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   210
  }
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   211
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   212
  // Try to atomically sets the iteration state to "complete". Returns true for the
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   213
  // thread that caused the transition.
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   214
  inline bool set_iter_complete(uint region) {
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   215
    if (iter_is_complete(region)) {
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   216
      return false;
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   217
    }
48955
e22914003cf0 8194691: Cleanup unnecessary casts in Atomic/OrderAccess uses
kbarrett
parents: 48954
diff changeset
   218
    G1RemsetIterState res = Atomic::cmpxchg(Complete, &_iter_states[region], Claimed);
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   219
    return (res == Claimed);
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   220
  }
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   221
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   222
  // Returns true if the region's iteration is complete.
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   223
  inline bool iter_is_complete(uint region) const {
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   224
    assert(region < _max_regions, "Tried to access invalid region %u", region);
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   225
    return _iter_states[region] == Complete;
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   226
  }
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   227
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   228
  // The current position within the remembered set of the given region.
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   229
  inline size_t iter_claimed(uint region) const {
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   230
    assert(region < _max_regions, "Tried to access invalid region %u", region);
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   231
    return _iter_claims[region];
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   232
  }
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   233
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   234
  // Claim the next block of cards within the remembered set of the region with
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   235
  // step size.
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   236
  inline size_t iter_claimed_next(uint region, size_t step) {
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   237
    return Atomic::add(step, &_iter_claims[region]) - step;
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   238
  }
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   239
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   240
  void add_dirty_region(uint region) {
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   241
    if (_in_dirty_region_buffer[region] == Dirty) {
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   242
      return;
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   243
    }
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   244
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   245
    bool marked_as_dirty = Atomic::cmpxchg(Dirty, &_in_dirty_region_buffer[region], Clean) == Clean;
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   246
    if (marked_as_dirty) {
46993
dd0f91c85ffc 8186476: Generalize Atomic::add with templates
eosterlund
parents: 46778
diff changeset
   247
      size_t allocated = Atomic::add(1u, &_cur_dirty_region) - 1;
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   248
      _dirty_region_buffer[allocated] = region;
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   249
    }
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   250
  }
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   251
46520
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   252
  HeapWord* scan_top(uint region_idx) const {
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   253
    return _scan_top[region_idx];
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   254
  }
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   255
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   256
  // Clear the card table of "dirty" regions.
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   257
  void clear_card_table(WorkGang* workers) {
38160
13a14d5777b0 8155813: Fix indentation in G1RemSetScanState::clear_card_table()
tschatzl
parents: 38154
diff changeset
   258
    if (_cur_dirty_region == 0) {
13a14d5777b0 8155813: Fix indentation in G1RemSetScanState::clear_card_table()
tschatzl
parents: 38154
diff changeset
   259
      return;
13a14d5777b0 8155813: Fix indentation in G1RemSetScanState::clear_card_table()
tschatzl
parents: 38154
diff changeset
   260
    }
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   261
46619
a3919f5e8d2b 8178499: Remove _ptr_ and _size_ infixes from align functions
stefank
parents: 46614
diff changeset
   262
    size_t const num_chunks = align_up(_cur_dirty_region * HeapRegion::CardsPerRegion, G1ClearCardTableTask::chunk_size()) / G1ClearCardTableTask::chunk_size();
38160
13a14d5777b0 8155813: Fix indentation in G1RemSetScanState::clear_card_table()
tschatzl
parents: 38154
diff changeset
   263
    uint const num_workers = (uint)MIN2(num_chunks, (size_t)workers->active_workers());
13a14d5777b0 8155813: Fix indentation in G1RemSetScanState::clear_card_table()
tschatzl
parents: 38154
diff changeset
   264
    size_t const chunk_length = G1ClearCardTableTask::chunk_size() / HeapRegion::CardsPerRegion;
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   265
38160
13a14d5777b0 8155813: Fix indentation in G1RemSetScanState::clear_card_table()
tschatzl
parents: 38154
diff changeset
   266
    // Iterate over the dirty cards region list.
13a14d5777b0 8155813: Fix indentation in G1RemSetScanState::clear_card_table()
tschatzl
parents: 38154
diff changeset
   267
    G1ClearCardTableTask cl(G1CollectedHeap::heap(), _dirty_region_buffer, _cur_dirty_region, chunk_length);
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   268
38160
13a14d5777b0 8155813: Fix indentation in G1RemSetScanState::clear_card_table()
tschatzl
parents: 38154
diff changeset
   269
    log_debug(gc, ergo)("Running %s using %u workers for " SIZE_FORMAT " "
13a14d5777b0 8155813: Fix indentation in G1RemSetScanState::clear_card_table()
tschatzl
parents: 38154
diff changeset
   270
                        "units of work for " SIZE_FORMAT " regions.",
13a14d5777b0 8155813: Fix indentation in G1RemSetScanState::clear_card_table()
tschatzl
parents: 38154
diff changeset
   271
                        cl.name(), num_workers, num_chunks, _cur_dirty_region);
13a14d5777b0 8155813: Fix indentation in G1RemSetScanState::clear_card_table()
tschatzl
parents: 38154
diff changeset
   272
    workers->run_task(&cl, num_workers);
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   273
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   274
#ifndef PRODUCT
38160
13a14d5777b0 8155813: Fix indentation in G1RemSetScanState::clear_card_table()
tschatzl
parents: 38154
diff changeset
   275
    // Need to synchronize with concurrent cleanup since it needs to
13a14d5777b0 8155813: Fix indentation in G1RemSetScanState::clear_card_table()
tschatzl
parents: 38154
diff changeset
   276
    // finish its card table clearing before we can verify.
13a14d5777b0 8155813: Fix indentation in G1RemSetScanState::clear_card_table()
tschatzl
parents: 38154
diff changeset
   277
    G1CollectedHeap::heap()->wait_while_free_regions_coming();
13a14d5777b0 8155813: Fix indentation in G1RemSetScanState::clear_card_table()
tschatzl
parents: 38154
diff changeset
   278
    G1CollectedHeap::heap()->verifier()->verify_card_table_cleanup();
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   279
#endif
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   280
  }
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   281
};
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   282
38172
90f405aac699 8155524: HotCardCache shouldn't be part of ConcurrentG1Refine
kbarrett
parents: 38160
diff changeset
   283
G1RemSet::G1RemSet(G1CollectedHeap* g1,
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   284
                   G1CardTable* ct,
38172
90f405aac699 8155524: HotCardCache shouldn't be part of ConcurrentG1Refine
kbarrett
parents: 38160
diff changeset
   285
                   G1HotCardCache* hot_card_cache) :
35198
1365be812a7d 8145674: Fix includes and forward declarations in g1Remset files
tschatzl
parents: 35068
diff changeset
   286
  _g1(g1),
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   287
  _scan_state(new G1RemSetScanState()),
46614
ae1105fff9e4 8179677: Let G1Remset::_conc_refined_cards only count number of cards concurrently refined
tschatzl
parents: 46611
diff changeset
   288
  _num_conc_refined_cards(0),
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   289
  _ct(ct),
35198
1365be812a7d 8145674: Fix includes and forward declarations in g1Remset files
tschatzl
parents: 35068
diff changeset
   290
  _g1p(_g1->g1_policy()),
38172
90f405aac699 8155524: HotCardCache shouldn't be part of ConcurrentG1Refine
kbarrett
parents: 38160
diff changeset
   291
  _hot_card_cache(hot_card_cache),
46670
55a3c36b64b2 8183539: Remove G1RemSet::_into_cset_dirty_card_queue_set
ehelin
parents: 46653
diff changeset
   292
  _prev_period_summary() {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   293
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   294
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6759
diff changeset
   295
G1RemSet::~G1RemSet() {
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   296
  if (_scan_state != NULL) {
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   297
    delete _scan_state;
2142
032f4652700c 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 2009
diff changeset
   298
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   299
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   300
35210
eb1d5c68bf64 8145672: Remove dependency of G1FromCardCache to HeapRegionRemSet
tschatzl
parents: 35198
diff changeset
   301
uint G1RemSet::num_par_rem_sets() {
49607
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   302
  return DirtyCardQueueSet::num_par_ids() + G1ConcurrentRefine::max_num_threads() + MAX2(ConcGCThreads, ParallelGCThreads);
35210
eb1d5c68bf64 8145672: Remove dependency of G1FromCardCache to HeapRegionRemSet
tschatzl
parents: 35198
diff changeset
   303
}
eb1d5c68bf64 8145672: Remove dependency of G1FromCardCache to HeapRegionRemSet
tschatzl
parents: 35198
diff changeset
   304
37414
2672ba9af0dc 8151386: Extract card live data out of G1ConcurrentMark
tschatzl
parents: 37248
diff changeset
   305
void G1RemSet::initialize(size_t capacity, uint max_regions) {
35210
eb1d5c68bf64 8145672: Remove dependency of G1FromCardCache to HeapRegionRemSet
tschatzl
parents: 35198
diff changeset
   306
  G1FromCardCache::initialize(num_par_rem_sets(), max_regions);
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   307
  _scan_state->initialize(max_regions);
35210
eb1d5c68bf64 8145672: Remove dependency of G1FromCardCache to HeapRegionRemSet
tschatzl
parents: 35198
diff changeset
   308
}
eb1d5c68bf64 8145672: Remove dependency of G1FromCardCache to HeapRegionRemSet
tschatzl
parents: 35198
diff changeset
   309
46575
d6fb8a7a7843 8178151: Clean up G1RemSet files
tschatzl
parents: 46572
diff changeset
   310
G1ScanRSForRegionClosure::G1ScanRSForRegionClosure(G1RemSetScanState* scan_state,
d6fb8a7a7843 8178151: Clean up G1RemSet files
tschatzl
parents: 46572
diff changeset
   311
                                                   G1ScanObjsDuringScanRSClosure* scan_obj_on_card,
d6fb8a7a7843 8178151: Clean up G1RemSet files
tschatzl
parents: 46572
diff changeset
   312
                                                   CodeBlobClosure* code_root_cl,
d6fb8a7a7843 8178151: Clean up G1RemSet files
tschatzl
parents: 46572
diff changeset
   313
                                                   uint worker_i) :
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   314
  _scan_state(scan_state),
46572
fef0d64b2263 8175554: Improve G1UpdateRSOrPushRefClosure
tschatzl
parents: 46571
diff changeset
   315
  _scan_objs_on_card_cl(scan_obj_on_card),
35198
1365be812a7d 8145674: Fix includes and forward declarations in g1Remset files
tschatzl
parents: 35068
diff changeset
   316
  _code_root_cl(code_root_cl),
1365be812a7d 8145674: Fix includes and forward declarations in g1Remset files
tschatzl
parents: 35068
diff changeset
   317
  _strong_code_root_scan_time_sec(0.0),
46571
c70b36f0730d 8178148: Log more detailed information about scan rs phase
tschatzl
parents: 46520
diff changeset
   318
  _cards_claimed(0),
c70b36f0730d 8178148: Log more detailed information about scan rs phase
tschatzl
parents: 46520
diff changeset
   319
  _cards_scanned(0),
c70b36f0730d 8178148: Log more detailed information about scan rs phase
tschatzl
parents: 46520
diff changeset
   320
  _cards_skipped(0),
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   321
  _worker_i(worker_i) {
34246
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   322
  _g1h = G1CollectedHeap::heap();
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   323
  _bot = _g1h->bot();
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   324
  _ct = _g1h->card_table();
34246
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   325
}
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   326
46635
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   327
void G1ScanRSForRegionClosure::scan_card(MemRegion mr, uint region_idx_for_card) {
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   328
  HeapRegion* const card_region = _g1h->region_at(region_idx_for_card);
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   329
  _scan_objs_on_card_cl->set_region(card_region);
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   330
  card_region->oops_on_card_seq_iterate_careful<true>(mr, _scan_objs_on_card_cl);
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   331
  _cards_scanned++;
34246
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   332
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   333
46575
d6fb8a7a7843 8178151: Clean up G1RemSet files
tschatzl
parents: 46572
diff changeset
   334
void G1ScanRSForRegionClosure::scan_strong_code_roots(HeapRegion* r) {
34246
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   335
  double scan_start = os::elapsedTime();
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   336
  r->strong_code_roots_do(_code_root_cl);
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   337
  _strong_code_root_scan_time_sec += (os::elapsedTime() - scan_start);
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   338
}
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   339
46635
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   340
void G1ScanRSForRegionClosure::claim_card(size_t card_index, const uint region_idx_for_card){
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   341
  _ct->set_card_claimed(card_index);
46635
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   342
  _scan_state->add_dirty_region(region_idx_for_card);
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   343
}
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   344
48950
f323537c9b75 8196602: Change HeapRegionClosure to comply to naming conventions
tschatzl
parents: 48103
diff changeset
   345
bool G1ScanRSForRegionClosure::do_heap_region(HeapRegion* r) {
34246
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   346
  assert(r->in_collection_set(), "should only be called on elements of CS.");
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   347
  uint region_idx = r->hrm_index();
34246
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   348
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   349
  if (_scan_state->iter_is_complete(region_idx)) {
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   350
    return false;
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   351
  }
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   352
  if (_scan_state->claim_iter(region_idx)) {
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   353
    // If we ever free the collection set concurrently, we should also
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   354
    // clear the card table concurrently therefore we won't need to
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   355
    // add regions of the collection set to the dirty cards region.
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   356
    _scan_state->add_dirty_region(region_idx);
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   357
  }
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   358
46575
d6fb8a7a7843 8178151: Clean up G1RemSet files
tschatzl
parents: 46572
diff changeset
   359
  // We claim cards in blocks so as to reduce the contention.
d6fb8a7a7843 8178151: Clean up G1RemSet files
tschatzl
parents: 46572
diff changeset
   360
  size_t const block_size = G1RSetScanBlockSize;
d6fb8a7a7843 8178151: Clean up G1RemSet files
tschatzl
parents: 46572
diff changeset
   361
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   362
  HeapRegionRemSetIterator iter(r->rem_set());
34246
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   363
  size_t card_index;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   364
46575
d6fb8a7a7843 8178151: Clean up G1RemSet files
tschatzl
parents: 46572
diff changeset
   365
  size_t claimed_card_block = _scan_state->iter_claimed_next(region_idx, block_size);
34246
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   366
  for (size_t current_card = 0; iter.has_next(card_index); current_card++) {
46575
d6fb8a7a7843 8178151: Clean up G1RemSet files
tschatzl
parents: 46572
diff changeset
   367
    if (current_card >= claimed_card_block + block_size) {
d6fb8a7a7843 8178151: Clean up G1RemSet files
tschatzl
parents: 46572
diff changeset
   368
      claimed_card_block = _scan_state->iter_claimed_next(region_idx, block_size);
34246
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   369
    }
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   370
    if (current_card < claimed_card_block) {
46571
c70b36f0730d 8178148: Log more detailed information about scan rs phase
tschatzl
parents: 46520
diff changeset
   371
      _cards_skipped++;
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   372
      continue;
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   373
    }
46571
c70b36f0730d 8178148: Log more detailed information about scan rs phase
tschatzl
parents: 46520
diff changeset
   374
    _cards_claimed++;
34246
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   375
46635
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   376
    // If the card is dirty, then G1 will scan it during Update RS.
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   377
    if (_ct->is_card_claimed(card_index) || _ct->is_card_dirty(card_index)) {
46635
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   378
      continue;
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   379
    }
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   380
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   381
    HeapWord* const card_start = _g1h->bot()->address_for_index(card_index);
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   382
    uint const region_idx_for_card = _g1h->addr_to_region(card_start);
34246
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   383
46635
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   384
    assert(_g1h->region_at(region_idx_for_card)->is_in_reserved(card_start),
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   385
           "Card start " PTR_FORMAT " to scan outside of region %u", p2i(card_start), _g1h->region_at(region_idx_for_card)->hrm_index());
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   386
    HeapWord* const top = _scan_state->scan_top(region_idx_for_card);
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   387
    if (card_start >= top) {
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   388
      continue;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   389
    }
46635
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   390
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   391
    // We claim lazily (so races are possible but they're benign), which reduces the
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   392
    // number of duplicate scans (the rsets of the regions in the cset can intersect).
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   393
    // Claim the card after checking bounds above: the remembered set may contain
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   394
    // random cards into current survivor, and we would then have an incorrectly
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   395
    // claimed card in survivor space. Card table clear does not reset the card table
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   396
    // of survivor space regions.
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   397
    claim_card(card_index, region_idx_for_card);
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   398
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   399
    MemRegion const mr(card_start, MIN2(card_start + BOTConstants::N_words, top));
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   400
ef7cac5de811 8179679: Rearrange filters before card scanning
tschatzl
parents: 46625
diff changeset
   401
    scan_card(mr, region_idx_for_card);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   402
  }
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   403
  if (_scan_state->set_iter_complete(region_idx)) {
34246
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   404
    // Scan the strong code root list attached to the current region
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   405
    scan_strong_code_roots(r);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   406
  }
34246
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   407
  return false;
d2c05216f375 8142390: Move ScanRSClosure to header file
ehelin
parents: 34135
diff changeset
   408
}
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   409
46572
fef0d64b2263 8175554: Improve G1UpdateRSOrPushRefClosure
tschatzl
parents: 46571
diff changeset
   410
void G1RemSet::scan_rem_set(G1ParScanThreadState* pss,
46571
c70b36f0730d 8178148: Log more detailed information about scan rs phase
tschatzl
parents: 46520
diff changeset
   411
                            CodeBlobClosure* heap_region_codeblobs,
c70b36f0730d 8178148: Log more detailed information about scan rs phase
tschatzl
parents: 46520
diff changeset
   412
                            uint worker_i) {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   413
  double rs_time_start = os::elapsedTime();
32617
a59435e1fecc 8135012: Don't use G1RootProcessor when scanning remembered sets
mgerdin
parents: 31592
diff changeset
   414
46572
fef0d64b2263 8175554: Improve G1UpdateRSOrPushRefClosure
tschatzl
parents: 46571
diff changeset
   415
  G1ScanObjsDuringScanRSClosure scan_cl(_g1, pss);
46575
d6fb8a7a7843 8178151: Clean up G1RemSet files
tschatzl
parents: 46572
diff changeset
   416
  G1ScanRSForRegionClosure cl(_scan_state, &scan_cl, heap_region_codeblobs, worker_i);
39698
4016de4e596b 8159978: Use an array to store the collection set regions instead of linking through regions
tschatzl
parents: 38172
diff changeset
   417
  _g1->collection_set_iterate_from(&cl, worker_i);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10000
diff changeset
   418
46571
c70b36f0730d 8178148: Log more detailed information about scan rs phase
tschatzl
parents: 46520
diff changeset
   419
  double scan_rs_time_sec = (os::elapsedTime() - rs_time_start) -
c70b36f0730d 8178148: Log more detailed information about scan rs phase
tschatzl
parents: 46520
diff changeset
   420
                             cl.strong_code_root_scan_time_sec();
c70b36f0730d 8178148: Log more detailed information about scan rs phase
tschatzl
parents: 46520
diff changeset
   421
c70b36f0730d 8178148: Log more detailed information about scan rs phase
tschatzl
parents: 46520
diff changeset
   422
  G1GCPhaseTimes* p = _g1p->phase_times();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   423
46571
c70b36f0730d 8178148: Log more detailed information about scan rs phase
tschatzl
parents: 46520
diff changeset
   424
  p->record_time_secs(G1GCPhaseTimes::ScanRS, worker_i, scan_rs_time_sec);
46778
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   425
  p->record_thread_work_item(G1GCPhaseTimes::ScanRS, worker_i, cl.cards_scanned(), G1GCPhaseTimes::ScanRSScannedCards);
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   426
  p->record_thread_work_item(G1GCPhaseTimes::ScanRS, worker_i, cl.cards_claimed(), G1GCPhaseTimes::ScanRSClaimedCards);
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   427
  p->record_thread_work_item(G1GCPhaseTimes::ScanRS, worker_i, cl.cards_skipped(), G1GCPhaseTimes::ScanRSSkippedCards);
32737
f02118695c2f 8135154: Move cards scanned and surviving young words aggregation to G1ParScanThreadStateSet
mgerdin
parents: 32617
diff changeset
   428
46571
c70b36f0730d 8178148: Log more detailed information about scan rs phase
tschatzl
parents: 46520
diff changeset
   429
  p->record_time_secs(G1GCPhaseTimes::CodeRoots, worker_i, cl.strong_code_root_scan_time_sec());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   430
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   431
46670
55a3c36b64b2 8183539: Remove G1RemSet::_into_cset_dirty_card_queue_set
ehelin
parents: 46653
diff changeset
   432
// Closure used for updating rem sets. Only called during an evacuation pause.
46580
130fde4acb34 8183122: Rename RefineRecordRefsIntoCSCardTableEntryClosure to G1RefineCardClosure
ehelin
parents: 46575
diff changeset
   433
class G1RefineCardClosure: public CardTableEntryClosure {
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   434
  G1RemSet* _g1rs;
46572
fef0d64b2263 8175554: Improve G1UpdateRSOrPushRefClosure
tschatzl
parents: 46571
diff changeset
   435
  G1ScanObjsDuringUpdateRSClosure* _update_rs_cl;
46778
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   436
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   437
  size_t _cards_scanned;
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   438
  size_t _cards_skipped;
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   439
public:
46670
55a3c36b64b2 8183539: Remove G1RemSet::_into_cset_dirty_card_queue_set
ehelin
parents: 46653
diff changeset
   440
  G1RefineCardClosure(G1CollectedHeap* g1h, G1ScanObjsDuringUpdateRSClosure* update_rs_cl) :
46778
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   441
    _g1rs(g1h->g1_rem_set()), _update_rs_cl(update_rs_cl), _cards_scanned(0), _cards_skipped(0)
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   442
  {}
33204
b8a3901ac5b3 8069330: Adjustment of concurrent refinement thresholds does not take hot card cache into account
tschatzl
parents: 33105
diff changeset
   443
23855
c4574075402c 8016302: Change type of the number of GC workers to unsigned int (2)
vkempik
parents: 23455
diff changeset
   444
  bool do_card_ptr(jbyte* card_ptr, uint worker_i) {
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   445
    // The only time we care about recording cards that
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   446
    // contain references that point into the collection set
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   447
    // is during RSet updating within an evacuation pause.
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   448
    // In this case worker_i should be the id of a GC worker thread.
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   449
    assert(SafepointSynchronize::is_at_safepoint(), "not during an evacuation pause");
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   450
46778
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   451
    bool card_scanned = _g1rs->refine_card_during_gc(card_ptr, _update_rs_cl);
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   452
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   453
    if (card_scanned) {
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   454
      _cards_scanned++;
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   455
    } else {
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   456
      _cards_skipped++;
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   457
    }
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   458
    return true;
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   459
  }
46778
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   460
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   461
  size_t cards_scanned() const { return _cards_scanned; }
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   462
  size_t cards_skipped() const { return _cards_skipped; }
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   463
};
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   464
46670
55a3c36b64b2 8183539: Remove G1RemSet::_into_cset_dirty_card_queue_set
ehelin
parents: 46653
diff changeset
   465
void G1RemSet::update_rem_set(G1ParScanThreadState* pss, uint worker_i) {
46572
fef0d64b2263 8175554: Improve G1UpdateRSOrPushRefClosure
tschatzl
parents: 46571
diff changeset
   466
  G1ScanObjsDuringUpdateRSClosure update_rs_cl(_g1, pss, worker_i);
46670
55a3c36b64b2 8183539: Remove G1RemSet::_into_cset_dirty_card_queue_set
ehelin
parents: 46653
diff changeset
   467
  G1RefineCardClosure refine_card_cl(_g1, &update_rs_cl);
10670
4ea0e7d2ffbc 6484982: G1: process references during evacuation pauses
johnc
parents: 10000
diff changeset
   468
33204
b8a3901ac5b3 8069330: Adjustment of concurrent refinement thresholds does not take hot card cache into account
tschatzl
parents: 33105
diff changeset
   469
  G1GCParPhaseTimesTracker x(_g1p->phase_times(), G1GCPhaseTimes::UpdateRS, worker_i);
38172
90f405aac699 8155524: HotCardCache shouldn't be part of ConcurrentG1Refine
kbarrett
parents: 38160
diff changeset
   470
  if (G1HotCardCache::default_use_cache()) {
33204
b8a3901ac5b3 8069330: Adjustment of concurrent refinement thresholds does not take hot card cache into account
tschatzl
parents: 33105
diff changeset
   471
    // Apply the closure to the entries of the hot card cache.
b8a3901ac5b3 8069330: Adjustment of concurrent refinement thresholds does not take hot card cache into account
tschatzl
parents: 33105
diff changeset
   472
    G1GCParPhaseTimesTracker y(_g1p->phase_times(), G1GCPhaseTimes::ScanHCC, worker_i);
46580
130fde4acb34 8183122: Rename RefineRecordRefsIntoCSCardTableEntryClosure to G1RefineCardClosure
ehelin
parents: 46575
diff changeset
   473
    _g1->iterate_hcc_closure(&refine_card_cl, worker_i);
33204
b8a3901ac5b3 8069330: Adjustment of concurrent refinement thresholds does not take hot card cache into account
tschatzl
parents: 33105
diff changeset
   474
  }
b8a3901ac5b3 8069330: Adjustment of concurrent refinement thresholds does not take hot card cache into account
tschatzl
parents: 33105
diff changeset
   475
  // Apply the closure to all remaining log entries.
46580
130fde4acb34 8183122: Rename RefineRecordRefsIntoCSCardTableEntryClosure to G1RefineCardClosure
ehelin
parents: 46575
diff changeset
   476
  _g1->iterate_dirty_card_closure(&refine_card_cl, worker_i);
46778
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   477
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   478
  G1GCPhaseTimes* p = _g1p->phase_times();
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   479
  p->record_thread_work_item(G1GCPhaseTimes::UpdateRS, worker_i, refine_card_cl.cards_scanned(), G1GCPhaseTimes::UpdateRSScannedCards);
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   480
  p->record_thread_work_item(G1GCPhaseTimes::UpdateRS, worker_i, refine_card_cl.cards_skipped(), G1GCPhaseTimes::UpdateRSSkippedCards);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   481
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   482
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6759
diff changeset
   483
void G1RemSet::cleanupHRRS() {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   484
  HeapRegionRemSet::cleanup();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   485
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   486
46572
fef0d64b2263 8175554: Improve G1UpdateRSOrPushRefClosure
tschatzl
parents: 46571
diff changeset
   487
void G1RemSet::oops_into_collection_set_do(G1ParScanThreadState* pss,
46571
c70b36f0730d 8178148: Log more detailed information about scan rs phase
tschatzl
parents: 46520
diff changeset
   488
                                           CodeBlobClosure* heap_region_codeblobs,
c70b36f0730d 8178148: Log more detailed information about scan rs phase
tschatzl
parents: 46520
diff changeset
   489
                                           uint worker_i) {
46670
55a3c36b64b2 8183539: Remove G1RemSet::_into_cset_dirty_card_queue_set
ehelin
parents: 46653
diff changeset
   490
  update_rem_set(pss, worker_i);
46572
fef0d64b2263 8175554: Improve G1UpdateRSOrPushRefClosure
tschatzl
parents: 46571
diff changeset
   491
  scan_rem_set(pss, heap_region_codeblobs, worker_i);;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   492
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   493
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6759
diff changeset
   494
void G1RemSet::prepare_for_oops_into_collection_set_do() {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   495
  DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   496
  dcqs.concatenate_logs();
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   497
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   498
  _scan_state->reset();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   499
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   500
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6759
diff changeset
   501
void G1RemSet::cleanup_after_oops_into_collection_set_do() {
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   502
  G1GCPhaseTimes* phase_times = _g1->g1_policy()->phase_times();
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   503
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   504
  // Set all cards back to clean.
38154
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   505
  double start = os::elapsedTime();
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   506
  _scan_state->clear_card_table(_g1->workers());
4c30333c304e 8153507: Improve Card Table Clear Task
tschatzl
parents: 37988
diff changeset
   507
  phase_times->record_clear_ct_time((os::elapsedTime() - start) * 1000.0);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   508
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   509
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   510
inline void check_card_ptr(jbyte* card_ptr, G1CardTable* ct) {
46519
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   511
#ifdef ASSERT
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   512
  G1CollectedHeap* g1 = G1CollectedHeap::heap();
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   513
  assert(g1->is_in_exact(ct->addr_for(card_ptr)),
46519
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   514
         "Card at " PTR_FORMAT " index " SIZE_FORMAT " representing heap at " PTR_FORMAT " (%u) must be in committed heap",
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   515
         p2i(card_ptr),
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   516
         ct->index_for(ct->addr_for(card_ptr)),
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   517
         p2i(ct->addr_for(card_ptr)),
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   518
         g1->addr_to_region(ct->addr_for(card_ptr)));
46519
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   519
#endif
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   520
}
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   521
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   522
void G1RemSet::refine_card_concurrently(jbyte* card_ptr,
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   523
                                        uint worker_i) {
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   524
  assert(!_g1->is_gc_active(), "Only call concurrently");
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17108
diff changeset
   525
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   526
  check_card_ptr(card_ptr, _ct);
37988
bf4018edea5e 8153503: Move remset scan iteration claim to remset local data structure
tschatzl
parents: 37985
diff changeset
   527
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17108
diff changeset
   528
  // If the card is no longer dirty, nothing to do.
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   529
  if (*card_ptr != G1CardTable::dirty_card_val()) {
46519
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   530
    return;
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   531
  }
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   532
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   533
  // Construct the region representing the card.
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   534
  HeapWord* start = _ct->addr_for(card_ptr);
46519
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   535
  // And find the region containing it.
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   536
  HeapRegion* r = _g1->heap_region_containing(start);
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   537
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   538
  // This check is needed for some uncommon cases where we should
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   539
  // ignore the card.
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   540
  //
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   541
  // The region could be young.  Cards for young regions are
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   542
  // distinctly marked (set to g1_young_gen), so the post-barrier will
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   543
  // filter them out.  However, that marking is performed
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   544
  // concurrently.  A write to a young object could occur before the
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   545
  // card has been marked young, slipping past the filter.
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   546
  //
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   547
  // The card could be stale, because the region has been freed since
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   548
  // the card was recorded. In this case the region type could be
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   549
  // anything.  If (still) free or (reallocated) young, just ignore
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   550
  // it.  If (reallocated) old or humongous, the later card trimming
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   551
  // and additional checks in iteration may detect staleness.  At
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   552
  // worst, we end up processing a stale card unnecessarily.
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   553
  //
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   554
  // In the normal (non-stale) case, the synchronization between the
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   555
  // enqueueing of the card and processing it here will have ensured
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   556
  // we see the up-to-date region type here.
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   557
  if (!r->is_old_or_humongous()) {
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   558
    return;
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   559
  }
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   560
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   561
  // The result from the hot card cache insert call is either:
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   562
  //   * pointer to the current card
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   563
  //     (implying that the current card is not 'hot'),
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   564
  //   * null
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   565
  //     (meaning we had inserted the card ptr into the "hot" card cache,
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   566
  //     which had some headroom),
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   567
  //   * a pointer to a "hot" card that was evicted from the "hot" cache.
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   568
  //
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   569
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   570
  if (_hot_card_cache->use_cache()) {
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   571
    assert(!SafepointSynchronize::is_at_safepoint(), "sanity");
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   572
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   573
    const jbyte* orig_card_ptr = card_ptr;
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   574
    card_ptr = _hot_card_cache->insert(card_ptr);
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   575
    if (card_ptr == NULL) {
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   576
      // There was no eviction. Nothing to do.
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   577
      return;
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   578
    } else if (card_ptr != orig_card_ptr) {
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   579
      // Original card was inserted and an old card was evicted.
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   580
      start = _ct->addr_for(card_ptr);
46519
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   581
      r = _g1->heap_region_containing(start);
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   582
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   583
      // Check whether the region formerly in the cache should be
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   584
      // ignored, as discussed earlier for the original card.  The
49346
14e84a4edb9c 8198546: [Redo] JDK-8196883 G1RemSet::refine_card_concurrently doesn't need to check for cards in collection set
tschatzl
parents: 49194
diff changeset
   585
      // region could have been freed while in the cache.
46519
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   586
      if (!r->is_old_or_humongous()) {
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   587
        return;
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   588
      }
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   589
    } // Else we still have the original card.
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   590
  }
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   591
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   592
  // Trim the region designated by the card to what's been allocated
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   593
  // in the region.  The card could be stale, or the card could cover
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   594
  // (part of) an object at the end of the allocated space and extend
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   595
  // beyond the end of allocation.
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   596
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   597
  // Non-humongous objects are only allocated in the old-gen during
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   598
  // GC, so if region is old then top is stable.  Humongous object
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   599
  // allocation sets top last; if top has not yet been set, this is
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   600
  // a stale card and we'll end up with an empty intersection.  If
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   601
  // this is not a stale card, the synchronization between the
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   602
  // enqueuing of the card and processing it here will have ensured
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   603
  // we see the up-to-date top here.
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   604
  HeapWord* scan_limit = r->top();
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   605
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   606
  if (scan_limit <= start) {
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   607
    // If the trimmed region is empty, the card must be stale.
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   608
    return;
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   609
  }
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   610
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   611
  // Okay to clean and process the card now.  There are still some
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   612
  // stale card cases that may be detected by iteration and dealt with
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   613
  // as iteration failure.
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   614
  *const_cast<volatile jbyte*>(card_ptr) = G1CardTable::clean_card_val();
46519
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   615
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   616
  // This fence serves two purposes.  First, the card must be cleaned
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   617
  // before processing the contents.  Second, we can't proceed with
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   618
  // processing until after the read of top, for synchronization with
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   619
  // possibly concurrent humongous object allocation.  It's okay that
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   620
  // reading top and reading type were racy wrto each other.  We need
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   621
  // both set, in any order, to proceed.
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   622
  OrderAccess::fence();
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   623
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   624
  // Don't use addr_for(card_ptr + 1) which can ask for
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   625
  // a card beyond the heap.
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   626
  HeapWord* end = start + G1CardTable::card_size_in_words;
46519
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   627
  MemRegion dirty_region(start, MIN2(scan_limit, end));
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   628
  assert(!dirty_region.is_empty(), "sanity");
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   629
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   630
  G1ConcurrentRefineOopClosure conc_refine_cl(_g1, worker_i);
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   631
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   632
  bool card_processed =
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   633
    r->oops_on_card_seq_iterate_careful<false>(dirty_region, &conc_refine_cl);
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   634
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   635
  // If unable to process the card then we encountered an unparsable
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   636
  // part of the heap (e.g. a partially allocated object) while
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   637
  // processing a stale card.  Despite the card being stale, redirty
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   638
  // and re-enqueue, because we've already cleaned the card.  Without
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   639
  // this we could incorrectly discard a non-stale card.
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   640
  if (!card_processed) {
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   641
    // The card might have gotten re-dirtied and re-enqueued while we
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   642
    // worked.  (In fact, it's pretty likely.)
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   643
    if (*card_ptr != G1CardTable::dirty_card_val()) {
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   644
      *card_ptr = G1CardTable::dirty_card_val();
46519
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   645
      MutexLockerEx x(Shared_DirtyCardQ_lock,
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   646
                      Mutex::_no_safepoint_check_flag);
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   647
      DirtyCardQueue* sdcq =
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   648
        JavaThread::dirty_card_queue_set().shared_dirty_card_queue();
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   649
      sdcq->enqueue(card_ptr);
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   650
    }
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   651
  } else {
46614
ae1105fff9e4 8179677: Let G1Remset::_conc_refined_cards only count number of cards concurrently refined
tschatzl
parents: 46611
diff changeset
   652
    _num_conc_refined_cards++; // Unsynchronized update, only used for logging.
46519
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   653
  }
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   654
}
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   655
46778
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   656
bool G1RemSet::refine_card_during_gc(jbyte* card_ptr,
46572
fef0d64b2263 8175554: Improve G1UpdateRSOrPushRefClosure
tschatzl
parents: 46571
diff changeset
   657
                                     G1ScanObjsDuringUpdateRSClosure* update_rs_cl) {
46519
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   658
  assert(_g1->is_gc_active(), "Only call during GC");
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   659
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   660
  check_card_ptr(card_ptr, _ct);
46519
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   661
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   662
  // If the card is no longer dirty, nothing to do. This covers cards that were already
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   663
  // scanned as parts of the remembered sets.
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   664
  if (*card_ptr != G1CardTable::dirty_card_val()) {
46778
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   665
    return false;
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17108
diff changeset
   666
  }
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17108
diff changeset
   667
46676
dff06ff9effe 8183538: UpdateRS phase should claim cards
tschatzl
parents: 46670
diff changeset
   668
  // We claim lazily (so races are possible but they're benign), which reduces the
dff06ff9effe 8183538: UpdateRS phase should claim cards
tschatzl
parents: 46670
diff changeset
   669
  // number of potential duplicate scans (multiple threads may enqueue the same card twice).
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   670
  *card_ptr = G1CardTable::clean_card_val() | G1CardTable::claimed_card_val();
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17108
diff changeset
   671
46520
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   672
  // Construct the region representing the card.
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   673
  HeapWord* card_start = _ct->addr_for(card_ptr);
46520
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   674
  // And find the region containing it.
46676
dff06ff9effe 8183538: UpdateRS phase should claim cards
tschatzl
parents: 46670
diff changeset
   675
  uint const card_region_idx = _g1->addr_to_region(card_start);
46520
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   676
46676
dff06ff9effe 8183538: UpdateRS phase should claim cards
tschatzl
parents: 46670
diff changeset
   677
  _scan_state->add_dirty_region(card_region_idx);
dff06ff9effe 8183538: UpdateRS phase should claim cards
tschatzl
parents: 46670
diff changeset
   678
  HeapWord* scan_limit = _scan_state->scan_top(card_region_idx);
46520
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   679
  if (scan_limit <= card_start) {
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   680
    // If the card starts above the area in the region containing objects to scan, skip it.
46778
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   681
    return false;
17327
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17108
diff changeset
   682
  }
4bd0581aa231 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 17108
diff changeset
   683
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13516
diff changeset
   684
  // Don't use addr_for(card_ptr + 1) which can ask for
42589
037b433e8069 8166811: Missing memory fences between memory allocation and refinement
kbarrett
parents: 42588
diff changeset
   685
  // a card beyond the heap.
49164
7e958a8ebcd3 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy
eosterlund
parents: 48969
diff changeset
   686
  HeapWord* card_end = card_start + G1CardTable::card_size_in_words;
46520
de5cb3eed39b 8177044: Remove _scan_top from HeapRegion
tschatzl
parents: 46519
diff changeset
   687
  MemRegion dirty_region(card_start, MIN2(scan_limit, card_end));
42589
037b433e8069 8166811: Missing memory fences between memory allocation and refinement
kbarrett
parents: 42588
diff changeset
   688
  assert(!dirty_region.is_empty(), "sanity");
3590
a268fa66d7fb 6819077: G1: first GC thread coming late into the GC.
johnc
parents: 3262
diff changeset
   689
46676
dff06ff9effe 8183538: UpdateRS phase should claim cards
tschatzl
parents: 46670
diff changeset
   690
  HeapRegion* const card_region = _g1->region_at(card_region_idx);
dff06ff9effe 8183538: UpdateRS phase should claim cards
tschatzl
parents: 46670
diff changeset
   691
  update_rs_cl->set_region(card_region);
dff06ff9effe 8183538: UpdateRS phase should claim cards
tschatzl
parents: 46670
diff changeset
   692
  bool card_processed = card_region->oops_on_card_seq_iterate_careful<true>(dirty_region, update_rs_cl);
46519
40c9c132f961 8177707: Specialize G1RemSet::refine_card for concurrent/during safepoint refinement
tschatzl
parents: 46518
diff changeset
   693
  assert(card_processed, "must be");
46778
f504c6f2eea5 8183121: Add information about scanned and skipped cards during UpdateRS
tschatzl
parents: 46701
diff changeset
   694
  return true;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   695
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   696
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34246
diff changeset
   697
void G1RemSet::print_periodic_summary_info(const char* header, uint period_count) {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34246
diff changeset
   698
  if ((G1SummarizeRSetStatsPeriod > 0) && log_is_enabled(Trace, gc, remset) &&
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34246
diff changeset
   699
      (period_count % G1SummarizeRSetStatsPeriod == 0)) {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34246
diff changeset
   700
46652
ab8716d193bb 8183226: Remembered set summarization accesses not fully initialized java thread DCQS
tschatzl
parents: 46635
diff changeset
   701
    G1RemSetSummary current(this);
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34246
diff changeset
   702
    _prev_period_summary.subtract_from(&current);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   703
37242
91e5f98fff6f 8152632: Rename LogHandle(...) to Log(...)
stefank
parents: 36374
diff changeset
   704
    Log(gc, remset) log;
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34246
diff changeset
   705
    log.trace("%s", header);
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34246
diff changeset
   706
    ResourceMark rm;
46701
f559541c0daa 8181917: Refactor UL LogStreams to avoid using resource area
stuefe
parents: 46676
diff changeset
   707
    LogStream ls(log.trace());
f559541c0daa 8181917: Refactor UL LogStreams to avoid using resource area
stuefe
parents: 46676
diff changeset
   708
    _prev_period_summary.print_on(&ls);
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34246
diff changeset
   709
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34246
diff changeset
   710
    _prev_period_summary.set(&current);
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34246
diff changeset
   711
  }
17854
d65bc1546091 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 17327
diff changeset
   712
}
2881
74a1337e4acc 6484957: G1: parallel concurrent refinement
iveresov
parents: 2741
diff changeset
   713
6958
cfa71cf3564d 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 6759
diff changeset
   714
void G1RemSet::print_summary_info() {
37242
91e5f98fff6f 8152632: Rename LogHandle(...) to Log(...)
stefank
parents: 36374
diff changeset
   715
  Log(gc, remset, exit) log;
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34246
diff changeset
   716
  if (log.is_trace()) {
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34246
diff changeset
   717
    log.trace(" Cumulative RS summary");
46653
d72083d17b19 8183128: Update RefineCardTableEntryClosure
tschatzl
parents: 46652
diff changeset
   718
    G1RemSetSummary current(this);
35061
be6025ebffea 8145092: Use Unified Logging for the GC logging
brutisso
parents: 34246
diff changeset
   719
    ResourceMark rm;
46701
f559541c0daa 8181917: Refactor UL LogStreams to avoid using resource area
stuefe
parents: 46676
diff changeset
   720
    LogStream ls(log.trace());
f559541c0daa 8181917: Refactor UL LogStreams to avoid using resource area
stuefe
parents: 46676
diff changeset
   721
    current.print_on(&ls);
17854
d65bc1546091 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 17327
diff changeset
   722
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   723
}
6247
00e5cc407d03 6814437: G1: remove the _new_refs array
johnc
parents: 6068
diff changeset
   724
49607
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   725
class G1RebuildRemSetTask: public AbstractGangTask {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   726
  // Aggregate the counting data that was constructed concurrently
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   727
  // with marking.
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   728
  class G1RebuildRemSetHeapRegionClosure : public HeapRegionClosure {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   729
    G1ConcurrentMark* _cm;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   730
    G1RebuildRemSetClosure _update_cl;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   731
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   732
    void scan_for_references(oop const obj, MemRegion mr) {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   733
      obj->oop_iterate(&_update_cl, mr);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   734
    }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   735
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   736
    void scan_for_references(oop const obj) {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   737
      obj->oop_iterate(&_update_cl);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   738
    }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   739
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   740
    // A humongous object is live (with respect to the scanning) either
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   741
    // a) it is marked on the bitmap as such
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   742
    // b) its TARS is larger than nTAMS, i.e. has been allocated during marking.
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   743
    bool is_humongous_live(oop const humongous_obj, HeapWord* ntams, HeapWord* tars) const {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   744
      return _cm->next_mark_bitmap()->is_marked(humongous_obj) || (tars > ntams);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   745
    }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   746
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   747
    // Rebuilds the remembered sets by scanning the objects that were allocated before
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   748
    // rebuild start in the given region, applying the given closure to each of these objects.
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   749
    // Uses the bitmap to get live objects in the area from [bottom, nTAMS), and all
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   750
    // objects from [nTAMS, TARS).
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   751
    // Returns the number of bytes marked in that region between bottom and nTAMS.
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   752
    size_t rebuild_rem_set_in_region(G1CMBitMap* const mark_bitmap, HeapRegion* hr, HeapWord* const top_at_rebuild_start) {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   753
      size_t marked_bytes = 0;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   754
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   755
      HeapWord* start = hr->bottom();
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   756
      HeapWord* const ntams = hr->next_top_at_mark_start();
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   757
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   758
      if (top_at_rebuild_start <= start) {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   759
        return 0;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   760
      }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   761
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   762
      if (hr->is_humongous()) {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   763
        oop const humongous_obj = oop(hr->humongous_start_region()->bottom());
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   764
        log_debug(gc,remset)("Humongous obj region %u marked %d start " PTR_FORMAT " region start " PTR_FORMAT " TAMS " PTR_FORMAT " TARS " PTR_FORMAT,
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   765
                             hr->hrm_index(), _cm->next_mark_bitmap()->is_marked(humongous_obj),
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   766
                             p2i(humongous_obj), p2i(hr->bottom()), p2i(hr->next_top_at_mark_start()), p2i(top_at_rebuild_start));
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   767
        if (is_humongous_live(humongous_obj, ntams, top_at_rebuild_start)) {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   768
          // We need to scan both [bottom, nTAMS) and [nTAMS, top_at_rebuild_start);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   769
          // however in case of humongous objects it is sufficient to scan the encompassing
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   770
          // area (top_at_rebuild_start is always larger or equal to nTAMS) as one of the
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   771
          // two areas will be zero sized. I.e. nTAMS is either
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   772
          // the same as bottom or top(_at_rebuild_start). There is no way ntams has a different
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   773
          // value: this would mean that nTAMS points somewhere into the object.
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   774
          assert(hr->top() == hr->next_top_at_mark_start() || hr->top() == top_at_rebuild_start,
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   775
                 "More than one object in the humongous region?");
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   776
          scan_for_references(humongous_obj, MemRegion(start, top_at_rebuild_start));
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   777
          return ntams != start ? pointer_delta(hr->next_top_at_mark_start(), start, 1) : 0;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   778
        } else {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   779
          return 0;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   780
        }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   781
      }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   782
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   783
      assert(start <= hr->end() && start <= ntams &&
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   784
             ntams <= top_at_rebuild_start && top_at_rebuild_start <= hr->end(),
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   785
             "Inconsistency between bottom, nTAMS, TARS, end - "
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   786
             "start: " PTR_FORMAT ", nTAMS: " PTR_FORMAT ", TARS: " PTR_FORMAT ", end: " PTR_FORMAT,
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   787
             p2i(start), p2i(ntams), p2i(top_at_rebuild_start), p2i(hr->end()));
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   788
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   789
      // Iterate live objects between bottom and nTAMS.
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   790
      start = mark_bitmap->get_next_marked_addr(start, ntams);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   791
      while (start < ntams) {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   792
        oop obj = oop(start);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   793
        assert(oopDesc::is_oop(obj), "Address " PTR_FORMAT " below nTAMS is not an oop", p2i(start));
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   794
        size_t obj_size = obj->size();
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   795
        HeapWord* obj_end = start + obj_size;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   796
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   797
        assert(obj_end <= hr->end(), "Humongous objects must have been handled elsewhere.");
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   798
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   799
        scan_for_references(obj);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   800
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   801
        // Add the size of this object to the number of marked bytes.
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   802
        marked_bytes += obj_size;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   803
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   804
        // Find the next marked object after this one.
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   805
        start = mark_bitmap->get_next_marked_addr(obj_end, ntams);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   806
      }
37414
2672ba9af0dc 8151386: Extract card live data out of G1ConcurrentMark
tschatzl
parents: 37248
diff changeset
   807
49607
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   808
      // Finally process live objects (all of them) between nTAMS and top_at_rebuild_start.
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   809
      // Objects between top_at_rebuild_start and top are implicitly managed by concurrent refinement.
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   810
      while (start < top_at_rebuild_start) {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   811
        oop obj = oop(start);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   812
        assert(oopDesc::is_oop(obj),
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   813
               "Address " PTR_FORMAT " above nTAMS is not an oop (TARS " PTR_FORMAT " region %u)",
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   814
               p2i(start), p2i(top_at_rebuild_start), hr->hrm_index());
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   815
        size_t obj_size = obj->size();
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   816
        HeapWord* obj_end = start + obj_size;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   817
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   818
        assert(obj_end <= hr->end(), "Humongous objects must have been handled elsewhere.");
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   819
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   820
        scan_for_references(obj);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   821
        start = obj_end;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   822
      }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   823
      return marked_bytes * HeapWordSize;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   824
    }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   825
  public:
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   826
    G1RebuildRemSetHeapRegionClosure(G1CollectedHeap* g1h,
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   827
                                     G1ConcurrentMark* cm,
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   828
                                     uint worker_id) :
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   829
      HeapRegionClosure(),
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   830
      _cm(cm),
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   831
      _update_cl(g1h, worker_id) { }
37414
2672ba9af0dc 8151386: Extract card live data out of G1ConcurrentMark
tschatzl
parents: 37248
diff changeset
   832
49607
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   833
    bool do_heap_region(HeapRegion* hr) {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   834
      if (_cm->has_aborted()) {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   835
        return true;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   836
      }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   837
      uint const region_idx = hr->hrm_index();
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   838
      HeapWord* const top_at_rebuild_start = _cm->top_at_rebuild_start(region_idx);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   839
      // TODO: smaller increments to do yield checks with
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   840
      size_t marked_bytes = rebuild_rem_set_in_region(_cm->next_mark_bitmap(), hr, top_at_rebuild_start);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   841
      log_trace(gc, remset, tracking)("Rebuilt region %u " SIZE_FORMAT " marked bytes " SIZE_FORMAT " "
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   842
                                      "bot " PTR_FORMAT " nTAMS " PTR_FORMAT " TARS " PTR_FORMAT,
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   843
                                      region_idx,
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   844
                                      _cm->liveness(region_idx) * HeapWordSize,
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   845
                                      marked_bytes,
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   846
                                      p2i(hr->bottom()),
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   847
                                      p2i(hr->next_top_at_mark_start()),
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   848
                                      p2i(top_at_rebuild_start));
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   849
      if (marked_bytes > 0) {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   850
        hr->add_to_marked_bytes(marked_bytes);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   851
        assert(!hr->is_old() || marked_bytes == (_cm->liveness(hr->hrm_index()) * HeapWordSize),
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   852
               "Marked bytes " SIZE_FORMAT " for region %u do not match liveness during mark " SIZE_FORMAT,
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   853
               marked_bytes, hr->hrm_index(), _cm->liveness(hr->hrm_index()) * HeapWordSize);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   854
      }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   855
      _cm->do_yield_check();
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   856
      // Abort state may have changed after the yield check.
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   857
      return _cm->has_aborted();
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   858
    }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   859
  };
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   860
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   861
  HeapRegionClaimer _hr_claimer;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   862
  G1ConcurrentMark* _cm;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   863
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   864
  uint _worker_id_offset;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   865
public:
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   866
  G1RebuildRemSetTask(G1ConcurrentMark* cm,
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   867
                      uint n_workers,
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   868
                      uint worker_id_offset) :
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   869
      AbstractGangTask("G1 Rebuild Remembered Set"),
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   870
      _cm(cm),
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   871
      _hr_claimer(n_workers),
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   872
      _worker_id_offset(worker_id_offset) {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   873
  }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   874
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   875
  void work(uint worker_id) {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   876
    SuspendibleThreadSetJoiner sts_join;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   877
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   878
    G1CollectedHeap* g1h = G1CollectedHeap::heap();
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   879
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   880
    G1RebuildRemSetHeapRegionClosure cl(g1h, _cm, _worker_id_offset + worker_id);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   881
    g1h->heap_region_par_iterate_from_worker_offset(&cl, &_hr_claimer, worker_id);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   882
  }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   883
};
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   884
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   885
void G1RemSet::rebuild_rem_set(G1ConcurrentMark* cm,
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   886
                               WorkGang* workers,
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   887
                               uint worker_id_offset) {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   888
  uint num_workers = workers->active_workers();
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   889
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   890
  G1RebuildRemSetTask cl(cm,
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   891
                         num_workers,
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   892
                         worker_id_offset);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49347
diff changeset
   893
  workers->run_task(&cl, num_workers);
37414
2672ba9af0dc 8151386: Extract card live data out of G1ConcurrentMark
tschatzl
parents: 37248
diff changeset
   894
}