Mercurial > hg > graal-jvmci-8
comparison src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.cpp @ 17648:a034dc5e910b
8028391: Make the Min/MaxHeapFreeRatio flags manageable
Summary: Made the flags Min- and MaxHeapFreeRatio manageable, and implemented support for these flags in ParallelGC.
Reviewed-by: sla, mgerdin, brutisso
author | jwilhelm |
---|---|
date | Wed, 29 Jan 2014 23:17:05 +0100 |
parents | 8f07aa079343 |
children | 78bbf4d43a14 |
comparison
equal
deleted
inserted
replaced
17647:3d60c34b14ca | 17648:a034dc5e910b |
---|---|
21 * questions. | 21 * questions. |
22 * | 22 * |
23 */ | 23 */ |
24 | 24 |
25 #include "precompiled.hpp" | 25 #include "precompiled.hpp" |
26 #include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp" | |
26 #include "gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp" | 27 #include "gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp" |
27 #include "gc_implementation/parallelScavenge/psGCAdaptivePolicyCounters.hpp" | 28 #include "gc_implementation/parallelScavenge/psGCAdaptivePolicyCounters.hpp" |
28 #include "gc_implementation/parallelScavenge/psScavenge.hpp" | 29 #include "gc_implementation/parallelScavenge/psScavenge.hpp" |
29 #include "gc_implementation/shared/gcPolicyCounters.hpp" | 30 #include "gc_implementation/shared/gcPolicyCounters.hpp" |
30 #include "gc_interface/gcCause.hpp" | 31 #include "gc_interface/gcCause.hpp" |
72 | 73 |
73 // Start the timers | 74 // Start the timers |
74 _major_timer.start(); | 75 _major_timer.start(); |
75 | 76 |
76 _old_gen_policy_is_ready = false; | 77 _old_gen_policy_is_ready = false; |
78 } | |
79 | |
80 size_t PSAdaptiveSizePolicy::calculate_free_based_on_live(size_t live, uintx ratio_as_percentage) { | |
81 // We want to calculate how much free memory there can be based on the | |
82 // amount of live data currently in the old gen. Using the formula: | |
83 // ratio * (free + live) = free | |
84 // Some equation solving later we get: | |
85 // free = (live * ratio) / (1 - ratio) | |
86 | |
87 const double ratio = ratio_as_percentage / 100.0; | |
88 const double ratio_inverse = 1.0 - ratio; | |
89 const double tmp = live * ratio; | |
90 size_t free = (size_t)(tmp / ratio_inverse); | |
91 | |
92 return free; | |
93 } | |
94 | |
95 size_t PSAdaptiveSizePolicy::calculated_old_free_size_in_bytes() const { | |
96 size_t free_size = (size_t)(_promo_size + avg_promoted()->padded_average()); | |
97 size_t live = ParallelScavengeHeap::heap()->old_gen()->used_in_bytes(); | |
98 | |
99 if (MinHeapFreeRatio != 0) { | |
100 size_t min_free = calculate_free_based_on_live(live, MinHeapFreeRatio); | |
101 free_size = MAX2(free_size, min_free); | |
102 } | |
103 | |
104 if (MaxHeapFreeRatio != 100) { | |
105 size_t max_free = calculate_free_based_on_live(live, MaxHeapFreeRatio); | |
106 free_size = MIN2(max_free, free_size); | |
107 } | |
108 | |
109 return free_size; | |
77 } | 110 } |
78 | 111 |
79 void PSAdaptiveSizePolicy::major_collection_begin() { | 112 void PSAdaptiveSizePolicy::major_collection_begin() { |
80 // Update the interval time | 113 // Update the interval time |
81 _major_timer.stop(); | 114 _major_timer.stop(); |
1290 | 1323 |
1291 return AdaptiveSizePolicy::print_adaptive_size_policy_on( | 1324 return AdaptiveSizePolicy::print_adaptive_size_policy_on( |
1292 st, | 1325 st, |
1293 PSScavenge::tenuring_threshold()); | 1326 PSScavenge::tenuring_threshold()); |
1294 } | 1327 } |
1328 | |
1329 #ifndef PRODUCT | |
1330 | |
1331 void TestOldFreeSpaceCalculation_test() { | |
1332 assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(100, 20) == 25, "Calculation of free memory failed"); | |
1333 assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(100, 50) == 100, "Calculation of free memory failed"); | |
1334 assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(100, 60) == 150, "Calculation of free memory failed"); | |
1335 assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(100, 75) == 300, "Calculation of free memory failed"); | |
1336 assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(400, 20) == 100, "Calculation of free memory failed"); | |
1337 assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(400, 50) == 400, "Calculation of free memory failed"); | |
1338 assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(400, 60) == 600, "Calculation of free memory failed"); | |
1339 assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(400, 75) == 1200, "Calculation of free memory failed"); | |
1340 } | |
1341 | |
1342 #endif /* !PRODUCT */ |