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; |
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; |