1.1 --- a/src/share/vm/gc_implementation/g1/concurrentMark.cpp Thu Mar 06 11:11:04 2014 +0100 1.2 +++ b/src/share/vm/gc_implementation/g1/concurrentMark.cpp Fri Mar 14 10:15:46 2014 +0100 1.3 @@ -1809,8 +1809,8 @@ 1.4 uint _regions_claimed; 1.5 size_t _freed_bytes; 1.6 FreeRegionList* _local_cleanup_list; 1.7 - OldRegionSet* _old_proxy_set; 1.8 - HumongousRegionSet* _humongous_proxy_set; 1.9 + HeapRegionSetCount _old_regions_removed; 1.10 + HeapRegionSetCount _humongous_regions_removed; 1.11 HRRSCleanupTask* _hrrs_cleanup_task; 1.12 double _claimed_region_time; 1.13 double _max_region_time; 1.14 @@ -1819,19 +1819,19 @@ 1.15 G1NoteEndOfConcMarkClosure(G1CollectedHeap* g1, 1.16 int worker_num, 1.17 FreeRegionList* local_cleanup_list, 1.18 - OldRegionSet* old_proxy_set, 1.19 - HumongousRegionSet* humongous_proxy_set, 1.20 HRRSCleanupTask* hrrs_cleanup_task) : 1.21 _g1(g1), _worker_num(worker_num), 1.22 _max_live_bytes(0), _regions_claimed(0), 1.23 _freed_bytes(0), 1.24 _claimed_region_time(0.0), _max_region_time(0.0), 1.25 _local_cleanup_list(local_cleanup_list), 1.26 - _old_proxy_set(old_proxy_set), 1.27 - _humongous_proxy_set(humongous_proxy_set), 1.28 + _old_regions_removed(), 1.29 + _humongous_regions_removed(), 1.30 _hrrs_cleanup_task(hrrs_cleanup_task) { } 1.31 1.32 size_t freed_bytes() { return _freed_bytes; } 1.33 + const HeapRegionSetCount& old_regions_removed() { return _old_regions_removed; } 1.34 + const HeapRegionSetCount& humongous_regions_removed() { return _humongous_regions_removed; } 1.35 1.36 bool doHeapRegion(HeapRegion *hr) { 1.37 if (hr->continuesHumongous()) { 1.38 @@ -1844,13 +1844,22 @@ 1.39 _regions_claimed++; 1.40 hr->note_end_of_marking(); 1.41 _max_live_bytes += hr->max_live_bytes(); 1.42 - _g1->free_region_if_empty(hr, 1.43 - &_freed_bytes, 1.44 - _local_cleanup_list, 1.45 - _old_proxy_set, 1.46 - _humongous_proxy_set, 1.47 - _hrrs_cleanup_task, 1.48 - true /* par */); 1.49 + 1.50 + if (hr->used() > 0 && hr->max_live_bytes() == 0 && !hr->is_young()) { 1.51 + _freed_bytes += hr->used(); 1.52 + hr->set_containing_set(NULL); 1.53 + if (hr->isHumongous()) { 1.54 + assert(hr->startsHumongous(), "we should only see starts humongous"); 1.55 + _humongous_regions_removed.increment(1u, hr->capacity()); 1.56 + _g1->free_humongous_region(hr, _local_cleanup_list, true); 1.57 + } else { 1.58 + _old_regions_removed.increment(1u, hr->capacity()); 1.59 + _g1->free_region(hr, _local_cleanup_list, true); 1.60 + } 1.61 + } else { 1.62 + hr->rem_set()->do_cleanup_work(_hrrs_cleanup_task); 1.63 + } 1.64 + 1.65 double region_time = (os::elapsedTime() - start); 1.66 _claimed_region_time += region_time; 1.67 if (region_time > _max_region_time) { 1.68 @@ -1883,12 +1892,8 @@ 1.69 void work(uint worker_id) { 1.70 double start = os::elapsedTime(); 1.71 FreeRegionList local_cleanup_list("Local Cleanup List"); 1.72 - OldRegionSet old_proxy_set("Local Cleanup Old Proxy Set"); 1.73 - HumongousRegionSet humongous_proxy_set("Local Cleanup Humongous Proxy Set"); 1.74 HRRSCleanupTask hrrs_cleanup_task; 1.75 G1NoteEndOfConcMarkClosure g1_note_end(_g1h, worker_id, &local_cleanup_list, 1.76 - &old_proxy_set, 1.77 - &humongous_proxy_set, 1.78 &hrrs_cleanup_task); 1.79 if (G1CollectedHeap::use_parallel_gc_threads()) { 1.80 _g1h->heap_region_par_iterate_chunked(&g1_note_end, worker_id, 1.81 @@ -1900,13 +1905,10 @@ 1.82 assert(g1_note_end.complete(), "Shouldn't have yielded!"); 1.83 1.84 // Now update the lists 1.85 - _g1h->update_sets_after_freeing_regions(g1_note_end.freed_bytes(), 1.86 - NULL /* free_list */, 1.87 - &old_proxy_set, 1.88 - &humongous_proxy_set, 1.89 - true /* par */); 1.90 + _g1h->remove_from_old_sets(g1_note_end.old_regions_removed(), g1_note_end.humongous_regions_removed()); 1.91 { 1.92 MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag); 1.93 + _g1h->decrement_summary_bytes(g1_note_end.freed_bytes()); 1.94 _max_live_bytes += g1_note_end.max_live_bytes(); 1.95 _freed_bytes += g1_note_end.freed_bytes(); 1.96 1.97 @@ -1920,7 +1922,7 @@ 1.98 1.99 G1HRPrinter* hr_printer = _g1h->hr_printer(); 1.100 if (hr_printer->is_active()) { 1.101 - HeapRegionLinkedListIterator iter(&local_cleanup_list); 1.102 + FreeRegionListIterator iter(&local_cleanup_list); 1.103 while (iter.more_available()) { 1.104 HeapRegion* hr = iter.get_next(); 1.105 hr_printer->cleanup(hr); 1.106 @@ -1971,7 +1973,6 @@ 1.107 return; 1.108 } 1.109 1.110 - HRSPhaseSetter x(HRSPhaseCleanup); 1.111 g1h->verify_region_sets_optional(); 1.112 1.113 if (VerifyDuringGC) { 1.114 @@ -2144,7 +2145,7 @@ 1.115 1.116 G1CollectedHeap* g1h = G1CollectedHeap::heap(); 1.117 1.118 - _cleanup_list.verify_optional(); 1.119 + _cleanup_list.verify_list(); 1.120 FreeRegionList tmp_free_list("Tmp Free List"); 1.121 1.122 if (G1ConcRegionFreeingVerbose) {