818 } |
818 } |
819 return false; |
819 return false; |
820 } |
820 } |
821 }; |
821 }; |
822 |
822 |
|
823 class RebuildRSOutOfRegionClosure: public HeapRegionClosure { |
|
824 G1CollectedHeap* _g1h; |
|
825 UpdateRSOopClosure _cl; |
|
826 int _worker_i; |
|
827 public: |
|
828 RebuildRSOutOfRegionClosure(G1CollectedHeap* g1, int worker_i = 0) : |
|
829 _cl(g1->g1_rem_set()->as_HRInto_G1RemSet(), worker_i), |
|
830 _worker_i(worker_i), |
|
831 _g1h(g1) |
|
832 { } |
|
833 bool doHeapRegion(HeapRegion* r) { |
|
834 if (!r->continuesHumongous()) { |
|
835 _cl.set_from(r); |
|
836 r->oop_iterate(&_cl); |
|
837 } |
|
838 return false; |
|
839 } |
|
840 }; |
|
841 |
|
842 class ParRebuildRSTask: public AbstractGangTask { |
|
843 G1CollectedHeap* _g1; |
|
844 public: |
|
845 ParRebuildRSTask(G1CollectedHeap* g1) |
|
846 : AbstractGangTask("ParRebuildRSTask"), |
|
847 _g1(g1) |
|
848 { } |
|
849 |
|
850 void work(int i) { |
|
851 RebuildRSOutOfRegionClosure rebuild_rs(_g1, i); |
|
852 _g1->heap_region_par_iterate_chunked(&rebuild_rs, i, |
|
853 HeapRegion::RebuildRSClaimValue); |
|
854 } |
|
855 }; |
|
856 |
823 void G1CollectedHeap::do_collection(bool full, bool clear_all_soft_refs, |
857 void G1CollectedHeap::do_collection(bool full, bool clear_all_soft_refs, |
824 size_t word_size) { |
858 size_t word_size) { |
825 ResourceMark rm; |
859 ResourceMark rm; |
826 |
860 |
827 if (full && DisableExplicitGC) { |
861 if (full && DisableExplicitGC) { |
924 } |
958 } |
925 NOT_PRODUCT(ref_processor()->verify_no_references_recorded()); |
959 NOT_PRODUCT(ref_processor()->verify_no_references_recorded()); |
926 |
960 |
927 reset_gc_time_stamp(); |
961 reset_gc_time_stamp(); |
928 // Since everything potentially moved, we will clear all remembered |
962 // Since everything potentially moved, we will clear all remembered |
929 // sets, and clear all cards. Later we will also cards in the used |
963 // sets, and clear all cards. Later we will rebuild remebered |
930 // portion of the heap after the resizing (which could be a shrinking.) |
964 // sets. We will also reset the GC time stamps of the regions. |
931 // We will also reset the GC time stamps of the regions. |
|
932 PostMCRemSetClearClosure rs_clear(mr_bs()); |
965 PostMCRemSetClearClosure rs_clear(mr_bs()); |
933 heap_region_iterate(&rs_clear); |
966 heap_region_iterate(&rs_clear); |
934 |
967 |
935 // Resize the heap if necessary. |
968 // Resize the heap if necessary. |
936 resize_if_necessary_after_full_collection(full ? 0 : word_size); |
969 resize_if_necessary_after_full_collection(full ? 0 : word_size); |
937 |
970 |
938 // Since everything potentially moved, we will clear all remembered |
|
939 // sets, but also dirty all cards corresponding to used regions. |
|
940 PostMCRemSetInvalidateClosure rs_invalidate(mr_bs()); |
|
941 heap_region_iterate(&rs_invalidate); |
|
942 if (_cg1r->use_cache()) { |
971 if (_cg1r->use_cache()) { |
943 _cg1r->clear_and_record_card_counts(); |
972 _cg1r->clear_and_record_card_counts(); |
944 _cg1r->clear_hot_cache(); |
973 _cg1r->clear_hot_cache(); |
|
974 } |
|
975 |
|
976 // Rebuild remembered sets of all regions. |
|
977 if (ParallelGCThreads > 0) { |
|
978 ParRebuildRSTask rebuild_rs_task(this); |
|
979 assert(check_heap_region_claim_values( |
|
980 HeapRegion::InitialClaimValue), "sanity check"); |
|
981 set_par_threads(workers()->total_workers()); |
|
982 workers()->run_task(&rebuild_rs_task); |
|
983 set_par_threads(0); |
|
984 assert(check_heap_region_claim_values( |
|
985 HeapRegion::RebuildRSClaimValue), "sanity check"); |
|
986 reset_heap_region_claim_values(); |
|
987 } else { |
|
988 RebuildRSOutOfRegionClosure rebuild_rs(this); |
|
989 heap_region_iterate(&rebuild_rs); |
945 } |
990 } |
946 |
991 |
947 if (PrintGC) { |
992 if (PrintGC) { |
948 print_size_transition(gclog_or_tty, g1h_prev_used, used(), capacity()); |
993 print_size_transition(gclog_or_tty, g1h_prev_used, used(), capacity()); |
949 } |
994 } |