提交 a1d9fed7 编写于 作者: T tschatzl

8027553: Change the in_cset_fast_test functionality to use the G1BiasedArray abstraction

Summary: Instead of using a manually managed array for the in_cset_fast_test array, use a G1BiasedArray instance.
Reviewed-by: brutisso, mgerdin
上级 aca6ade5
...@@ -1511,9 +1511,6 @@ bool G1CollectedHeap::do_collection(bool explicit_gc, ...@@ -1511,9 +1511,6 @@ bool G1CollectedHeap::do_collection(bool explicit_gc,
assert(g1_policy()->collection_set() == NULL, "must be"); assert(g1_policy()->collection_set() == NULL, "must be");
g1_policy()->start_incremental_cset_building(); g1_policy()->start_incremental_cset_building();
// Clear the _cset_fast_test bitmap in anticipation of adding
// regions to the incremental collection set for the next
// evacuation pause.
clear_cset_fast_test(); clear_cset_fast_test();
init_mutator_alloc_region(); init_mutator_alloc_region();
...@@ -1933,8 +1930,7 @@ G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) : ...@@ -1933,8 +1930,7 @@ G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) :
_old_marking_cycles_started(0), _old_marking_cycles_started(0),
_old_marking_cycles_completed(0), _old_marking_cycles_completed(0),
_concurrent_cycle_started(false), _concurrent_cycle_started(false),
_in_cset_fast_test(NULL), _in_cset_fast_test(),
_in_cset_fast_test_base(NULL),
_dirty_cards_region_list(NULL), _dirty_cards_region_list(NULL),
_worker_cset_start_region(NULL), _worker_cset_start_region(NULL),
_worker_cset_start_region_time_stamp(NULL), _worker_cset_start_region_time_stamp(NULL),
...@@ -2076,20 +2072,7 @@ jint G1CollectedHeap::initialize() { ...@@ -2076,20 +2072,7 @@ jint G1CollectedHeap::initialize() {
_g1h = this; _g1h = this;
_in_cset_fast_test_length = max_regions(); _in_cset_fast_test.initialize(_g1_reserved.start(), _g1_reserved.end(), HeapRegion::GrainBytes);
_in_cset_fast_test_base =
NEW_C_HEAP_ARRAY(bool, (size_t) _in_cset_fast_test_length, mtGC);
// We're biasing _in_cset_fast_test to avoid subtracting the
// beginning of the heap every time we want to index; basically
// it's the same with what we do with the card table.
_in_cset_fast_test = _in_cset_fast_test_base -
((uintx) _g1_reserved.start() >> HeapRegion::LogOfHRGrainBytes);
// Clear the _cset_fast_test bitmap in anticipation of adding
// regions to the incremental collection set for the first
// evacuation pause.
clear_cset_fast_test();
// Create the ConcurrentMark data structure and thread. // Create the ConcurrentMark data structure and thread.
// (Must do this late, so that "max_regions" is defined.) // (Must do this late, so that "max_regions" is defined.)
...@@ -4145,9 +4128,6 @@ G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) { ...@@ -4145,9 +4128,6 @@ G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) {
// Start a new incremental collection set for the next pause. // Start a new incremental collection set for the next pause.
g1_policy()->start_incremental_cset_building(); g1_policy()->start_incremental_cset_building();
// Clear the _cset_fast_test bitmap in anticipation of adding
// regions to the incremental collection set for the next
// evacuation pause.
clear_cset_fast_test(); clear_cset_fast_test();
_young_list->reset_sampled_info(); _young_list->reset_sampled_info();
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "gc_implementation/g1/concurrentMark.hpp" #include "gc_implementation/g1/concurrentMark.hpp"
#include "gc_implementation/g1/evacuationInfo.hpp" #include "gc_implementation/g1/evacuationInfo.hpp"
#include "gc_implementation/g1/g1AllocRegion.hpp" #include "gc_implementation/g1/g1AllocRegion.hpp"
#include "gc_implementation/g1/g1BiasedArray.hpp"
#include "gc_implementation/g1/g1HRPrinter.hpp" #include "gc_implementation/g1/g1HRPrinter.hpp"
#include "gc_implementation/g1/g1MonitoringSupport.hpp" #include "gc_implementation/g1/g1MonitoringSupport.hpp"
#include "gc_implementation/g1/g1RemSet.hpp" #include "gc_implementation/g1/g1RemSet.hpp"
...@@ -197,6 +198,16 @@ public: ...@@ -197,6 +198,16 @@ public:
bool do_object_b(oop p); bool do_object_b(oop p);
}; };
// Instances of this class are used for quick tests on whether a reference points
// into the collection set. Each of the array's elements denotes whether the
// corresponding region is in the collection set.
class G1FastCSetBiasedMappedArray : public G1BiasedMappedArray<bool> {
protected:
bool default_value() const { return false; }
public:
void clear() { G1BiasedMappedArray<bool>::clear(); }
};
class RefineCardTableEntryClosure; class RefineCardTableEntryClosure;
class G1CollectedHeap : public SharedHeap { class G1CollectedHeap : public SharedHeap {
...@@ -353,26 +364,10 @@ private: ...@@ -353,26 +364,10 @@ private:
// than the current allocation region. // than the current allocation region.
size_t _summary_bytes_used; size_t _summary_bytes_used;
// This is used for a quick test on whether a reference points into // This array is used for a quick test on whether a reference points into
// the collection set or not. Basically, we have an array, with one // the collection set or not. Each of the array's elements denotes whether the
// byte per region, and that byte denotes whether the corresponding // corresponding region is in the collection set or not.
// region is in the collection set or not. The entry corresponding G1FastCSetBiasedMappedArray _in_cset_fast_test;
// the bottom of the heap, i.e., region 0, is pointed to by
// _in_cset_fast_test_base. The _in_cset_fast_test field has been
// biased so that it actually points to address 0 of the address
// space, to make the test as fast as possible (we can simply shift
// the address to address into it, instead of having to subtract the
// bottom of the heap from the address before shifting it; basically
// it works in the same way the card table works).
bool* _in_cset_fast_test;
// The allocated array used for the fast test on whether a reference
// points into the collection set or not. This field is also used to
// free the array.
bool* _in_cset_fast_test_base;
// The length of the _in_cset_fast_test_base array.
uint _in_cset_fast_test_length;
volatile unsigned _gc_time_stamp; volatile unsigned _gc_time_stamp;
...@@ -695,12 +690,7 @@ public: ...@@ -695,12 +690,7 @@ public:
// We register a region with the fast "in collection set" test. We // We register a region with the fast "in collection set" test. We
// simply set to true the array slot corresponding to this region. // simply set to true the array slot corresponding to this region.
void register_region_with_in_cset_fast_test(HeapRegion* r) { void register_region_with_in_cset_fast_test(HeapRegion* r) {
assert(_in_cset_fast_test_base != NULL, "sanity"); _in_cset_fast_test.set_by_index(r->hrs_index(), true);
assert(r->in_collection_set(), "invariant");
uint index = r->hrs_index();
assert(index < _in_cset_fast_test_length, "invariant");
assert(!_in_cset_fast_test_base[index], "invariant");
_in_cset_fast_test_base[index] = true;
} }
// This is a fast test on whether a reference points into the // This is a fast test on whether a reference points into the
...@@ -709,9 +699,7 @@ public: ...@@ -709,9 +699,7 @@ public:
inline bool in_cset_fast_test(oop obj); inline bool in_cset_fast_test(oop obj);
void clear_cset_fast_test() { void clear_cset_fast_test() {
assert(_in_cset_fast_test_base != NULL, "sanity"); _in_cset_fast_test.clear();
memset(_in_cset_fast_test_base, false,
(size_t) _in_cset_fast_test_length * sizeof(bool));
} }
// This is called at the start of either a concurrent cycle or a Full // This is called at the start of either a concurrent cycle or a Full
......
...@@ -178,12 +178,7 @@ inline bool G1CollectedHeap::isMarkedNext(oop obj) const { ...@@ -178,12 +178,7 @@ inline bool G1CollectedHeap::isMarkedNext(oop obj) const {
// collection set or not. Assume that the reference // collection set or not. Assume that the reference
// points into the heap. // points into the heap.
inline bool G1CollectedHeap::in_cset_fast_test(oop obj) { inline bool G1CollectedHeap::in_cset_fast_test(oop obj) {
assert(_in_cset_fast_test != NULL, "sanity"); bool ret = _in_cset_fast_test.get_by_address((HeapWord*)obj);
assert(_g1_committed.contains((HeapWord*) obj), err_msg("Given reference outside of heap, is "PTR_FORMAT, p2i((HeapWord*)obj)));
// no need to subtract the bottom of the heap from obj,
// _in_cset_fast_test is biased
uintx index = cast_from_oop<uintx>(obj) >> HeapRegion::LogOfHRGrainBytes;
bool ret = _in_cset_fast_test[index];
// let's make sure the result is consistent with what the slower // let's make sure the result is consistent with what the slower
// test returns // test returns
assert( ret || !obj_in_cs(obj), "sanity"); assert( ret || !obj_in_cs(obj), "sanity");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册