comparison src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @ 12352:798522662fcd

Merge
author jcoomes
date Fri, 04 Oct 2013 13:37:25 -0700
parents a5ac0873476c 9de9169ddde6
children cefad50507d8 aa6f2ea19d8f
comparison
equal deleted inserted replaced
12338:100614790c1e 12352:798522662fcd
123 G1CollectedHeap* _g1h; 123 G1CollectedHeap* _g1h;
124 CardTableModRefBS* _ctbs; 124 CardTableModRefBS* _ctbs;
125 int _histo[256]; 125 int _histo[256];
126 public: 126 public:
127 ClearLoggedCardTableEntryClosure() : 127 ClearLoggedCardTableEntryClosure() :
128 _calls(0) 128 _calls(0), _g1h(G1CollectedHeap::heap()), _ctbs(_g1h->g1_barrier_set())
129 { 129 {
130 _g1h = G1CollectedHeap::heap();
131 _ctbs = (CardTableModRefBS*)_g1h->barrier_set();
132 for (int i = 0; i < 256; i++) _histo[i] = 0; 130 for (int i = 0; i < 256; i++) _histo[i] = 0;
133 } 131 }
134 bool do_card_ptr(jbyte* card_ptr, int worker_i) { 132 bool do_card_ptr(jbyte* card_ptr, int worker_i) {
135 if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) { 133 if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) {
136 _calls++; 134 _calls++;
156 int _calls; 154 int _calls;
157 G1CollectedHeap* _g1h; 155 G1CollectedHeap* _g1h;
158 CardTableModRefBS* _ctbs; 156 CardTableModRefBS* _ctbs;
159 public: 157 public:
160 RedirtyLoggedCardTableEntryClosure() : 158 RedirtyLoggedCardTableEntryClosure() :
161 _calls(0) 159 _calls(0), _g1h(G1CollectedHeap::heap()), _ctbs(_g1h->g1_barrier_set()) {}
162 { 160
163 _g1h = G1CollectedHeap::heap();
164 _ctbs = (CardTableModRefBS*)_g1h->barrier_set();
165 }
166 bool do_card_ptr(jbyte* card_ptr, int worker_i) { 161 bool do_card_ptr(jbyte* card_ptr, int worker_i) {
167 if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) { 162 if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) {
168 _calls++; 163 _calls++;
169 *card_ptr = 0; 164 *card_ptr = 0;
170 } 165 }
476 } 471 }
477 } 472 }
478 473
479 void G1CollectedHeap::check_ct_logs_at_safepoint() { 474 void G1CollectedHeap::check_ct_logs_at_safepoint() {
480 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set(); 475 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
481 CardTableModRefBS* ct_bs = (CardTableModRefBS*)barrier_set(); 476 CardTableModRefBS* ct_bs = g1_barrier_set();
482 477
483 // Count the dirty cards at the start. 478 // Count the dirty cards at the start.
484 CountNonCleanMemRegionClosure count1(this); 479 CountNonCleanMemRegionClosure count1(this);
485 ct_bs->mod_card_iterate(&count1); 480 ct_bs->mod_card_iterate(&count1);
486 int orig_count = count1.n(); 481 int orig_count = count1.n();
1203 return false; 1198 return false;
1204 } 1199 }
1205 }; 1200 };
1206 1201
1207 void G1CollectedHeap::clear_rsets_post_compaction() { 1202 void G1CollectedHeap::clear_rsets_post_compaction() {
1208 PostMCRemSetClearClosure rs_clear(this, mr_bs()); 1203 PostMCRemSetClearClosure rs_clear(this, g1_barrier_set());
1209 heap_region_iterate(&rs_clear); 1204 heap_region_iterate(&rs_clear);
1210 } 1205 }
1211 1206
1212 class RebuildRSOutOfRegionClosure: public HeapRegionClosure { 1207 class RebuildRSOutOfRegionClosure: public HeapRegionClosure {
1213 G1CollectedHeap* _g1h; 1208 G1CollectedHeap* _g1h;
1775 // Tell the hot card cache about the update 1770 // Tell the hot card cache about the update
1776 _cg1r->hot_card_cache()->resize_card_counts(capacity()); 1771 _cg1r->hot_card_cache()->resize_card_counts(capacity());
1777 } 1772 }
1778 1773
1779 bool G1CollectedHeap::expand(size_t expand_bytes) { 1774 bool G1CollectedHeap::expand(size_t expand_bytes) {
1780 size_t old_mem_size = _g1_storage.committed_size();
1781 size_t aligned_expand_bytes = ReservedSpace::page_align_size_up(expand_bytes); 1775 size_t aligned_expand_bytes = ReservedSpace::page_align_size_up(expand_bytes);
1782 aligned_expand_bytes = align_size_up(aligned_expand_bytes, 1776 aligned_expand_bytes = align_size_up(aligned_expand_bytes,
1783 HeapRegion::GrainBytes); 1777 HeapRegion::GrainBytes);
1784 ergo_verbose2(ErgoHeapSizing, 1778 ergo_verbose2(ErgoHeapSizing,
1785 "expand the heap", 1779 "expand the heap",
1786 ergo_format_byte("requested expansion amount") 1780 ergo_format_byte("requested expansion amount")
1787 ergo_format_byte("attempted expansion amount"), 1781 ergo_format_byte("attempted expansion amount"),
1788 expand_bytes, aligned_expand_bytes); 1782 expand_bytes, aligned_expand_bytes);
1783
1784 if (_g1_storage.uncommitted_size() == 0) {
1785 ergo_verbose0(ErgoHeapSizing,
1786 "did not expand the heap",
1787 ergo_format_reason("heap already fully expanded"));
1788 return false;
1789 }
1789 1790
1790 // First commit the memory. 1791 // First commit the memory.
1791 HeapWord* old_end = (HeapWord*) _g1_storage.high(); 1792 HeapWord* old_end = (HeapWord*) _g1_storage.high();
1792 bool successful = _g1_storage.expand_by(aligned_expand_bytes); 1793 bool successful = _g1_storage.expand_by(aligned_expand_bytes);
1793 if (successful) { 1794 if (successful) {
1843 } 1844 }
1844 return successful; 1845 return successful;
1845 } 1846 }
1846 1847
1847 void G1CollectedHeap::shrink_helper(size_t shrink_bytes) { 1848 void G1CollectedHeap::shrink_helper(size_t shrink_bytes) {
1848 size_t old_mem_size = _g1_storage.committed_size();
1849 size_t aligned_shrink_bytes = 1849 size_t aligned_shrink_bytes =
1850 ReservedSpace::page_align_size_down(shrink_bytes); 1850 ReservedSpace::page_align_size_down(shrink_bytes);
1851 aligned_shrink_bytes = align_size_down(aligned_shrink_bytes, 1851 aligned_shrink_bytes = align_size_down(aligned_shrink_bytes,
1852 HeapRegion::GrainBytes); 1852 HeapRegion::GrainBytes);
1853 uint num_regions_to_remove = (uint)(shrink_bytes / HeapRegion::GrainBytes); 1853 uint num_regions_to_remove = (uint)(shrink_bytes / HeapRegion::GrainBytes);
2043 _expansion_regions = (uint) (max_byte_size / HeapRegion::GrainBytes); 2043 _expansion_regions = (uint) (max_byte_size / HeapRegion::GrainBytes);
2044 2044
2045 // Create the gen rem set (and barrier set) for the entire reserved region. 2045 // Create the gen rem set (and barrier set) for the entire reserved region.
2046 _rem_set = collector_policy()->create_rem_set(_reserved, 2); 2046 _rem_set = collector_policy()->create_rem_set(_reserved, 2);
2047 set_barrier_set(rem_set()->bs()); 2047 set_barrier_set(rem_set()->bs());
2048 if (barrier_set()->is_a(BarrierSet::ModRef)) { 2048 if (!barrier_set()->is_a(BarrierSet::G1SATBCTLogging)) {
2049 _mr_bs = (ModRefBarrierSet*)_barrier_set; 2049 vm_exit_during_initialization("G1 requires a G1SATBLoggingCardTableModRefBS");
2050 } else {
2051 vm_exit_during_initialization("G1 requires a mod ref bs.");
2052 return JNI_ENOMEM; 2050 return JNI_ENOMEM;
2053 } 2051 }
2054 2052
2055 // Also create a G1 rem set. 2053 // Also create a G1 rem set.
2056 if (mr_bs()->is_a(BarrierSet::CardTableModRef)) { 2054 _g1_rem_set = new G1RemSet(this, g1_barrier_set());
2057 _g1_rem_set = new G1RemSet(this, (CardTableModRefBS*)mr_bs());
2058 } else {
2059 vm_exit_during_initialization("G1 requires a cardtable mod ref bs.");
2060 return JNI_ENOMEM;
2061 }
2062 2055
2063 // Carve out the G1 part of the heap. 2056 // Carve out the G1 part of the heap.
2064 2057
2065 ReservedSpace g1_rs = heap_rs.first_part(max_byte_size); 2058 ReservedSpace g1_rs = heap_rs.first_part(max_byte_size);
2066 _g1_reserved = MemRegion((HeapWord*)g1_rs.base(), 2059 _g1_reserved = MemRegion((HeapWord*)g1_rs.base(),
3679 void G1CollectedHeap::gc_prologue(bool full /* Ignored */) { 3672 void G1CollectedHeap::gc_prologue(bool full /* Ignored */) {
3680 // always_do_update_barrier = false; 3673 // always_do_update_barrier = false;
3681 assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer"); 3674 assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer");
3682 // Fill TLAB's and such 3675 // Fill TLAB's and such
3683 ensure_parsability(true); 3676 ensure_parsability(true);
3677
3678 if (G1SummarizeRSetStats && (G1SummarizeRSetStatsPeriod > 0) &&
3679 (total_collections() % G1SummarizeRSetStatsPeriod == 0)) {
3680 g1_rem_set()->print_periodic_summary_info("Before GC RS summary");
3681 }
3684 } 3682 }
3685 3683
3686 void G1CollectedHeap::gc_epilogue(bool full /* Ignored */) { 3684 void G1CollectedHeap::gc_epilogue(bool full /* Ignored */) {
3687 3685
3688 if (G1SummarizeRSetStats && 3686 if (G1SummarizeRSetStats &&
3689 (G1SummarizeRSetStatsPeriod > 0) && 3687 (G1SummarizeRSetStatsPeriod > 0) &&
3690 // we are at the end of the GC. Total collections has already been increased. 3688 // we are at the end of the GC. Total collections has already been increased.
3691 ((total_collections() - 1) % G1SummarizeRSetStatsPeriod == 0)) { 3689 ((total_collections() - 1) % G1SummarizeRSetStatsPeriod == 0)) {
3692 g1_rem_set()->print_periodic_summary_info(); 3690 g1_rem_set()->print_periodic_summary_info("After GC RS summary");
3693 } 3691 }
3694 3692
3695 // FIXME: what is this about? 3693 // FIXME: what is this about?
3696 // I'm ignoring the "fill_newgen()" call if "alloc_event_enabled" 3694 // I'm ignoring the "fill_newgen()" call if "alloc_event_enabled"
3697 // is set. 3695 // is set.
4548 4546
4549 G1ParScanThreadState::G1ParScanThreadState(G1CollectedHeap* g1h, uint queue_num) 4547 G1ParScanThreadState::G1ParScanThreadState(G1CollectedHeap* g1h, uint queue_num)
4550 : _g1h(g1h), 4548 : _g1h(g1h),
4551 _refs(g1h->task_queue(queue_num)), 4549 _refs(g1h->task_queue(queue_num)),
4552 _dcq(&g1h->dirty_card_queue_set()), 4550 _dcq(&g1h->dirty_card_queue_set()),
4553 _ct_bs((CardTableModRefBS*)_g1h->barrier_set()), 4551 _ct_bs(g1h->g1_barrier_set()),
4554 _g1_rem(g1h->g1_rem_set()), 4552 _g1_rem(g1h->g1_rem_set()),
4555 _hash_seed(17), _queue_num(queue_num), 4553 _hash_seed(17), _queue_num(queue_num),
4556 _term_attempts(0), 4554 _term_attempts(0),
4557 _surviving_alloc_buffer(g1h->desired_plab_sz(GCAllocForSurvived)), 4555 _surviving_alloc_buffer(g1h->desired_plab_sz(GCAllocForSurvived)),
4558 _tenured_alloc_buffer(g1h->desired_plab_sz(GCAllocForTenured)), 4556 _tenured_alloc_buffer(g1h->desired_plab_sz(GCAllocForTenured)),
5977 _humongous_set.update_from_proxy(humongous_proxy_set); 5975 _humongous_set.update_from_proxy(humongous_proxy_set);
5978 } 5976 }
5979 } 5977 }
5980 5978
5981 class G1ParCleanupCTTask : public AbstractGangTask { 5979 class G1ParCleanupCTTask : public AbstractGangTask {
5982 CardTableModRefBS* _ct_bs; 5980 G1SATBCardTableModRefBS* _ct_bs;
5983 G1CollectedHeap* _g1h; 5981 G1CollectedHeap* _g1h;
5984 HeapRegion* volatile _su_head; 5982 HeapRegion* volatile _su_head;
5985 public: 5983 public:
5986 G1ParCleanupCTTask(CardTableModRefBS* ct_bs, 5984 G1ParCleanupCTTask(G1SATBCardTableModRefBS* ct_bs,
5987 G1CollectedHeap* g1h) : 5985 G1CollectedHeap* g1h) :
5988 AbstractGangTask("G1 Par Cleanup CT Task"), 5986 AbstractGangTask("G1 Par Cleanup CT Task"),
5989 _ct_bs(ct_bs), _g1h(g1h) { } 5987 _ct_bs(ct_bs), _g1h(g1h) { }
5990 5988
5991 void work(uint worker_id) { 5989 void work(uint worker_id) {
6004 }; 6002 };
6005 6003
6006 #ifndef PRODUCT 6004 #ifndef PRODUCT
6007 class G1VerifyCardTableCleanup: public HeapRegionClosure { 6005 class G1VerifyCardTableCleanup: public HeapRegionClosure {
6008 G1CollectedHeap* _g1h; 6006 G1CollectedHeap* _g1h;
6009 CardTableModRefBS* _ct_bs; 6007 G1SATBCardTableModRefBS* _ct_bs;
6010 public: 6008 public:
6011 G1VerifyCardTableCleanup(G1CollectedHeap* g1h, CardTableModRefBS* ct_bs) 6009 G1VerifyCardTableCleanup(G1CollectedHeap* g1h, G1SATBCardTableModRefBS* ct_bs)
6012 : _g1h(g1h), _ct_bs(ct_bs) { } 6010 : _g1h(g1h), _ct_bs(ct_bs) { }
6013 virtual bool doHeapRegion(HeapRegion* r) { 6011 virtual bool doHeapRegion(HeapRegion* r) {
6014 if (r->is_survivor()) { 6012 if (r->is_survivor()) {
6015 _g1h->verify_dirty_region(r); 6013 _g1h->verify_dirty_region(r);
6016 } else { 6014 } else {
6020 } 6018 }
6021 }; 6019 };
6022 6020
6023 void G1CollectedHeap::verify_not_dirty_region(HeapRegion* hr) { 6021 void G1CollectedHeap::verify_not_dirty_region(HeapRegion* hr) {
6024 // All of the region should be clean. 6022 // All of the region should be clean.
6025 CardTableModRefBS* ct_bs = (CardTableModRefBS*)barrier_set(); 6023 G1SATBCardTableModRefBS* ct_bs = g1_barrier_set();
6026 MemRegion mr(hr->bottom(), hr->end()); 6024 MemRegion mr(hr->bottom(), hr->end());
6027 ct_bs->verify_not_dirty_region(mr); 6025 ct_bs->verify_not_dirty_region(mr);
6028 } 6026 }
6029 6027
6030 void G1CollectedHeap::verify_dirty_region(HeapRegion* hr) { 6028 void G1CollectedHeap::verify_dirty_region(HeapRegion* hr) {
6033 // retires each region and replaces it with a new one will do a 6031 // retires each region and replaces it with a new one will do a
6034 // maximal allocation to fill in [pre_dummy_top(),end()] but will 6032 // maximal allocation to fill in [pre_dummy_top(),end()] but will
6035 // not dirty that area (one less thing to have to do while holding 6033 // not dirty that area (one less thing to have to do while holding
6036 // a lock). So we can only verify that [bottom(),pre_dummy_top()] 6034 // a lock). So we can only verify that [bottom(),pre_dummy_top()]
6037 // is dirty. 6035 // is dirty.
6038 CardTableModRefBS* ct_bs = (CardTableModRefBS*) barrier_set(); 6036 G1SATBCardTableModRefBS* ct_bs = g1_barrier_set();
6039 MemRegion mr(hr->bottom(), hr->pre_dummy_top()); 6037 MemRegion mr(hr->bottom(), hr->pre_dummy_top());
6040 ct_bs->verify_dirty_region(mr); 6038 ct_bs->verify_dirty_region(mr);
6041 } 6039 }
6042 6040
6043 void G1CollectedHeap::verify_dirty_young_list(HeapRegion* head) { 6041 void G1CollectedHeap::verify_dirty_young_list(HeapRegion* head) {
6044 CardTableModRefBS* ct_bs = (CardTableModRefBS*) barrier_set(); 6042 G1SATBCardTableModRefBS* ct_bs = g1_barrier_set();
6045 for (HeapRegion* hr = head; hr != NULL; hr = hr->get_next_young_region()) { 6043 for (HeapRegion* hr = head; hr != NULL; hr = hr->get_next_young_region()) {
6046 verify_dirty_region(hr); 6044 verify_dirty_region(hr);
6047 } 6045 }
6048 } 6046 }
6049 6047
6051 verify_dirty_young_list(_young_list->first_region()); 6049 verify_dirty_young_list(_young_list->first_region());
6052 } 6050 }
6053 #endif 6051 #endif
6054 6052
6055 void G1CollectedHeap::cleanUpCardTable() { 6053 void G1CollectedHeap::cleanUpCardTable() {
6056 CardTableModRefBS* ct_bs = (CardTableModRefBS*) (barrier_set()); 6054 G1SATBCardTableModRefBS* ct_bs = g1_barrier_set();
6057 double start = os::elapsedTime(); 6055 double start = os::elapsedTime();
6058 6056
6059 { 6057 {
6060 // Iterate over the dirty cards region list. 6058 // Iterate over the dirty cards region list.
6061 G1ParCleanupCTTask cleanup_task(ct_bs, this); 6059 G1ParCleanupCTTask cleanup_task(ct_bs, this);