src/hotspot/share/gc/g1/heapRegionRemSet.hpp
author tschatzl
Mon, 26 Mar 2018 16:51:43 +0200
changeset 49608 1852b17b0efc
parent 49607 acffe6ff3ae7
child 49672 f1d2b6c0693b
permissions -rw-r--r--
8196485: FromCardCache default card index can cause crashes Summary: The default value of -1 for 32 bit card indices is a regular card value at the border of 2TB heap addresses in the from card cache, so G1 may loose remembered set entries. Extend from card cache entries to 64 bits. Reviewed-by: shade, sjohanss Contributed-by: Thomas Schatzl <thomas.schatzl@oracle.com>, Jarkko Miettinen <jarkko.miettinen@relex.fi>
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
/*
49392
2956d0ece7a9 8199282: Remove ValueObj class for allocation subclassing for gc code
coleenp
parents: 47216
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: 5346
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5346
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: 5346
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
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 28379
diff changeset
    25
#ifndef SHARE_VM_GC_G1_HEAPREGIONREMSET_HPP
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 28379
diff changeset
    26
#define SHARE_VM_GC_G1_HEAPREGIONREMSET_HPP
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 28379
diff changeset
    28
#include "gc/g1/g1CodeCacheRemSet.hpp"
35199
a12e8d5aa2f7 8145667: Move FromCardCache into separate files
tschatzl
parents: 35061
diff changeset
    29
#include "gc/g1/g1FromCardCache.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 28379
diff changeset
    30
#include "gc/g1/sparsePRT.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    31
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    32
// Remembered set for a heap region.  Represent a set of "cards" that
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    33
// contain pointers into the owner heap region.  Cards are defined somewhat
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    34
// abstractly, in terms of what the "BlockOffsetTable" in use can parse.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    35
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    36
class G1CollectedHeap;
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
    37
class G1BlockOffsetTable;
37414
2672ba9af0dc 8151386: Extract card live data out of G1ConcurrentMark
tschatzl
parents: 35461
diff changeset
    38
class G1CardLiveData;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    39
class HeapRegion;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    40
class HeapRegionRemSetIterator;
13113
ab3870a79b18 6921087: G1: remove per-GC-thread expansion tables from the fine-grain remembered sets
johnc
parents: 12381
diff changeset
    41
class PerRegionTable;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    42
class SparsePRT;
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
    43
class nmethod;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    44
8072
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7397
diff changeset
    45
// Essentially a wrapper around SparsePRTCleanupTask. See
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7397
diff changeset
    46
// sparsePRT.hpp for more details.
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7397
diff changeset
    47
class HRRSCleanupTask : public SparsePRTCleanupTask {
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7397
diff changeset
    48
};
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    49
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    50
// The "_coarse_map" is a bitmap with one bit for each region, where set
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    51
// bits indicate that the corresponding region may contain some pointer
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    52
// into the owning region.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    53
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    54
// The "_fine_grain_entries" array is an open hash table of PerRegionTables
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    55
// (PRTs), indicating regions for which we're keeping the RS as a set of
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    56
// cards.  The strategy is to cap the size of the fine-grain table,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    57
// deleting an entry and setting the corresponding coarse-grained bit when
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    58
// we would overflow this cap.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    59
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    60
// We use a mixture of locking and lock-free techniques here.  We allow
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    61
// threads to locate PRTs without locking, but threads attempting to alter
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    62
// a bucket list obtain a lock.  This means that any failing attempt to
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    63
// find a PRT must be retried with the lock.  It might seem dangerous that
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    64
// a read can find a PRT that is concurrently deleted.  This is all right,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    65
// because:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    66
//
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    67
//   1) We only actually free PRT's at safe points (though we reuse them at
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    68
//      other times).
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    69
//   2) We find PRT's in an attempt to add entries.  If a PRT is deleted,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    70
//      it's _coarse_map bit is set, so the that we were attempting to add
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    71
//      is represented.  If a deleted PRT is re-used, a thread adding a bit,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    72
//      thinking the PRT is for a different region, does no harm.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    73
49392
2956d0ece7a9 8199282: Remove ValueObj class for allocation subclassing for gc code
coleenp
parents: 47216
diff changeset
    74
class OtherRegionsTable {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    75
  friend class HeapRegionRemSetIterator;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    76
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    77
  G1CollectedHeap* _g1h;
23451
ed2b8bb28fed 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 22234
diff changeset
    78
  Mutex*           _m;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    79
  HeapRegion*      _hr;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    80
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    81
  // These are protected by "_m".
38177
b0c9cb06506b 8141501: Problems with BitMap buffer management
stefank
parents: 38161
diff changeset
    82
  CHeapBitMap _coarse_map;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    83
  size_t      _n_coarse_entries;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    84
  static jint _n_coarsenings;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    85
13113
ab3870a79b18 6921087: G1: remove per-GC-thread expansion tables from the fine-grain remembered sets
johnc
parents: 12381
diff changeset
    86
  PerRegionTable** _fine_grain_regions;
ab3870a79b18 6921087: G1: remove per-GC-thread expansion tables from the fine-grain remembered sets
johnc
parents: 12381
diff changeset
    87
  size_t           _n_fine_entries;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    88
13335
f2e823305677 7182260: G1: Fine grain RSet freeing bottleneck
johnc
parents: 13196
diff changeset
    89
  // The fine grain remembered sets are doubly linked together using
f2e823305677 7182260: G1: Fine grain RSet freeing bottleneck
johnc
parents: 13196
diff changeset
    90
  // their 'next' and 'prev' fields.
f2e823305677 7182260: G1: Fine grain RSet freeing bottleneck
johnc
parents: 13196
diff changeset
    91
  // This allows fast bulk freeing of all the fine grain remembered
f2e823305677 7182260: G1: Fine grain RSet freeing bottleneck
johnc
parents: 13196
diff changeset
    92
  // set entries, and fast finding of all of them without iterating
f2e823305677 7182260: G1: Fine grain RSet freeing bottleneck
johnc
parents: 13196
diff changeset
    93
  // over the _fine_grain_regions table.
f2e823305677 7182260: G1: Fine grain RSet freeing bottleneck
johnc
parents: 13196
diff changeset
    94
  PerRegionTable * _first_all_fine_prts;
f2e823305677 7182260: G1: Fine grain RSet freeing bottleneck
johnc
parents: 13196
diff changeset
    95
  PerRegionTable * _last_all_fine_prts;
f2e823305677 7182260: G1: Fine grain RSet freeing bottleneck
johnc
parents: 13196
diff changeset
    96
13113
ab3870a79b18 6921087: G1: remove per-GC-thread expansion tables from the fine-grain remembered sets
johnc
parents: 12381
diff changeset
    97
  // Used to sample a subset of the fine grain PRTs to determine which
ab3870a79b18 6921087: G1: remove per-GC-thread expansion tables from the fine-grain remembered sets
johnc
parents: 12381
diff changeset
    98
  // PRT to evict and coarsen.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
    99
  size_t        _fine_eviction_start;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   100
  static size_t _fine_eviction_stride;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   101
  static size_t _fine_eviction_sample_size;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   102
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   103
  SparsePRT   _sparse_table;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   104
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   105
  // These are static after init.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   106
  static size_t _max_fine_entries;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   107
  static size_t _mod_max_fine_entries_mask;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   108
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   109
  // Requires "prt" to be the first element of the bucket list appropriate
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   110
  // for "hr".  If this list contains an entry for "hr", return it,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   111
  // otherwise return "NULL".
13113
ab3870a79b18 6921087: G1: remove per-GC-thread expansion tables from the fine-grain remembered sets
johnc
parents: 12381
diff changeset
   112
  PerRegionTable* find_region_table(size_t ind, HeapRegion* hr) const;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   113
13113
ab3870a79b18 6921087: G1: remove per-GC-thread expansion tables from the fine-grain remembered sets
johnc
parents: 12381
diff changeset
   114
  // Find, delete, and return a candidate PerRegionTable, if any exists,
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   115
  // adding the deleted region to the coarse bitmap.  Requires the caller
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   116
  // to hold _m, and the fine-grain table to be full.
13113
ab3870a79b18 6921087: G1: remove per-GC-thread expansion tables from the fine-grain remembered sets
johnc
parents: 12381
diff changeset
   117
  PerRegionTable* delete_region_table();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   118
13335
f2e823305677 7182260: G1: Fine grain RSet freeing bottleneck
johnc
parents: 13196
diff changeset
   119
  // link/add the given fine grain remembered set into the "all" list
f2e823305677 7182260: G1: Fine grain RSet freeing bottleneck
johnc
parents: 13196
diff changeset
   120
  void link_to_all(PerRegionTable * prt);
f2e823305677 7182260: G1: Fine grain RSet freeing bottleneck
johnc
parents: 13196
diff changeset
   121
  // unlink/remove the given fine grain remembered set into the "all" list
f2e823305677 7182260: G1: Fine grain RSet freeing bottleneck
johnc
parents: 13196
diff changeset
   122
  void unlink_from_all(PerRegionTable * prt);
f2e823305677 7182260: G1: Fine grain RSet freeing bottleneck
johnc
parents: 13196
diff changeset
   123
28030
c36c6703366d 8066102: Clean up HeapRegionRemSet files
tschatzl
parents: 26850
diff changeset
   124
  bool contains_reference_locked(OopOrNarrowOopStar from) const;
c36c6703366d 8066102: Clean up HeapRegionRemSet files
tschatzl
parents: 26850
diff changeset
   125
49607
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   126
public:
28030
c36c6703366d 8066102: Clean up HeapRegionRemSet files
tschatzl
parents: 26850
diff changeset
   127
  // Clear the from_card_cache entries for this region.
c36c6703366d 8066102: Clean up HeapRegionRemSet files
tschatzl
parents: 26850
diff changeset
   128
  void clear_fcc();
c36c6703366d 8066102: Clean up HeapRegionRemSet files
tschatzl
parents: 26850
diff changeset
   129
  // Create a new remembered set for the given heap region. The given mutex should
c36c6703366d 8066102: Clean up HeapRegionRemSet files
tschatzl
parents: 26850
diff changeset
   130
  // be used to ensure consistency.
23451
ed2b8bb28fed 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 22234
diff changeset
   131
  OtherRegionsTable(HeapRegion* hr, Mutex* m);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   132
49608
1852b17b0efc 8196485: FromCardCache default card index can cause crashes
tschatzl
parents: 49607
diff changeset
   133
  // Returns the card index of the given within_region pointer relative to the bottom
1852b17b0efc 8196485: FromCardCache default card index can cause crashes
tschatzl
parents: 49607
diff changeset
   134
  // of the given heap region.
1852b17b0efc 8196485: FromCardCache default card index can cause crashes
tschatzl
parents: 49607
diff changeset
   135
  static CardIdx_t card_within_region(OopOrNarrowOopStar within_region, HeapRegion* hr);
49607
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   136
  // Adds the reference from "from to this remembered set.
26850
515ff48cf5f0 8036116: Fix thread-id types in G1 remembered set implementations
brutisso
parents: 26422
diff changeset
   137
  void add_reference(OopOrNarrowOopStar from, uint tid);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   138
28030
c36c6703366d 8066102: Clean up HeapRegionRemSet files
tschatzl
parents: 26850
diff changeset
   139
  // Returns whether the remembered set contains the given reference.
c36c6703366d 8066102: Clean up HeapRegionRemSet files
tschatzl
parents: 26850
diff changeset
   140
  bool contains_reference(OopOrNarrowOopStar from) const;
c36c6703366d 8066102: Clean up HeapRegionRemSet files
tschatzl
parents: 26850
diff changeset
   141
28379
e6784fc8fff2 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 28030
diff changeset
   142
  // Returns whether this remembered set (and all sub-sets) have an occupancy
e6784fc8fff2 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 28030
diff changeset
   143
  // that is less or equal than the given occupancy.
e6784fc8fff2 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 28030
diff changeset
   144
  bool occupancy_less_or_equal_than(size_t limit) const;
e6784fc8fff2 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 28030
diff changeset
   145
28030
c36c6703366d 8066102: Clean up HeapRegionRemSet files
tschatzl
parents: 26850
diff changeset
   146
  // Returns whether this remembered set (and all sub-sets) does not contain any entry.
25889
221296ac4359 8027959: Early reclamation of large objects in G1
tschatzl
parents: 24108
diff changeset
   147
  bool is_empty() const;
221296ac4359 8027959: Early reclamation of large objects in G1
tschatzl
parents: 24108
diff changeset
   148
28030
c36c6703366d 8066102: Clean up HeapRegionRemSet files
tschatzl
parents: 26850
diff changeset
   149
  // Returns the number of cards contained in this remembered set.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   150
  size_t occupied() const;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   151
  size_t occ_fine() const;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   152
  size_t occ_coarse() const;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   153
  size_t occ_sparse() const;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   154
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   155
  static jint n_coarsenings() { return _n_coarsenings; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   156
28030
c36c6703366d 8066102: Clean up HeapRegionRemSet files
tschatzl
parents: 26850
diff changeset
   157
  // Returns size of the actual remembered set containers in bytes.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   158
  size_t mem_size() const;
28030
c36c6703366d 8066102: Clean up HeapRegionRemSet files
tschatzl
parents: 26850
diff changeset
   159
  // Returns the size of static data in bytes.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   160
  static size_t static_mem_size();
28030
c36c6703366d 8066102: Clean up HeapRegionRemSet files
tschatzl
parents: 26850
diff changeset
   161
  // Returns the size of the free list content in bytes.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   162
  static size_t fl_mem_size();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   163
28030
c36c6703366d 8066102: Clean up HeapRegionRemSet files
tschatzl
parents: 26850
diff changeset
   164
  // Clear the entire contents of this remembered set.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   165
  void clear();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   166
8072
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7397
diff changeset
   167
  void do_cleanup_work(HRRSCleanupTask* hrrs_cleanup_task);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   168
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   169
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12381
diff changeset
   170
class HeapRegionRemSet : public CHeapObj<mtGC> {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   171
  friend class VMStructs;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   172
  friend class HeapRegionRemSetIterator;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   173
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   174
private:
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   175
  G1BlockOffsetTable* _bot;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   176
23451
ed2b8bb28fed 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 22234
diff changeset
   177
  // A set of code blobs (nmethods) whose code contains pointers into
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   178
  // the region that owns this RSet.
23451
ed2b8bb28fed 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 22234
diff changeset
   179
  G1CodeRootSet _code_roots;
ed2b8bb28fed 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 22234
diff changeset
   180
ed2b8bb28fed 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 22234
diff changeset
   181
  Mutex _m;
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   182
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   183
  OtherRegionsTable _other_regions;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   184
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   185
public:
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   186
  HeapRegionRemSet(G1BlockOffsetTable* bot, HeapRegion* hr);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   187
4902
991aaddb5165 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 3262
diff changeset
   188
  static void setup_remset_size();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   189
25889
221296ac4359 8027959: Early reclamation of large objects in G1
tschatzl
parents: 24108
diff changeset
   190
  bool is_empty() const {
221296ac4359 8027959: Early reclamation of large objects in G1
tschatzl
parents: 24108
diff changeset
   191
    return (strong_code_roots_list_length() == 0) && _other_regions.is_empty();
221296ac4359 8027959: Early reclamation of large objects in G1
tschatzl
parents: 24108
diff changeset
   192
  }
221296ac4359 8027959: Early reclamation of large objects in G1
tschatzl
parents: 24108
diff changeset
   193
28379
e6784fc8fff2 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 28030
diff changeset
   194
  bool occupancy_less_or_equal_than(size_t occ) const {
e6784fc8fff2 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 28030
diff changeset
   195
    return (strong_code_roots_list_length() == 0) && _other_regions.occupancy_less_or_equal_than(occ);
e6784fc8fff2 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 28030
diff changeset
   196
  }
e6784fc8fff2 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 28030
diff changeset
   197
23451
ed2b8bb28fed 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 22234
diff changeset
   198
  size_t occupied() {
ed2b8bb28fed 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 22234
diff changeset
   199
    MutexLockerEx x(&_m, Mutex::_no_safepoint_check_flag);
ed2b8bb28fed 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 22234
diff changeset
   200
    return occupied_locked();
ed2b8bb28fed 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 22234
diff changeset
   201
  }
ed2b8bb28fed 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 22234
diff changeset
   202
  size_t occupied_locked() {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   203
    return _other_regions.occupied();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   204
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   205
  size_t occ_fine() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   206
    return _other_regions.occ_fine();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   207
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   208
  size_t occ_coarse() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   209
    return _other_regions.occ_coarse();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   210
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   211
  size_t occ_sparse() const {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   212
    return _other_regions.occ_sparse();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   213
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   214
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   215
  static jint n_coarsenings() { return OtherRegionsTable::n_coarsenings(); }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   216
49607
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   217
private:
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   218
  enum RemSetState {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   219
    Untracked,
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   220
    Updating,
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   221
    Complete
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   222
  };
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   223
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   224
  RemSetState _state;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   225
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   226
  static const char* _state_strings[];
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   227
public:
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   228
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   229
  const char* get_state_str() const { return _state_strings[_state]; }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   230
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   231
  bool is_tracked() { return _state != Untracked; }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   232
  bool is_updating() { return _state == Updating; }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   233
  bool is_complete() { return _state == Complete; }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   234
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   235
  void set_state_empty() {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   236
    guarantee(SafepointSynchronize::is_at_safepoint() || !is_tracked(), "Should only set to Untracked during safepoint but is %s.", get_state_str());
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   237
    if (_state == Untracked) {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   238
      return;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   239
    }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   240
    _other_regions.clear_fcc();
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   241
    _state = Untracked;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   242
  }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   243
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   244
  void set_state_updating() {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   245
    guarantee(SafepointSynchronize::is_at_safepoint() && !is_tracked(), "Should only set to Updating from Untracked during safepoint but is %s", get_state_str());
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   246
    _other_regions.clear_fcc();
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   247
    _state = Updating;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   248
  }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   249
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   250
  void set_state_complete() {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   251
    _other_regions.clear_fcc();
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   252
    _state = Complete;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   253
  }
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   254
13113
ab3870a79b18 6921087: G1: remove per-GC-thread expansion tables from the fine-grain remembered sets
johnc
parents: 12381
diff changeset
   255
  // Used in the sequential case.
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 2881
diff changeset
   256
  void add_reference(OopOrNarrowOopStar from) {
49607
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   257
    add_reference(from, 0);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   258
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   259
13113
ab3870a79b18 6921087: G1: remove per-GC-thread expansion tables from the fine-grain remembered sets
johnc
parents: 12381
diff changeset
   260
  // Used in the parallel case.
26850
515ff48cf5f0 8036116: Fix thread-id types in G1 remembered set implementations
brutisso
parents: 26422
diff changeset
   261
  void add_reference(OopOrNarrowOopStar from, uint tid) {
49607
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   262
    RemSetState state = _state;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   263
    if (state == Untracked) {
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   264
      return;
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   265
    }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   266
    _other_regions.add_reference(from, tid);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   267
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   268
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   269
  // The region is being reclaimed; clear its remset, and any mention of
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   270
  // entries for this region in other remsets.
49607
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   271
  void clear(bool only_cardset = false);
acffe6ff3ae7 8180415: Rebuild remembered sets during the concurrent cycle
tschatzl
parents: 49392
diff changeset
   272
  void clear_locked(bool only_cardset = false);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   273
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   274
  // The actual # of bytes this hr_remset takes up.
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   275
  // Note also includes the strong code root set.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   276
  size_t mem_size() {
23451
ed2b8bb28fed 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 22234
diff changeset
   277
    MutexLockerEx x(&_m, Mutex::_no_safepoint_check_flag);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   278
    return _other_regions.mem_size()
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   279
      // This correction is necessary because the above includes the second
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   280
      // part.
24108
dfc2242fc6b0 8040792: G1: Memory usage calculation uses sizeof(this) instead of sizeof(classname)
tschatzl
parents: 24102
diff changeset
   281
      + (sizeof(HeapRegionRemSet) - sizeof(OtherRegionsTable))
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   282
      + strong_code_roots_mem_size();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   283
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   284
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   285
  // Returns the memory occupancy of all static data structures associated
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   286
  // with remembered sets.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   287
  static size_t static_mem_size() {
26422
4ee5901e205e 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 26160
diff changeset
   288
    return OtherRegionsTable::static_mem_size() + G1CodeRootSet::static_mem_size();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   289
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   290
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   291
  // Returns the memory occupancy of all free_list data structures associated
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   292
  // with remembered sets.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   293
  static size_t fl_mem_size() {
26422
4ee5901e205e 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 26160
diff changeset
   294
    return OtherRegionsTable::fl_mem_size();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   295
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   296
3262
30d1c247fc25 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 2881
diff changeset
   297
  bool contains_reference(OopOrNarrowOopStar from) const {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   298
    return _other_regions.contains_reference(from);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   299
  }
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   300
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   301
  // Routines for managing the list of code roots that point into
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   302
  // the heap region that owns this RSet.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   303
  void add_strong_code_root(nmethod* nm);
26422
4ee5901e205e 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 26160
diff changeset
   304
  void add_strong_code_root_locked(nmethod* nm);
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   305
  void remove_strong_code_root(nmethod* nm);
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   306
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   307
  // Applies blk->do_code_blob() to each of the entries in
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   308
  // the strong code roots list
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   309
  void strong_code_roots_do(CodeBlobClosure* blk) const;
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   310
26422
4ee5901e205e 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 26160
diff changeset
   311
  void clean_strong_code_roots(HeapRegion* hr);
4ee5901e205e 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 26160
diff changeset
   312
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   313
  // Returns the number of elements in the strong code roots list
25889
221296ac4359 8027959: Early reclamation of large objects in G1
tschatzl
parents: 24108
diff changeset
   314
  size_t strong_code_roots_list_length() const {
23451
ed2b8bb28fed 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 22234
diff changeset
   315
    return _code_roots.length();
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   316
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   317
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   318
  // Returns true if the strong code roots contains the given
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   319
  // nmethod.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   320
  bool strong_code_roots_list_contains(nmethod* nm) {
23451
ed2b8bb28fed 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 22234
diff changeset
   321
    return _code_roots.contains(nm);
19339
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   322
  }
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   323
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   324
  // Returns the amount of memory, in bytes, currently
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   325
  // consumed by the strong code roots.
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   326
  size_t strong_code_roots_mem_size();
d247781beec7 7145569: G1: optimize nmethods scanning
johnc
parents: 17631
diff changeset
   327
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   328
  // Called during a stop-world phase to perform any deferred cleanups.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   329
  static void cleanup();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   330
28030
c36c6703366d 8066102: Clean up HeapRegionRemSet files
tschatzl
parents: 26850
diff changeset
   331
  static void invalidate_from_card_cache(uint start_idx, size_t num_regions) {
35200
7802299b31e7 8145671: Rename FromCardCache to G1FromCardCache
tschatzl
parents: 35199
diff changeset
   332
    G1FromCardCache::invalidate(start_idx, num_regions);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   333
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   334
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   335
#ifndef PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   336
  static void print_from_card_cache() {
35200
7802299b31e7 8145671: Rename FromCardCache to G1FromCardCache
tschatzl
parents: 35199
diff changeset
   337
    G1FromCardCache::print();
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   338
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   339
#endif
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   340
8072
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7397
diff changeset
   341
  // These are wrappers for the similarly-named methods on
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7397
diff changeset
   342
  // SparsePRT. Look at sparsePRT.hpp for more details.
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7397
diff changeset
   343
  static void reset_for_cleanup_tasks();
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7397
diff changeset
   344
  void do_cleanup_work(HRRSCleanupTask* hrrs_cleanup_task);
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7397
diff changeset
   345
  static void finish_cleanup_task(HRRSCleanupTask* hrrs_cleanup_task);
f223f43cd62f 7014261: G1: RSet-related failures
tonyp
parents: 7397
diff changeset
   346
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   347
  // Run unit tests.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   348
#ifndef PRODUCT
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   349
  static void test();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   350
#endif
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   351
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   352
17108
cf72dcf9a8f2 8011724: G1: Stack allocate instances of HeapRegionRemSetIterator
johnc
parents: 13335
diff changeset
   353
class HeapRegionRemSetIterator : public StackObj {
24101
bd1a2ee20760 8037344: Use the "next" field to iterate over fine remembered instead of using the hash table
tschatzl
parents: 24099
diff changeset
   354
 private:
bd1a2ee20760 8037344: Use the "next" field to iterate over fine remembered instead of using the hash table
tschatzl
parents: 24099
diff changeset
   355
  // The region RSet over which we are iterating.
23451
ed2b8bb28fed 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 22234
diff changeset
   356
  HeapRegionRemSet* _hrrs;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   357
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   358
  // Local caching of HRRS fields.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   359
  const BitMap*             _coarse_map;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   360
35461
1068dcb8d315 8146399: Refactor the BlockOffsetTable classes.
david
parents: 35210
diff changeset
   361
  G1BlockOffsetTable*       _bot;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   362
  G1CollectedHeap*          _g1h;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   363
24101
bd1a2ee20760 8037344: Use the "next" field to iterate over fine remembered instead of using the hash table
tschatzl
parents: 24099
diff changeset
   364
  // The number of cards yielded since initialization.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   365
  size_t _n_yielded_fine;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   366
  size_t _n_yielded_coarse;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   367
  size_t _n_yielded_sparse;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   368
24101
bd1a2ee20760 8037344: Use the "next" field to iterate over fine remembered instead of using the hash table
tschatzl
parents: 24099
diff changeset
   369
  // Indicates what granularity of table that we are currently iterating over.
17108
cf72dcf9a8f2 8011724: G1: Stack allocate instances of HeapRegionRemSetIterator
johnc
parents: 13335
diff changeset
   370
  // We start iterating over the sparse table, progress to the fine grain
cf72dcf9a8f2 8011724: G1: Stack allocate instances of HeapRegionRemSetIterator
johnc
parents: 13335
diff changeset
   371
  // table, and then finish with the coarse table.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   372
  enum IterState {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   373
    Sparse,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   374
    Fine,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   375
    Coarse
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   376
  };
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   377
  IterState _is;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   378
24101
bd1a2ee20760 8037344: Use the "next" field to iterate over fine remembered instead of using the hash table
tschatzl
parents: 24099
diff changeset
   379
  // For both Coarse and Fine remembered set iteration this contains the
bd1a2ee20760 8037344: Use the "next" field to iterate over fine remembered instead of using the hash table
tschatzl
parents: 24099
diff changeset
   380
  // first card number of the heap region we currently iterate over.
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   381
  size_t _cur_region_card_offset;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   382
24101
bd1a2ee20760 8037344: Use the "next" field to iterate over fine remembered instead of using the hash table
tschatzl
parents: 24099
diff changeset
   383
  // Current region index for the Coarse remembered set iteration.
10677
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10000
diff changeset
   384
  int    _coarse_cur_region_index;
370a8da2d63f 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 10000
diff changeset
   385
  size_t _coarse_cur_region_cur_card;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   386
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   387
  bool coarse_has_next(size_t& card_index);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   388
24101
bd1a2ee20760 8037344: Use the "next" field to iterate over fine remembered instead of using the hash table
tschatzl
parents: 24099
diff changeset
   389
  // The PRT we are currently iterating over.
bd1a2ee20760 8037344: Use the "next" field to iterate over fine remembered instead of using the hash table
tschatzl
parents: 24099
diff changeset
   390
  PerRegionTable* _fine_cur_prt;
bd1a2ee20760 8037344: Use the "next" field to iterate over fine remembered instead of using the hash table
tschatzl
parents: 24099
diff changeset
   391
  // Card offset within the current PRT.
bd1a2ee20760 8037344: Use the "next" field to iterate over fine remembered instead of using the hash table
tschatzl
parents: 24099
diff changeset
   392
  size_t _cur_card_in_prt;
13113
ab3870a79b18 6921087: G1: remove per-GC-thread expansion tables from the fine-grain remembered sets
johnc
parents: 12381
diff changeset
   393
24101
bd1a2ee20760 8037344: Use the "next" field to iterate over fine remembered instead of using the hash table
tschatzl
parents: 24099
diff changeset
   394
  // Update internal variables when switching to the given PRT.
bd1a2ee20760 8037344: Use the "next" field to iterate over fine remembered instead of using the hash table
tschatzl
parents: 24099
diff changeset
   395
  void switch_to_prt(PerRegionTable* prt);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   396
  bool fine_has_next();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   397
  bool fine_has_next(size_t& card_index);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   398
24101
bd1a2ee20760 8037344: Use the "next" field to iterate over fine remembered instead of using the hash table
tschatzl
parents: 24099
diff changeset
   399
  // The Sparse remembered set iterator.
bd1a2ee20760 8037344: Use the "next" field to iterate over fine remembered instead of using the hash table
tschatzl
parents: 24099
diff changeset
   400
  SparsePRTIter _sparse_iter;
bd1a2ee20760 8037344: Use the "next" field to iterate over fine remembered instead of using the hash table
tschatzl
parents: 24099
diff changeset
   401
bd1a2ee20760 8037344: Use the "next" field to iterate over fine remembered instead of using the hash table
tschatzl
parents: 24099
diff changeset
   402
 public:
23451
ed2b8bb28fed 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 22234
diff changeset
   403
  HeapRegionRemSetIterator(HeapRegionRemSet* hrrs);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   404
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   405
  // If there remains one or more cards to be yielded, returns true and
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   406
  // sets "card_index" to one of those cards (which is then considered
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   407
  // yielded.)   Otherwise, returns false (and leaves "card_index"
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   408
  // undefined.)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   409
  bool has_next(size_t& card_index);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   410
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   411
  size_t n_yielded_fine() { return _n_yielded_fine; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   412
  size_t n_yielded_coarse() { return _n_yielded_coarse; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   413
  size_t n_yielded_sparse() { return _n_yielded_sparse; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   414
  size_t n_yielded() {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   415
    return n_yielded_fine() + n_yielded_coarse() + n_yielded_sparse();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   416
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   417
};
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
   418
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 28379
diff changeset
   419
#endif // SHARE_VM_GC_G1_HEAPREGIONREMSET_HPP