Merge
This commit is contained in:
commit
333927f512
@ -1780,7 +1780,6 @@ G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) :
|
|||||||
CollectedHeap(),
|
CollectedHeap(),
|
||||||
_g1_policy(policy_),
|
_g1_policy(policy_),
|
||||||
_dirty_card_queue_set(false),
|
_dirty_card_queue_set(false),
|
||||||
_into_cset_dirty_card_queue_set(false),
|
|
||||||
_is_alive_closure_cm(this),
|
_is_alive_closure_cm(this),
|
||||||
_is_alive_closure_stw(this),
|
_is_alive_closure_stw(this),
|
||||||
_ref_processor_cm(NULL),
|
_ref_processor_cm(NULL),
|
||||||
@ -2045,16 +2044,6 @@ jint G1CollectedHeap::initialize() {
|
|||||||
Shared_DirtyCardQ_lock,
|
Shared_DirtyCardQ_lock,
|
||||||
&JavaThread::dirty_card_queue_set());
|
&JavaThread::dirty_card_queue_set());
|
||||||
|
|
||||||
// Initialize the card queue set used to hold cards containing
|
|
||||||
// references into the collection set.
|
|
||||||
_into_cset_dirty_card_queue_set.initialize(NULL, // Should never be called by the Java code
|
|
||||||
DirtyCardQ_CBL_mon,
|
|
||||||
DirtyCardQ_FL_lock,
|
|
||||||
-1, // never trigger processing
|
|
||||||
-1, // no limit on length
|
|
||||||
Shared_DirtyCardQ_lock,
|
|
||||||
&JavaThread::dirty_card_queue_set());
|
|
||||||
|
|
||||||
// Here we allocate the dummy HeapRegion that is required by the
|
// Here we allocate the dummy HeapRegion that is required by the
|
||||||
// G1AllocRegion class.
|
// G1AllocRegion class.
|
||||||
HeapRegion* dummy_region = _hrm.get_dummy_region();
|
HeapRegion* dummy_region = _hrm.get_dummy_region();
|
||||||
|
@ -757,12 +757,6 @@ protected:
|
|||||||
// The closure used to refine a single card.
|
// The closure used to refine a single card.
|
||||||
RefineCardTableEntryClosure* _refine_cte_cl;
|
RefineCardTableEntryClosure* _refine_cte_cl;
|
||||||
|
|
||||||
// A DirtyCardQueueSet that is used to hold cards that contain
|
|
||||||
// references into the current collection set. This is used to
|
|
||||||
// update the remembered sets of the regions in the collection
|
|
||||||
// set in the event of an evacuation failure.
|
|
||||||
DirtyCardQueueSet _into_cset_dirty_card_queue_set;
|
|
||||||
|
|
||||||
// After a collection pause, make the regions in the CS into free
|
// After a collection pause, make the regions in the CS into free
|
||||||
// regions.
|
// regions.
|
||||||
void free_collection_set(HeapRegion* cs_head, EvacuationInfo& evacuation_info, const size_t* surviving_young_words);
|
void free_collection_set(HeapRegion* cs_head, EvacuationInfo& evacuation_info, const size_t* surviving_young_words);
|
||||||
@ -952,13 +946,6 @@ public:
|
|||||||
// A set of cards where updates happened during the GC
|
// A set of cards where updates happened during the GC
|
||||||
DirtyCardQueueSet& dirty_card_queue_set() { return _dirty_card_queue_set; }
|
DirtyCardQueueSet& dirty_card_queue_set() { return _dirty_card_queue_set; }
|
||||||
|
|
||||||
// A DirtyCardQueueSet that is used to hold cards that contain
|
|
||||||
// references into the current collection set. This is used to
|
|
||||||
// update the remembered sets of the regions in the collection
|
|
||||||
// set in the event of an evacuation failure.
|
|
||||||
DirtyCardQueueSet& into_cset_dirty_card_queue_set()
|
|
||||||
{ return _into_cset_dirty_card_queue_set; }
|
|
||||||
|
|
||||||
// Create a G1CollectedHeap with the specified policy.
|
// Create a G1CollectedHeap with the specified policy.
|
||||||
// Must call the initialize method afterwards.
|
// Must call the initialize method afterwards.
|
||||||
// May not return if something goes wrong.
|
// May not return if something goes wrong.
|
||||||
|
@ -45,7 +45,8 @@ G1RemSet::G1RemSet(G1CollectedHeap* g1, CardTableModRefBS* ct_bs)
|
|||||||
_ct_bs(ct_bs), _g1p(_g1->g1_policy()),
|
_ct_bs(ct_bs), _g1p(_g1->g1_policy()),
|
||||||
_cg1r(g1->concurrent_g1_refine()),
|
_cg1r(g1->concurrent_g1_refine()),
|
||||||
_cset_rs_update_cl(NULL),
|
_cset_rs_update_cl(NULL),
|
||||||
_prev_period_summary()
|
_prev_period_summary(),
|
||||||
|
_into_cset_dirty_card_queue_set(false)
|
||||||
{
|
{
|
||||||
_cset_rs_update_cl = NEW_C_HEAP_ARRAY(G1ParPushHeapRSClosure*, n_workers(), mtGC);
|
_cset_rs_update_cl = NEW_C_HEAP_ARRAY(G1ParPushHeapRSClosure*, n_workers(), mtGC);
|
||||||
for (uint i = 0; i < n_workers(); i++) {
|
for (uint i = 0; i < n_workers(); i++) {
|
||||||
@ -54,6 +55,15 @@ G1RemSet::G1RemSet(G1CollectedHeap* g1, CardTableModRefBS* ct_bs)
|
|||||||
if (G1SummarizeRSetStats) {
|
if (G1SummarizeRSetStats) {
|
||||||
_prev_period_summary.initialize(this);
|
_prev_period_summary.initialize(this);
|
||||||
}
|
}
|
||||||
|
// Initialize the card queue set used to hold cards containing
|
||||||
|
// references into the collection set.
|
||||||
|
_into_cset_dirty_card_queue_set.initialize(NULL, // Should never be called by the Java code
|
||||||
|
DirtyCardQ_CBL_mon,
|
||||||
|
DirtyCardQ_FL_lock,
|
||||||
|
-1, // never trigger processing
|
||||||
|
-1, // no limit on length
|
||||||
|
Shared_DirtyCardQ_lock,
|
||||||
|
&JavaThread::dirty_card_queue_set());
|
||||||
}
|
}
|
||||||
|
|
||||||
G1RemSet::~G1RemSet() {
|
G1RemSet::~G1RemSet() {
|
||||||
@ -242,7 +252,7 @@ public:
|
|||||||
if (_g1rs->refine_card(card_ptr, worker_i, true)) {
|
if (_g1rs->refine_card(card_ptr, worker_i, true)) {
|
||||||
// 'card_ptr' contains references that point into the collection
|
// 'card_ptr' contains references that point into the collection
|
||||||
// set. We need to record the card in the DCQS
|
// set. We need to record the card in the DCQS
|
||||||
// (G1CollectedHeap::into_cset_dirty_card_queue_set())
|
// (_into_cset_dirty_card_queue_set)
|
||||||
// that's used for that purpose.
|
// that's used for that purpose.
|
||||||
//
|
//
|
||||||
// Enqueue the card
|
// Enqueue the card
|
||||||
@ -286,7 +296,7 @@ size_t G1RemSet::oops_into_collection_set_do(G1ParPushHeapRSClosure* oc,
|
|||||||
// are wholly 'free' of live objects. In the event of an evacuation
|
// are wholly 'free' of live objects. In the event of an evacuation
|
||||||
// failure the cards/buffers in this queue set are passed to the
|
// failure the cards/buffers in this queue set are passed to the
|
||||||
// DirtyCardQueueSet that is used to manage RSet updates
|
// DirtyCardQueueSet that is used to manage RSet updates
|
||||||
DirtyCardQueue into_cset_dcq(&_g1->into_cset_dirty_card_queue_set());
|
DirtyCardQueue into_cset_dcq(&_into_cset_dirty_card_queue_set);
|
||||||
|
|
||||||
updateRS(&into_cset_dcq, worker_i);
|
updateRS(&into_cset_dcq, worker_i);
|
||||||
size_t cards_scanned = scanRS(oc, heap_region_codeblobs, worker_i);
|
size_t cards_scanned = scanRS(oc, heap_region_codeblobs, worker_i);
|
||||||
@ -309,7 +319,7 @@ void G1RemSet::cleanup_after_oops_into_collection_set_do() {
|
|||||||
// Set all cards back to clean.
|
// Set all cards back to clean.
|
||||||
_g1->cleanUpCardTable();
|
_g1->cleanUpCardTable();
|
||||||
|
|
||||||
DirtyCardQueueSet& into_cset_dcqs = _g1->into_cset_dirty_card_queue_set();
|
DirtyCardQueueSet& into_cset_dcqs = _into_cset_dirty_card_queue_set;
|
||||||
int into_cset_n_buffers = into_cset_dcqs.completed_buffers_num();
|
int into_cset_n_buffers = into_cset_dcqs.completed_buffers_num();
|
||||||
|
|
||||||
if (_g1->evacuation_failed()) {
|
if (_g1->evacuation_failed()) {
|
||||||
@ -325,10 +335,10 @@ void G1RemSet::cleanup_after_oops_into_collection_set_do() {
|
|||||||
|
|
||||||
// Free any completed buffers in the DirtyCardQueueSet used to hold cards
|
// Free any completed buffers in the DirtyCardQueueSet used to hold cards
|
||||||
// which contain references that point into the collection.
|
// which contain references that point into the collection.
|
||||||
_g1->into_cset_dirty_card_queue_set().clear();
|
_into_cset_dirty_card_queue_set.clear();
|
||||||
assert(_g1->into_cset_dirty_card_queue_set().completed_buffers_num() == 0,
|
assert(_into_cset_dirty_card_queue_set.completed_buffers_num() == 0,
|
||||||
"all buffers should be freed");
|
"all buffers should be freed");
|
||||||
_g1->into_cset_dirty_card_queue_set().clear_n_completed_buffers();
|
_into_cset_dirty_card_queue_set.clear_n_completed_buffers();
|
||||||
}
|
}
|
||||||
|
|
||||||
class ScrubRSClosure: public HeapRegionClosure {
|
class ScrubRSClosure: public HeapRegionClosure {
|
||||||
@ -586,9 +596,9 @@ void G1RemSet::prepare_for_verify() {
|
|||||||
bool use_hot_card_cache = hot_card_cache->use_cache();
|
bool use_hot_card_cache = hot_card_cache->use_cache();
|
||||||
hot_card_cache->set_use_cache(false);
|
hot_card_cache->set_use_cache(false);
|
||||||
|
|
||||||
DirtyCardQueue into_cset_dcq(&_g1->into_cset_dirty_card_queue_set());
|
DirtyCardQueue into_cset_dcq(&_into_cset_dirty_card_queue_set);
|
||||||
updateRS(&into_cset_dcq, 0);
|
updateRS(&into_cset_dcq, 0);
|
||||||
_g1->into_cset_dirty_card_queue_set().clear();
|
_into_cset_dirty_card_queue_set.clear();
|
||||||
|
|
||||||
hot_card_cache->set_use_cache(use_hot_card_cache);
|
hot_card_cache->set_use_cache(use_hot_card_cache);
|
||||||
assert(JavaThread::dirty_card_queue_set().completed_buffers_num() == 0, "All should be consumed");
|
assert(JavaThread::dirty_card_queue_set().completed_buffers_num() == 0, "All should be consumed");
|
||||||
|
@ -41,6 +41,13 @@ class G1ParPushHeapRSClosure;
|
|||||||
class G1RemSet: public CHeapObj<mtGC> {
|
class G1RemSet: public CHeapObj<mtGC> {
|
||||||
private:
|
private:
|
||||||
G1RemSetSummary _prev_period_summary;
|
G1RemSetSummary _prev_period_summary;
|
||||||
|
|
||||||
|
// A DirtyCardQueueSet that is used to hold cards that contain
|
||||||
|
// references into the current collection set. This is used to
|
||||||
|
// update the remembered sets of the regions in the collection
|
||||||
|
// set in the event of an evacuation failure.
|
||||||
|
DirtyCardQueueSet _into_cset_dirty_card_queue_set;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
G1CollectedHeap* _g1;
|
G1CollectedHeap* _g1;
|
||||||
size_t _conc_refine_cards;
|
size_t _conc_refine_cards;
|
||||||
|
Loading…
Reference in New Issue
Block a user