src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp

changeset 2060
2d160770d2e5
parent 2021
5cbac8938c4c
child 2062
0ce1569c90e5
equal deleted inserted replaced
2059:63f4675ac87d 2060:2d160770d2e5
54 G1RemSet* g1rs, 54 G1RemSet* g1rs,
55 ConcurrentG1Refine* cg1r) : 55 ConcurrentG1Refine* cg1r) :
56 _sts(sts), _g1rs(g1rs), _cg1r(cg1r), _concurrent(true) 56 _sts(sts), _g1rs(g1rs), _cg1r(cg1r), _concurrent(true)
57 {} 57 {}
58 bool do_card_ptr(jbyte* card_ptr, int worker_i) { 58 bool do_card_ptr(jbyte* card_ptr, int worker_i) {
59 _g1rs->concurrentRefineOneCard(card_ptr, worker_i); 59 bool oops_into_cset = _g1rs->concurrentRefineOneCard(card_ptr, worker_i, false);
60 // This path is executed by the concurrent refine or mutator threads,
61 // concurrently, and so we do not care if card_ptr contains references
62 // that point into the collection set.
63 assert(!oops_into_cset, "should be");
64
60 if (_concurrent && _sts->should_yield()) { 65 if (_concurrent && _sts->should_yield()) {
61 // Caller will actually yield. 66 // Caller will actually yield.
62 return false; 67 return false;
63 } 68 }
64 // Otherwise, we finished successfully; return true. 69 // Otherwise, we finished successfully; return true.
1320 1325
1321 G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) : 1326 G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) :
1322 SharedHeap(policy_), 1327 SharedHeap(policy_),
1323 _g1_policy(policy_), 1328 _g1_policy(policy_),
1324 _dirty_card_queue_set(false), 1329 _dirty_card_queue_set(false),
1330 _into_cset_dirty_card_queue_set(false),
1325 _ref_processor(NULL), 1331 _ref_processor(NULL),
1326 _process_strong_tasks(new SubTasksDone(G1H_PS_NumElements)), 1332 _process_strong_tasks(new SubTasksDone(G1H_PS_NumElements)),
1327 _bot_shared(NULL), 1333 _bot_shared(NULL),
1328 _par_alloc_during_gc_lock(Mutex::leaf, "par alloc during GC lock"), 1334 _par_alloc_during_gc_lock(Mutex::leaf, "par alloc during GC lock"),
1329 _objs_with_preserved_marks(NULL), _preserved_marks_of_objs(NULL), 1335 _objs_with_preserved_marks(NULL), _preserved_marks_of_objs(NULL),
1570 -1, // never trigger processing 1576 -1, // never trigger processing
1571 -1, // no limit on length 1577 -1, // no limit on length
1572 Shared_DirtyCardQ_lock, 1578 Shared_DirtyCardQ_lock,
1573 &JavaThread::dirty_card_queue_set()); 1579 &JavaThread::dirty_card_queue_set());
1574 } 1580 }
1581
1582 // Initialize the card queue set used to hold cards containing
1583 // references into the collection set.
1584 _into_cset_dirty_card_queue_set.initialize(DirtyCardQ_CBL_mon,
1585 DirtyCardQ_FL_lock,
1586 -1, // never trigger processing
1587 -1, // no limit on length
1588 Shared_DirtyCardQ_lock,
1589 &JavaThread::dirty_card_queue_set());
1590
1575 // In case we're keeping closure specialization stats, initialize those 1591 // In case we're keeping closure specialization stats, initialize those
1576 // counts and that mechanism. 1592 // counts and that mechanism.
1577 SpecializationStats::clear(); 1593 SpecializationStats::clear();
1578 1594
1579 _gc_alloc_region_list = NULL; 1595 _gc_alloc_region_list = NULL;
1601 1617
1602 size_t G1CollectedHeap::capacity() const { 1618 size_t G1CollectedHeap::capacity() const {
1603 return _g1_committed.byte_size(); 1619 return _g1_committed.byte_size();
1604 } 1620 }
1605 1621
1606 void G1CollectedHeap::iterate_dirty_card_closure(bool concurrent, 1622 void G1CollectedHeap::iterate_dirty_card_closure(CardTableEntryClosure* cl,
1623 DirtyCardQueue* into_cset_dcq,
1624 bool concurrent,
1607 int worker_i) { 1625 int worker_i) {
1608 // Clean cards in the hot card cache 1626 // Clean cards in the hot card cache
1609 concurrent_g1_refine()->clean_up_cache(worker_i, g1_rem_set()); 1627 concurrent_g1_refine()->clean_up_cache(worker_i, g1_rem_set(), into_cset_dcq);
1610 1628
1611 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set(); 1629 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
1612 int n_completed_buffers = 0; 1630 int n_completed_buffers = 0;
1613 while (dcqs.apply_closure_to_completed_buffer(worker_i, 0, true)) { 1631 while (dcqs.apply_closure_to_completed_buffer(cl, worker_i, 0, true)) {
1614 n_completed_buffers++; 1632 n_completed_buffers++;
1615 } 1633 }
1616 g1_policy()->record_update_rs_processed_buffers(worker_i, 1634 g1_policy()->record_update_rs_processed_buffers(worker_i,
1617 (double) n_completed_buffers); 1635 (double) n_completed_buffers);
1618 dcqs.clear_n_completed_buffers(); 1636 dcqs.clear_n_completed_buffers();
3344 #endif // G1_DEBUG 3362 #endif // G1_DEBUG
3345 } 3363 }
3346 } 3364 }
3347 }; 3365 };
3348 3366
3349 class UpdateRSetImmediate : public OopsInHeapRegionClosure {
3350 private:
3351 G1CollectedHeap* _g1;
3352 G1RemSet* _g1_rem_set;
3353 public:
3354 UpdateRSetImmediate(G1CollectedHeap* g1) :
3355 _g1(g1), _g1_rem_set(g1->g1_rem_set()) {}
3356
3357 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
3358 virtual void do_oop( oop* p) { do_oop_work(p); }
3359 template <class T> void do_oop_work(T* p) {
3360 assert(_from->is_in_reserved(p), "paranoia");
3361 T heap_oop = oopDesc::load_heap_oop(p);
3362 if (!oopDesc::is_null(heap_oop) && !_from->is_survivor()) {
3363 _g1_rem_set->par_write_ref(_from, p, 0);
3364 }
3365 }
3366 };
3367
3368 class UpdateRSetDeferred : public OopsInHeapRegionClosure { 3367 class UpdateRSetDeferred : public OopsInHeapRegionClosure {
3369 private: 3368 private:
3370 G1CollectedHeap* _g1; 3369 G1CollectedHeap* _g1;
3371 DirtyCardQueue *_dcq; 3370 DirtyCardQueue *_dcq;
3372 CardTableModRefBS* _ct_bs; 3371 CardTableModRefBS* _ct_bs;
3386 _dcq->enqueue((jbyte*)_ct_bs->byte_for_index(card_index)); 3385 _dcq->enqueue((jbyte*)_ct_bs->byte_for_index(card_index));
3387 } 3386 }
3388 } 3387 }
3389 } 3388 }
3390 }; 3389 };
3391
3392
3393 3390
3394 class RemoveSelfPointerClosure: public ObjectClosure { 3391 class RemoveSelfPointerClosure: public ObjectClosure {
3395 private: 3392 private:
3396 G1CollectedHeap* _g1; 3393 G1CollectedHeap* _g1;
3397 ConcurrentMark* _cm; 3394 ConcurrentMark* _cm;
3451 } 3448 }
3452 } 3449 }
3453 }; 3450 };
3454 3451
3455 void G1CollectedHeap::remove_self_forwarding_pointers() { 3452 void G1CollectedHeap::remove_self_forwarding_pointers() {
3456 UpdateRSetImmediate immediate_update(_g1h); 3453 UpdateRSetImmediate immediate_update(_g1h->g1_rem_set());
3457 DirtyCardQueue dcq(&_g1h->dirty_card_queue_set()); 3454 DirtyCardQueue dcq(&_g1h->dirty_card_queue_set());
3458 UpdateRSetDeferred deferred_update(_g1h, &dcq); 3455 UpdateRSetDeferred deferred_update(_g1h, &dcq);
3459 OopsInHeapRegionClosure *cl; 3456 OopsInHeapRegionClosure *cl;
3460 if (G1DeferredRSUpdate) { 3457 if (G1DeferredRSUpdate) {
3461 cl = &deferred_update; 3458 cl = &deferred_update;

mercurial