Mercurial > hg > graal-jvmci-8
comparison src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp @ 4013:074f0252cc13
7088680: G1: Cleanup in the G1CollectorPolicy class
Summary: Removed unused fields and methods, removed the G1CollectoryPolicy_BestRegionsFirst class and folded its functionality into the G1CollectorPolicy class.
Reviewed-by: ysr, brutisso, jcoomes
author | tonyp |
---|---|
date | Fri, 14 Oct 2011 11:12:24 -0400 |
parents | 65a8ff39a6da |
children | c6a6e936dc68 |
comparison
equal
deleted
inserted
replaced
4012:ec4b032a4977 | 4013:074f0252cc13 |
---|---|
223 | 223 |
224 _recent_CS_bytes_used_before(new TruncatedSeq(NumPrevPausesForHeuristics)), | 224 _recent_CS_bytes_used_before(new TruncatedSeq(NumPrevPausesForHeuristics)), |
225 _recent_CS_bytes_surviving(new TruncatedSeq(NumPrevPausesForHeuristics)), | 225 _recent_CS_bytes_surviving(new TruncatedSeq(NumPrevPausesForHeuristics)), |
226 | 226 |
227 _recent_avg_pause_time_ratio(0.0), | 227 _recent_avg_pause_time_ratio(0.0), |
228 _num_markings(0), | |
229 _n_marks(0), | |
230 _n_pauses_at_mark_end(0), | |
231 | 228 |
232 _all_full_gc_times_ms(new NumberSeq()), | 229 _all_full_gc_times_ms(new NumberSeq()), |
233 | 230 |
234 // G1PausesBtwnConcMark defaults to -1 | 231 // G1PausesBtwnConcMark defaults to -1 |
235 // so the hack is to do the cast QQQ FIXME | 232 // so the hack is to do the cast QQQ FIXME |
236 _pauses_btwn_concurrent_mark((size_t)G1PausesBtwnConcMark), | 233 _pauses_btwn_concurrent_mark((size_t)G1PausesBtwnConcMark), |
237 _n_marks_since_last_pause(0), | |
238 _initiate_conc_mark_if_possible(false), | 234 _initiate_conc_mark_if_possible(false), |
239 _during_initial_mark_pause(false), | 235 _during_initial_mark_pause(false), |
240 _should_revert_to_full_young_gcs(false), | 236 _should_revert_to_full_young_gcs(false), |
241 _last_full_young_gc(false), | 237 _last_full_young_gc(false), |
242 | 238 |
438 // This will be set when the heap is expanded | 434 // This will be set when the heap is expanded |
439 // for the first time during initialization. | 435 // for the first time during initialization. |
440 _reserve_regions = 0; | 436 _reserve_regions = 0; |
441 | 437 |
442 initialize_all(); | 438 initialize_all(); |
439 _collectionSetChooser = new CollectionSetChooser(); | |
443 } | 440 } |
444 | 441 |
445 // Increment "i", mod "len" | 442 // Increment "i", mod "len" |
446 static void inc_mod(int& i, int len) { | 443 static void inc_mod(int& i, int len) { |
447 i++; if (i == len) i = 0; | 444 i++; if (i == len) i = 0; |
919 | 916 |
920 _free_regions_at_end_of_collection = _g1->free_regions(); | 917 _free_regions_at_end_of_collection = _g1->free_regions(); |
921 // Reset survivors SurvRateGroup. | 918 // Reset survivors SurvRateGroup. |
922 _survivor_surv_rate_group->reset(); | 919 _survivor_surv_rate_group->reset(); |
923 update_young_list_target_length(); | 920 update_young_list_target_length(); |
921 _collectionSetChooser->updateAfterFullCollection(); | |
924 } | 922 } |
925 | 923 |
926 void G1CollectorPolicy::record_stop_world_start() { | 924 void G1CollectorPolicy::record_stop_world_start() { |
927 _stop_world_start = os::elapsedTime(); | 925 _stop_world_start = os::elapsedTime(); |
928 } | 926 } |
1027 | 1025 |
1028 void G1CollectorPolicy::record_concurrent_mark_cleanup_start() { | 1026 void G1CollectorPolicy::record_concurrent_mark_cleanup_start() { |
1029 _mark_cleanup_start_sec = os::elapsedTime(); | 1027 _mark_cleanup_start_sec = os::elapsedTime(); |
1030 } | 1028 } |
1031 | 1029 |
1032 void | 1030 void G1CollectorPolicy::record_concurrent_mark_cleanup_completed() { |
1033 G1CollectorPolicy::record_concurrent_mark_cleanup_end(size_t freed_bytes, | |
1034 size_t max_live_bytes) { | |
1035 record_concurrent_mark_cleanup_end_work1(freed_bytes, max_live_bytes); | |
1036 record_concurrent_mark_cleanup_end_work2(); | |
1037 } | |
1038 | |
1039 void | |
1040 G1CollectorPolicy:: | |
1041 record_concurrent_mark_cleanup_end_work1(size_t freed_bytes, | |
1042 size_t max_live_bytes) { | |
1043 if (_n_marks < 2) { | |
1044 _n_marks++; | |
1045 } | |
1046 } | |
1047 | |
1048 // The important thing about this is that it includes "os::elapsedTime". | |
1049 void G1CollectorPolicy::record_concurrent_mark_cleanup_end_work2() { | |
1050 double end_time_sec = os::elapsedTime(); | |
1051 double elapsed_time_ms = (end_time_sec - _mark_cleanup_start_sec)*1000.0; | |
1052 _concurrent_mark_cleanup_times_ms->add(elapsed_time_ms); | |
1053 _cur_mark_stop_world_time_ms += elapsed_time_ms; | |
1054 _prev_collection_pause_end_ms += elapsed_time_ms; | |
1055 | |
1056 _mmu_tracker->add_pause(_mark_cleanup_start_sec, end_time_sec, true); | |
1057 | |
1058 _num_markings++; | |
1059 _n_pauses_at_mark_end = _n_pauses; | |
1060 _n_marks_since_last_pause++; | |
1061 } | |
1062 | |
1063 void | |
1064 G1CollectorPolicy::record_concurrent_mark_cleanup_completed() { | |
1065 _should_revert_to_full_young_gcs = false; | 1031 _should_revert_to_full_young_gcs = false; |
1066 _last_full_young_gc = true; | 1032 _last_full_young_gc = true; |
1067 _in_marking_window = false; | 1033 _in_marking_window = false; |
1068 } | 1034 } |
1069 | 1035 |
1499 if (update_stats) { | 1465 if (update_stats) { |
1500 summary->record_total_time_ms(elapsed_ms); | 1466 summary->record_total_time_ms(elapsed_ms); |
1501 summary->record_other_time_ms(other_time_ms); | 1467 summary->record_other_time_ms(other_time_ms); |
1502 } | 1468 } |
1503 for (int i = 0; i < _aux_num; ++i) | 1469 for (int i = 0; i < _aux_num; ++i) |
1504 if (_cur_aux_times_set[i]) | 1470 if (_cur_aux_times_set[i]) { |
1505 _all_aux_times_ms[i].add(_cur_aux_times_ms[i]); | 1471 _all_aux_times_ms[i].add(_cur_aux_times_ms[i]); |
1506 | 1472 } |
1507 // Reset marks-between-pauses counter. | |
1508 _n_marks_since_last_pause = 0; | |
1509 | 1473 |
1510 // Update the efficiency-since-mark vars. | 1474 // Update the efficiency-since-mark vars. |
1511 double proc_ms = elapsed_ms * (double) _parallel_gc_threads; | 1475 double proc_ms = elapsed_ms * (double) _parallel_gc_threads; |
1512 if (elapsed_ms < MIN_TIMER_GRANULARITY) { | 1476 if (elapsed_ms < MIN_TIMER_GRANULARITY) { |
1513 // This usually happens due to the timer not having the required | 1477 // This usually happens due to the timer not having the required |
1727 | 1691 |
1728 // Note that _mmu_tracker->max_gc_time() returns the time in seconds. | 1692 // Note that _mmu_tracker->max_gc_time() returns the time in seconds. |
1729 double update_rs_time_goal_ms = _mmu_tracker->max_gc_time() * MILLIUNITS * G1RSetUpdatingPauseTimePercent / 100.0; | 1693 double update_rs_time_goal_ms = _mmu_tracker->max_gc_time() * MILLIUNITS * G1RSetUpdatingPauseTimePercent / 100.0; |
1730 adjust_concurrent_refinement(update_rs_time, update_rs_processed_buffers, update_rs_time_goal_ms); | 1694 adjust_concurrent_refinement(update_rs_time, update_rs_processed_buffers, update_rs_time_goal_ms); |
1731 // </NEW PREDICTION> | 1695 // </NEW PREDICTION> |
1696 | |
1697 assert(assertMarkedBytesDataOK(), "Marked regions not OK at pause end."); | |
1732 } | 1698 } |
1733 | 1699 |
1734 #define EXT_SIZE_FORMAT "%d%s" | 1700 #define EXT_SIZE_FORMAT "%d%s" |
1735 #define EXT_SIZE_PARAMS(bytes) \ | 1701 #define EXT_SIZE_PARAMS(bytes) \ |
1736 byte_size_in_proper_unit((bytes)), \ | 1702 byte_size_in_proper_unit((bytes)), \ |
2152 | 2118 |
2153 return expand_bytes; | 2119 return expand_bytes; |
2154 } else { | 2120 } else { |
2155 return 0; | 2121 return 0; |
2156 } | 2122 } |
2157 } | |
2158 | |
2159 void G1CollectorPolicy::note_start_of_mark_thread() { | |
2160 _mark_thread_startup_sec = os::elapsedTime(); | |
2161 } | 2123 } |
2162 | 2124 |
2163 class CountCSClosure: public HeapRegionClosure { | 2125 class CountCSClosure: public HeapRegionClosure { |
2164 G1CollectorPolicy* _g1_policy; | 2126 G1CollectorPolicy* _g1_policy; |
2165 public: | 2127 public: |
2444 } | 2406 } |
2445 return false; | 2407 return false; |
2446 } | 2408 } |
2447 }; | 2409 }; |
2448 | 2410 |
2449 bool G1CollectorPolicy_BestRegionsFirst::assertMarkedBytesDataOK() { | 2411 bool G1CollectorPolicy::assertMarkedBytesDataOK() { |
2450 HRSortIndexIsOKClosure cl(_collectionSetChooser); | 2412 HRSortIndexIsOKClosure cl(_collectionSetChooser); |
2451 _g1->heap_region_iterate(&cl); | 2413 _g1->heap_region_iterate(&cl); |
2452 return true; | 2414 return true; |
2453 } | 2415 } |
2454 #endif | 2416 #endif |
2530 ergo_format_reason("concurrent cycle already in progress")); | 2492 ergo_format_reason("concurrent cycle already in progress")); |
2531 } | 2493 } |
2532 } | 2494 } |
2533 } | 2495 } |
2534 | 2496 |
2535 void | |
2536 G1CollectorPolicy_BestRegionsFirst:: | |
2537 record_collection_pause_start(double start_time_sec, size_t start_used) { | |
2538 G1CollectorPolicy::record_collection_pause_start(start_time_sec, start_used); | |
2539 } | |
2540 | |
2541 class KnownGarbageClosure: public HeapRegionClosure { | 2497 class KnownGarbageClosure: public HeapRegionClosure { |
2542 CollectionSetChooser* _hrSorted; | 2498 CollectionSetChooser* _hrSorted; |
2543 | 2499 |
2544 public: | 2500 public: |
2545 KnownGarbageClosure(CollectionSetChooser* hrSorted) : | 2501 KnownGarbageClosure(CollectionSetChooser* hrSorted) : |
2643 } | 2599 } |
2644 } | 2600 } |
2645 }; | 2601 }; |
2646 | 2602 |
2647 void | 2603 void |
2648 G1CollectorPolicy_BestRegionsFirst:: | 2604 G1CollectorPolicy::record_concurrent_mark_cleanup_end() { |
2649 record_concurrent_mark_cleanup_end(size_t freed_bytes, | 2605 double start_sec; |
2650 size_t max_live_bytes) { | 2606 if (G1PrintParCleanupStats) { |
2651 double start; | 2607 start_sec = os::elapsedTime(); |
2652 if (G1PrintParCleanupStats) start = os::elapsedTime(); | 2608 } |
2653 record_concurrent_mark_cleanup_end_work1(freed_bytes, max_live_bytes); | |
2654 | 2609 |
2655 _collectionSetChooser->clearMarkedHeapRegions(); | 2610 _collectionSetChooser->clearMarkedHeapRegions(); |
2656 double clear_marked_end; | 2611 double clear_marked_end_sec; |
2657 if (G1PrintParCleanupStats) { | 2612 if (G1PrintParCleanupStats) { |
2658 clear_marked_end = os::elapsedTime(); | 2613 clear_marked_end_sec = os::elapsedTime(); |
2659 gclog_or_tty->print_cr(" clear marked regions + work1: %8.3f ms.", | 2614 gclog_or_tty->print_cr(" clear marked regions: %8.3f ms.", |
2660 (clear_marked_end - start)*1000.0); | 2615 (clear_marked_end_sec - start_sec) * 1000.0); |
2661 } | 2616 } |
2617 | |
2662 if (G1CollectedHeap::use_parallel_gc_threads()) { | 2618 if (G1CollectedHeap::use_parallel_gc_threads()) { |
2663 const size_t OverpartitionFactor = 4; | 2619 const size_t OverpartitionFactor = 4; |
2664 const size_t MinWorkUnit = 8; | 2620 const size_t MinWorkUnit = 8; |
2665 const size_t WorkUnit = | 2621 const size_t WorkUnit = |
2666 MAX2(_g1->n_regions() / (ParallelGCThreads * OverpartitionFactor), | 2622 MAX2(_g1->n_regions() / (ParallelGCThreads * OverpartitionFactor), |
2675 "sanity check"); | 2631 "sanity check"); |
2676 } else { | 2632 } else { |
2677 KnownGarbageClosure knownGarbagecl(_collectionSetChooser); | 2633 KnownGarbageClosure knownGarbagecl(_collectionSetChooser); |
2678 _g1->heap_region_iterate(&knownGarbagecl); | 2634 _g1->heap_region_iterate(&knownGarbagecl); |
2679 } | 2635 } |
2680 double known_garbage_end; | 2636 double known_garbage_end_sec; |
2681 if (G1PrintParCleanupStats) { | 2637 if (G1PrintParCleanupStats) { |
2682 known_garbage_end = os::elapsedTime(); | 2638 known_garbage_end_sec = os::elapsedTime(); |
2683 gclog_or_tty->print_cr(" compute known garbage: %8.3f ms.", | 2639 gclog_or_tty->print_cr(" compute known garbage: %8.3f ms.", |
2684 (known_garbage_end - clear_marked_end)*1000.0); | 2640 (known_garbage_end_sec - clear_marked_end_sec) * 1000.0); |
2685 } | 2641 } |
2642 | |
2686 _collectionSetChooser->sortMarkedHeapRegions(); | 2643 _collectionSetChooser->sortMarkedHeapRegions(); |
2687 double sort_end; | 2644 double end_sec = os::elapsedTime(); |
2688 if (G1PrintParCleanupStats) { | 2645 if (G1PrintParCleanupStats) { |
2689 sort_end = os::elapsedTime(); | |
2690 gclog_or_tty->print_cr(" sorting: %8.3f ms.", | 2646 gclog_or_tty->print_cr(" sorting: %8.3f ms.", |
2691 (sort_end - known_garbage_end)*1000.0); | 2647 (end_sec - known_garbage_end_sec) * 1000.0); |
2692 } | 2648 } |
2693 | 2649 |
2694 record_concurrent_mark_cleanup_end_work2(); | 2650 double elapsed_time_ms = (end_sec - _mark_cleanup_start_sec) * 1000.0; |
2695 double work2_end; | 2651 _concurrent_mark_cleanup_times_ms->add(elapsed_time_ms); |
2696 if (G1PrintParCleanupStats) { | 2652 _cur_mark_stop_world_time_ms += elapsed_time_ms; |
2697 work2_end = os::elapsedTime(); | 2653 _prev_collection_pause_end_ms += elapsed_time_ms; |
2698 gclog_or_tty->print_cr(" work2: %8.3f ms.", | 2654 _mmu_tracker->add_pause(_mark_cleanup_start_sec, end_sec, true); |
2699 (work2_end - sort_end)*1000.0); | |
2700 } | |
2701 } | 2655 } |
2702 | 2656 |
2703 // Add the heap region at the head of the non-incremental collection set | 2657 // Add the heap region at the head of the non-incremental collection set |
2704 void G1CollectorPolicy:: | 2658 void G1CollectorPolicy:: |
2705 add_to_collection_set(HeapRegion* hr) { | 2659 add_to_collection_set(HeapRegion* hr) { |
2910 csr = next; | 2864 csr = next; |
2911 } | 2865 } |
2912 } | 2866 } |
2913 #endif // !PRODUCT | 2867 #endif // !PRODUCT |
2914 | 2868 |
2915 void | 2869 void G1CollectorPolicy::choose_collection_set(double target_pause_time_ms) { |
2916 G1CollectorPolicy_BestRegionsFirst::choose_collection_set( | |
2917 double target_pause_time_ms) { | |
2918 // Set this here - in case we're not doing young collections. | 2870 // Set this here - in case we're not doing young collections. |
2919 double non_young_start_time_sec = os::elapsedTime(); | 2871 double non_young_start_time_sec = os::elapsedTime(); |
2920 | 2872 |
2921 YoungList* young_list = _g1->young_list(); | 2873 YoungList* young_list = _g1->young_list(); |
2922 | 2874 |
3113 | 3065 |
3114 double non_young_end_time_sec = os::elapsedTime(); | 3066 double non_young_end_time_sec = os::elapsedTime(); |
3115 _recorded_non_young_cset_choice_time_ms = | 3067 _recorded_non_young_cset_choice_time_ms = |
3116 (non_young_end_time_sec - non_young_start_time_sec) * 1000.0; | 3068 (non_young_end_time_sec - non_young_start_time_sec) * 1000.0; |
3117 } | 3069 } |
3118 | |
3119 void G1CollectorPolicy_BestRegionsFirst::record_full_collection_end() { | |
3120 G1CollectorPolicy::record_full_collection_end(); | |
3121 _collectionSetChooser->updateAfterFullCollection(); | |
3122 } | |
3123 | |
3124 void G1CollectorPolicy_BestRegionsFirst:: | |
3125 record_collection_pause_end() { | |
3126 G1CollectorPolicy::record_collection_pause_end(); | |
3127 assert(assertMarkedBytesDataOK(), "Marked regions not OK at pause end."); | |
3128 } |