2008-06-05 15:57:56 -07:00
|
|
|
/*
|
2012-06-25 16:00:55 -07:00
|
|
|
* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
|
2008-06-05 15:57:56 -07:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
|
|
*
|
|
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
|
|
* published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
|
|
* accompanied this code).
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License version
|
|
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
*
|
2010-05-27 19:08:38 -07:00
|
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
|
|
* questions.
|
2008-06-05 15:57:56 -07:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2010-11-23 13:22:55 -08:00
|
|
|
#ifndef SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONREMSET_HPP
|
|
|
|
#define SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONREMSET_HPP
|
|
|
|
|
|
|
|
#include "gc_implementation/g1/sparsePRT.hpp"
|
|
|
|
|
2008-06-05 15:57:56 -07:00
|
|
|
// Remembered set for a heap region. Represent a set of "cards" that
|
|
|
|
// contain pointers into the owner heap region. Cards are defined somewhat
|
|
|
|
// abstractly, in terms of what the "BlockOffsetTable" in use can parse.
|
|
|
|
|
|
|
|
class G1CollectedHeap;
|
|
|
|
class G1BlockOffsetSharedArray;
|
|
|
|
class HeapRegion;
|
|
|
|
class HeapRegionRemSetIterator;
|
2012-06-25 16:00:55 -07:00
|
|
|
class PerRegionTable;
|
2008-06-05 15:57:56 -07:00
|
|
|
class SparsePRT;
|
|
|
|
|
2011-01-25 17:58:19 -05:00
|
|
|
// Essentially a wrapper around SparsePRTCleanupTask. See
|
|
|
|
// sparsePRT.hpp for more details.
|
|
|
|
class HRRSCleanupTask : public SparsePRTCleanupTask {
|
|
|
|
};
|
2008-06-05 15:57:56 -07:00
|
|
|
|
|
|
|
// The "_coarse_map" is a bitmap with one bit for each region, where set
|
|
|
|
// bits indicate that the corresponding region may contain some pointer
|
|
|
|
// into the owning region.
|
|
|
|
|
|
|
|
// The "_fine_grain_entries" array is an open hash table of PerRegionTables
|
|
|
|
// (PRTs), indicating regions for which we're keeping the RS as a set of
|
|
|
|
// cards. The strategy is to cap the size of the fine-grain table,
|
|
|
|
// deleting an entry and setting the corresponding coarse-grained bit when
|
|
|
|
// we would overflow this cap.
|
|
|
|
|
|
|
|
// We use a mixture of locking and lock-free techniques here. We allow
|
|
|
|
// threads to locate PRTs without locking, but threads attempting to alter
|
|
|
|
// a bucket list obtain a lock. This means that any failing attempt to
|
|
|
|
// find a PRT must be retried with the lock. It might seem dangerous that
|
|
|
|
// a read can find a PRT that is concurrently deleted. This is all right,
|
|
|
|
// because:
|
|
|
|
//
|
|
|
|
// 1) We only actually free PRT's at safe points (though we reuse them at
|
|
|
|
// other times).
|
|
|
|
// 2) We find PRT's in an attempt to add entries. If a PRT is deleted,
|
|
|
|
// it's _coarse_map bit is set, so the that we were attempting to add
|
|
|
|
// is represented. If a deleted PRT is re-used, a thread adding a bit,
|
|
|
|
// thinking the PRT is for a different region, does no harm.
|
|
|
|
|
2009-02-10 18:39:09 +03:00
|
|
|
class OtherRegionsTable VALUE_OBJ_CLASS_SPEC {
|
2008-06-05 15:57:56 -07:00
|
|
|
friend class HeapRegionRemSetIterator;
|
|
|
|
|
|
|
|
G1CollectedHeap* _g1h;
|
|
|
|
Mutex _m;
|
|
|
|
HeapRegion* _hr;
|
|
|
|
|
|
|
|
// These are protected by "_m".
|
|
|
|
BitMap _coarse_map;
|
|
|
|
size_t _n_coarse_entries;
|
|
|
|
static jint _n_coarsenings;
|
|
|
|
|
2012-06-25 16:00:55 -07:00
|
|
|
PerRegionTable** _fine_grain_regions;
|
|
|
|
size_t _n_fine_entries;
|
2008-06-05 15:57:56 -07:00
|
|
|
|
2012-07-17 12:24:05 -07:00
|
|
|
// The fine grain remembered sets are doubly linked together using
|
|
|
|
// their 'next' and 'prev' fields.
|
|
|
|
// This allows fast bulk freeing of all the fine grain remembered
|
|
|
|
// set entries, and fast finding of all of them without iterating
|
|
|
|
// over the _fine_grain_regions table.
|
|
|
|
PerRegionTable * _first_all_fine_prts;
|
|
|
|
PerRegionTable * _last_all_fine_prts;
|
|
|
|
|
2012-06-25 16:00:55 -07:00
|
|
|
// Used to sample a subset of the fine grain PRTs to determine which
|
|
|
|
// PRT to evict and coarsen.
|
2008-06-05 15:57:56 -07:00
|
|
|
size_t _fine_eviction_start;
|
|
|
|
static size_t _fine_eviction_stride;
|
|
|
|
static size_t _fine_eviction_sample_size;
|
|
|
|
|
|
|
|
SparsePRT _sparse_table;
|
|
|
|
|
|
|
|
// These are static after init.
|
|
|
|
static size_t _max_fine_entries;
|
|
|
|
static size_t _mod_max_fine_entries_mask;
|
|
|
|
|
|
|
|
// Requires "prt" to be the first element of the bucket list appropriate
|
|
|
|
// for "hr". If this list contains an entry for "hr", return it,
|
|
|
|
// otherwise return "NULL".
|
2012-06-25 16:00:55 -07:00
|
|
|
PerRegionTable* find_region_table(size_t ind, HeapRegion* hr) const;
|
2008-06-05 15:57:56 -07:00
|
|
|
|
2012-06-25 16:00:55 -07:00
|
|
|
// Find, delete, and return a candidate PerRegionTable, if any exists,
|
2008-06-05 15:57:56 -07:00
|
|
|
// adding the deleted region to the coarse bitmap. Requires the caller
|
|
|
|
// to hold _m, and the fine-grain table to be full.
|
2012-06-25 16:00:55 -07:00
|
|
|
PerRegionTable* delete_region_table();
|
2008-06-05 15:57:56 -07:00
|
|
|
|
|
|
|
// If a PRT for "hr" is in the bucket list indicated by "ind" (which must
|
|
|
|
// be the correct index for "hr"), delete it and return true; else return
|
|
|
|
// false.
|
|
|
|
bool del_single_region_table(size_t ind, HeapRegion* hr);
|
|
|
|
|
|
|
|
// Indexed by thread X heap region, to minimize thread contention.
|
|
|
|
static int** _from_card_cache;
|
|
|
|
static size_t _from_card_cache_max_regions;
|
|
|
|
static size_t _from_card_cache_mem_size;
|
|
|
|
|
2012-07-17 12:24:05 -07:00
|
|
|
// link/add the given fine grain remembered set into the "all" list
|
|
|
|
void link_to_all(PerRegionTable * prt);
|
|
|
|
// unlink/remove the given fine grain remembered set into the "all" list
|
|
|
|
void unlink_from_all(PerRegionTable * prt);
|
|
|
|
|
2008-06-05 15:57:56 -07:00
|
|
|
public:
|
|
|
|
OtherRegionsTable(HeapRegion* hr);
|
|
|
|
|
|
|
|
HeapRegion* hr() const { return _hr; }
|
|
|
|
|
|
|
|
// For now. Could "expand" some tables in the future, so that this made
|
|
|
|
// sense.
|
2009-07-14 15:40:39 -07:00
|
|
|
void add_reference(OopOrNarrowOopStar from, int tid);
|
2008-06-05 15:57:56 -07:00
|
|
|
|
|
|
|
// Removes any entries shown by the given bitmaps to contain only dead
|
|
|
|
// objects.
|
|
|
|
void scrub(CardTableModRefBS* ctbs, BitMap* region_bm, BitMap* card_bm);
|
|
|
|
|
|
|
|
// Not const because it takes a lock.
|
|
|
|
size_t occupied() const;
|
|
|
|
size_t occ_fine() const;
|
|
|
|
size_t occ_coarse() const;
|
|
|
|
size_t occ_sparse() const;
|
|
|
|
|
|
|
|
static jint n_coarsenings() { return _n_coarsenings; }
|
|
|
|
|
|
|
|
// Returns size in bytes.
|
|
|
|
// Not const because it takes a lock.
|
|
|
|
size_t mem_size() const;
|
|
|
|
static size_t static_mem_size();
|
|
|
|
static size_t fl_mem_size();
|
|
|
|
|
2009-07-14 15:40:39 -07:00
|
|
|
bool contains_reference(OopOrNarrowOopStar from) const;
|
|
|
|
bool contains_reference_locked(OopOrNarrowOopStar from) const;
|
2008-06-05 15:57:56 -07:00
|
|
|
|
|
|
|
void clear();
|
|
|
|
|
|
|
|
// Specifically clear the from_card_cache.
|
|
|
|
void clear_fcc();
|
|
|
|
|
|
|
|
// "from_hr" is being cleared; remove any entries from it.
|
|
|
|
void clear_incoming_entry(HeapRegion* from_hr);
|
|
|
|
|
2011-01-25 17:58:19 -05:00
|
|
|
void do_cleanup_work(HRRSCleanupTask* hrrs_cleanup_task);
|
|
|
|
|
2008-06-05 15:57:56 -07:00
|
|
|
// Declare the heap size (in # of regions) to the OtherRegionsTable.
|
|
|
|
// (Uses it to initialize from_card_cache).
|
|
|
|
static void init_from_card_cache(size_t max_regions);
|
|
|
|
|
|
|
|
// Declares that only regions i s.t. 0 <= i < new_n_regs are in use.
|
|
|
|
// Make sure any entries for higher regions are invalid.
|
|
|
|
static void shrink_from_card_cache(size_t new_n_regs);
|
|
|
|
|
|
|
|
static void print_from_card_cache();
|
|
|
|
};
|
|
|
|
|
2012-06-28 17:03:16 -04:00
|
|
|
class HeapRegionRemSet : public CHeapObj<mtGC> {
|
2008-06-05 15:57:56 -07:00
|
|
|
friend class VMStructs;
|
|
|
|
friend class HeapRegionRemSetIterator;
|
|
|
|
|
|
|
|
public:
|
|
|
|
enum Event {
|
|
|
|
Event_EvacStart, Event_EvacEnd, Event_RSUpdateEnd
|
|
|
|
};
|
|
|
|
|
|
|
|
private:
|
|
|
|
G1BlockOffsetSharedArray* _bosa;
|
|
|
|
G1BlockOffsetSharedArray* bosa() const { return _bosa; }
|
|
|
|
|
|
|
|
OtherRegionsTable _other_regions;
|
|
|
|
|
|
|
|
enum ParIterState { Unclaimed, Claimed, Complete };
|
2010-02-11 15:52:19 -08:00
|
|
|
volatile ParIterState _iter_state;
|
|
|
|
volatile jlong _iter_claimed;
|
2008-06-05 15:57:56 -07:00
|
|
|
|
|
|
|
// Unused unless G1RecordHRRSOops is true.
|
|
|
|
|
|
|
|
static const int MaxRecorded = 1000000;
|
2009-07-14 15:40:39 -07:00
|
|
|
static OopOrNarrowOopStar* _recorded_oops;
|
|
|
|
static HeapWord** _recorded_cards;
|
|
|
|
static HeapRegion** _recorded_regions;
|
|
|
|
static int _n_recorded;
|
2008-06-05 15:57:56 -07:00
|
|
|
|
|
|
|
static const int MaxRecordedEvents = 1000;
|
|
|
|
static Event* _recorded_events;
|
|
|
|
static int* _recorded_event_index;
|
|
|
|
static int _n_recorded_events;
|
|
|
|
|
|
|
|
static void print_event(outputStream* str, Event evnt);
|
|
|
|
|
|
|
|
public:
|
|
|
|
HeapRegionRemSet(G1BlockOffsetSharedArray* bosa,
|
|
|
|
HeapRegion* hr);
|
|
|
|
|
|
|
|
static int num_par_rem_sets();
|
2010-02-11 15:52:19 -08:00
|
|
|
static void setup_remset_size();
|
2008-06-05 15:57:56 -07:00
|
|
|
|
|
|
|
HeapRegion* hr() const {
|
|
|
|
return _other_regions.hr();
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t occupied() const {
|
|
|
|
return _other_regions.occupied();
|
|
|
|
}
|
|
|
|
size_t occ_fine() const {
|
|
|
|
return _other_regions.occ_fine();
|
|
|
|
}
|
|
|
|
size_t occ_coarse() const {
|
|
|
|
return _other_regions.occ_coarse();
|
|
|
|
}
|
|
|
|
size_t occ_sparse() const {
|
|
|
|
return _other_regions.occ_sparse();
|
|
|
|
}
|
|
|
|
|
|
|
|
static jint n_coarsenings() { return OtherRegionsTable::n_coarsenings(); }
|
|
|
|
|
2012-06-25 16:00:55 -07:00
|
|
|
// Used in the sequential case.
|
2009-07-14 15:40:39 -07:00
|
|
|
void add_reference(OopOrNarrowOopStar from) {
|
2012-06-25 16:00:55 -07:00
|
|
|
_other_regions.add_reference(from, 0);
|
2008-06-05 15:57:56 -07:00
|
|
|
}
|
|
|
|
|
2012-06-25 16:00:55 -07:00
|
|
|
// Used in the parallel case.
|
2009-07-14 15:40:39 -07:00
|
|
|
void add_reference(OopOrNarrowOopStar from, int tid) {
|
2008-06-05 15:57:56 -07:00
|
|
|
_other_regions.add_reference(from, tid);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Removes any entries shown by the given bitmaps to contain only dead
|
|
|
|
// objects.
|
|
|
|
void scrub(CardTableModRefBS* ctbs, BitMap* region_bm, BitMap* card_bm);
|
|
|
|
|
|
|
|
// The region is being reclaimed; clear its remset, and any mention of
|
|
|
|
// entries for this region in other remsets.
|
|
|
|
void clear();
|
|
|
|
|
|
|
|
// Attempt to claim the region. Returns true iff this call caused an
|
|
|
|
// atomic transition from Unclaimed to Claimed.
|
|
|
|
bool claim_iter();
|
|
|
|
// Sets the iteration state to "complete".
|
|
|
|
void set_iter_complete();
|
|
|
|
// Returns "true" iff the region's iteration is complete.
|
|
|
|
bool iter_is_complete();
|
|
|
|
|
2010-02-11 15:52:19 -08:00
|
|
|
// Support for claiming blocks of cards during iteration
|
|
|
|
size_t iter_claimed() const { return (size_t)_iter_claimed; }
|
|
|
|
// Claim the next block of cards
|
|
|
|
size_t iter_claimed_next(size_t step) {
|
|
|
|
size_t current, next;
|
|
|
|
do {
|
|
|
|
current = iter_claimed();
|
|
|
|
next = current + step;
|
|
|
|
} while (Atomic::cmpxchg((jlong)next, &_iter_claimed, (jlong)current) != (jlong)current);
|
|
|
|
return current;
|
|
|
|
}
|
2011-06-21 15:23:07 -04:00
|
|
|
void reset_for_par_iteration();
|
|
|
|
|
|
|
|
bool verify_ready_for_par_iteration() {
|
|
|
|
return (_iter_state == Unclaimed) && (_iter_claimed == 0);
|
|
|
|
}
|
2010-02-11 15:52:19 -08:00
|
|
|
|
2008-06-05 15:57:56 -07:00
|
|
|
// The actual # of bytes this hr_remset takes up.
|
|
|
|
size_t mem_size() {
|
|
|
|
return _other_regions.mem_size()
|
|
|
|
// This correction is necessary because the above includes the second
|
|
|
|
// part.
|
|
|
|
+ sizeof(this) - sizeof(OtherRegionsTable);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Returns the memory occupancy of all static data structures associated
|
|
|
|
// with remembered sets.
|
|
|
|
static size_t static_mem_size() {
|
|
|
|
return OtherRegionsTable::static_mem_size();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Returns the memory occupancy of all free_list data structures associated
|
|
|
|
// with remembered sets.
|
|
|
|
static size_t fl_mem_size() {
|
|
|
|
return OtherRegionsTable::fl_mem_size();
|
|
|
|
}
|
|
|
|
|
2009-07-14 15:40:39 -07:00
|
|
|
bool contains_reference(OopOrNarrowOopStar from) const {
|
2008-06-05 15:57:56 -07:00
|
|
|
return _other_regions.contains_reference(from);
|
|
|
|
}
|
|
|
|
void print() const;
|
|
|
|
|
|
|
|
// Called during a stop-world phase to perform any deferred cleanups.
|
|
|
|
static void cleanup();
|
|
|
|
|
|
|
|
// Declare the heap size (in # of regions) to the HeapRegionRemSet(s).
|
|
|
|
// (Uses it to initialize from_card_cache).
|
2012-04-18 07:21:15 -04:00
|
|
|
static void init_heap(uint max_regions) {
|
|
|
|
OtherRegionsTable::init_from_card_cache((size_t) max_regions);
|
2008-06-05 15:57:56 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// Declares that only regions i s.t. 0 <= i < new_n_regs are in use.
|
2012-04-18 07:21:15 -04:00
|
|
|
static void shrink_heap(uint new_n_regs) {
|
|
|
|
OtherRegionsTable::shrink_from_card_cache((size_t) new_n_regs);
|
2008-06-05 15:57:56 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef PRODUCT
|
|
|
|
static void print_from_card_cache() {
|
|
|
|
OtherRegionsTable::print_from_card_cache();
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2009-07-14 15:40:39 -07:00
|
|
|
static void record(HeapRegion* hr, OopOrNarrowOopStar f);
|
2008-06-05 15:57:56 -07:00
|
|
|
static void print_recorded();
|
|
|
|
static void record_event(Event evnt);
|
|
|
|
|
2011-01-25 17:58:19 -05:00
|
|
|
// These are wrappers for the similarly-named methods on
|
|
|
|
// SparsePRT. Look at sparsePRT.hpp for more details.
|
|
|
|
static void reset_for_cleanup_tasks();
|
|
|
|
void do_cleanup_work(HRRSCleanupTask* hrrs_cleanup_task);
|
|
|
|
static void finish_cleanup_task(HRRSCleanupTask* hrrs_cleanup_task);
|
|
|
|
|
2008-06-05 15:57:56 -07:00
|
|
|
// Run unit tests.
|
|
|
|
#ifndef PRODUCT
|
2013-05-21 11:30:14 +02:00
|
|
|
static void test_prt();
|
2008-06-05 15:57:56 -07:00
|
|
|
static void test();
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
2013-04-18 10:09:23 -07:00
|
|
|
class HeapRegionRemSetIterator : public StackObj {
|
2008-06-05 15:57:56 -07:00
|
|
|
|
2013-04-18 10:09:23 -07:00
|
|
|
// The region RSet over which we're iterating.
|
2008-06-05 15:57:56 -07:00
|
|
|
const HeapRegionRemSet* _hrrs;
|
|
|
|
|
|
|
|
// Local caching of HRRS fields.
|
|
|
|
const BitMap* _coarse_map;
|
2012-06-25 16:00:55 -07:00
|
|
|
PerRegionTable** _fine_grain_regions;
|
2008-06-05 15:57:56 -07:00
|
|
|
|
|
|
|
G1BlockOffsetSharedArray* _bosa;
|
|
|
|
G1CollectedHeap* _g1h;
|
|
|
|
|
|
|
|
// The number yielded since initialization.
|
|
|
|
size_t _n_yielded_fine;
|
|
|
|
size_t _n_yielded_coarse;
|
|
|
|
size_t _n_yielded_sparse;
|
|
|
|
|
2013-04-18 10:09:23 -07:00
|
|
|
// Indicates what granularity of table that we're currently iterating over.
|
|
|
|
// We start iterating over the sparse table, progress to the fine grain
|
|
|
|
// table, and then finish with the coarse table.
|
|
|
|
// See HeapRegionRemSetIterator::has_next().
|
2008-06-05 15:57:56 -07:00
|
|
|
enum IterState {
|
|
|
|
Sparse,
|
|
|
|
Fine,
|
|
|
|
Coarse
|
|
|
|
};
|
|
|
|
IterState _is;
|
|
|
|
|
|
|
|
// In both kinds of iteration, heap offset of first card of current
|
|
|
|
// region.
|
|
|
|
size_t _cur_region_card_offset;
|
|
|
|
// Card offset within cur region.
|
|
|
|
size_t _cur_region_cur_card;
|
|
|
|
|
|
|
|
// Coarse table iteration fields:
|
|
|
|
|
|
|
|
// Current region index;
|
2011-10-05 08:44:10 -07:00
|
|
|
int _coarse_cur_region_index;
|
|
|
|
size_t _coarse_cur_region_cur_card;
|
2008-06-05 15:57:56 -07:00
|
|
|
|
|
|
|
bool coarse_has_next(size_t& card_index);
|
|
|
|
|
|
|
|
// Fine table iteration fields:
|
|
|
|
|
|
|
|
// Index of bucket-list we're working on.
|
|
|
|
int _fine_array_index;
|
2012-06-25 16:00:55 -07:00
|
|
|
|
2008-06-05 15:57:56 -07:00
|
|
|
// Per Region Table we're doing within current bucket list.
|
2012-06-25 16:00:55 -07:00
|
|
|
PerRegionTable* _fine_cur_prt;
|
2008-06-05 15:57:56 -07:00
|
|
|
|
|
|
|
/* SparsePRT::*/ SparsePRTIter _sparse_iter;
|
|
|
|
|
|
|
|
void fine_find_next_non_null_prt();
|
|
|
|
|
|
|
|
bool fine_has_next();
|
|
|
|
bool fine_has_next(size_t& card_index);
|
|
|
|
|
|
|
|
public:
|
|
|
|
// We require an iterator to be initialized before use, so the
|
|
|
|
// constructor does little.
|
2013-04-18 10:09:23 -07:00
|
|
|
HeapRegionRemSetIterator(const HeapRegionRemSet* hrrs);
|
2008-06-05 15:57:56 -07:00
|
|
|
|
|
|
|
// If there remains one or more cards to be yielded, returns true and
|
|
|
|
// sets "card_index" to one of those cards (which is then considered
|
|
|
|
// yielded.) Otherwise, returns false (and leaves "card_index"
|
|
|
|
// undefined.)
|
|
|
|
bool has_next(size_t& card_index);
|
|
|
|
|
|
|
|
size_t n_yielded_fine() { return _n_yielded_fine; }
|
|
|
|
size_t n_yielded_coarse() { return _n_yielded_coarse; }
|
|
|
|
size_t n_yielded_sparse() { return _n_yielded_sparse; }
|
|
|
|
size_t n_yielded() {
|
|
|
|
return n_yielded_fine() + n_yielded_coarse() + n_yielded_sparse();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2010-11-23 13:22:55 -08:00
|
|
|
#endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONREMSET_HPP
|