49 // for example, we continue examining regions even after rejecting a region that has
50 // more live data than we can evacuate.
51
52 // Better select garbage-first regions
53 QuickSort::sort<RegionData>(data, (int) size, compare_by_garbage);
54
55 size_t cur_young_garbage = add_preselected_regions_to_collection_set(cset, data, size);
56
57 choose_young_collection_set(cset, data, size, actual_free, cur_young_garbage);
58
59 log_cset_composition(cset);
60 }
61
62 void ShenandoahYoungHeuristics::choose_young_collection_set(ShenandoahCollectionSet* cset,
63 const RegionData* data,
64 size_t size, size_t actual_free,
65 size_t cur_young_garbage) const {
66
67 auto heap = ShenandoahGenerationalHeap::heap();
68
69 size_t capacity = heap->young_generation()->max_capacity();
70 size_t garbage_threshold = ShenandoahHeapRegion::region_size_bytes() * ShenandoahGarbageThreshold / 100;
71 size_t ignore_threshold = ShenandoahHeapRegion::region_size_bytes() * ShenandoahIgnoreGarbageThreshold / 100;
72 const uint tenuring_threshold = heap->age_census()->tenuring_threshold();
73
74 // This is young-gen collection or a mixed evacuation.
75 // If this is mixed evacuation, the old-gen candidate regions have already been added.
76 size_t max_cset = (size_t) (heap->young_generation()->get_evacuation_reserve() / ShenandoahEvacWaste);
77 size_t cur_cset = 0;
78 size_t free_target = (capacity * ShenandoahMinFreeThreshold) / 100 + max_cset;
79 size_t min_garbage = (free_target > actual_free) ? (free_target - actual_free) : 0;
80
81
82 log_info(gc, ergo)(
83 "Adaptive CSet Selection for YOUNG. Max Evacuation: %zu%s, Actual Free: %zu%s.",
84 byte_size_in_proper_unit(max_cset), proper_unit_for_byte_size(max_cset),
85 byte_size_in_proper_unit(actual_free), proper_unit_for_byte_size(actual_free));
86
87 for (size_t idx = 0; idx < size; idx++) {
88 ShenandoahHeapRegion* r = data[idx].get_region();
89 if (cset->is_preselected(r->index())) {
|
49 // for example, we continue examining regions even after rejecting a region that has
50 // more live data than we can evacuate.
51
52 // Better select garbage-first regions
53 QuickSort::sort<RegionData>(data, (int) size, compare_by_garbage);
54
55 size_t cur_young_garbage = add_preselected_regions_to_collection_set(cset, data, size);
56
57 choose_young_collection_set(cset, data, size, actual_free, cur_young_garbage);
58
59 log_cset_composition(cset);
60 }
61
62 void ShenandoahYoungHeuristics::choose_young_collection_set(ShenandoahCollectionSet* cset,
63 const RegionData* data,
64 size_t size, size_t actual_free,
65 size_t cur_young_garbage) const {
66
67 auto heap = ShenandoahGenerationalHeap::heap();
68
69 size_t capacity = heap->soft_max_capacity();
70 size_t garbage_threshold = ShenandoahHeapRegion::region_size_bytes() * ShenandoahGarbageThreshold / 100;
71 size_t ignore_threshold = ShenandoahHeapRegion::region_size_bytes() * ShenandoahIgnoreGarbageThreshold / 100;
72 const uint tenuring_threshold = heap->age_census()->tenuring_threshold();
73
74 // This is young-gen collection or a mixed evacuation.
75 // If this is mixed evacuation, the old-gen candidate regions have already been added.
76 size_t max_cset = (size_t) (heap->young_generation()->get_evacuation_reserve() / ShenandoahEvacWaste);
77 size_t cur_cset = 0;
78 size_t free_target = (capacity * ShenandoahMinFreeThreshold) / 100 + max_cset;
79 size_t min_garbage = (free_target > actual_free) ? (free_target - actual_free) : 0;
80
81
82 log_info(gc, ergo)(
83 "Adaptive CSet Selection for YOUNG. Max Evacuation: %zu%s, Actual Free: %zu%s.",
84 byte_size_in_proper_unit(max_cset), proper_unit_for_byte_size(max_cset),
85 byte_size_in_proper_unit(actual_free), proper_unit_for_byte_size(actual_free));
86
87 for (size_t idx = 0; idx < size; idx++) {
88 ShenandoahHeapRegion* r = data[idx].get_region();
89 if (cset->is_preselected(r->index())) {
|