src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp
Print this page
*** 957,961 ****
--- 957,1002 ----
old_gen()->object_space()->mangle_unused_area();
perm_gen()->object_space()->mangle_unused_area();
}
}
#endif
+
+ bool ParallelScavengeHeap::try_to_shrink_by_free_ratio(bool isFullGC) {
+ if (MaxHeapFreeRatio >= 100) {
+ // nothing to do in this case
+ return false;
+ }
+
+ size_t capacity = old_gen()->capacity_in_bytes() + young_gen()->capacity_in_bytes();
+ size_t used = old_gen()->used_in_bytes() + young_gen()->used_in_bytes();
+ size_t init_size = old_gen()->init_gen_size() + young_gen()->init_gen_size();
+ const double maximum_free_percentage = MaxHeapFreeRatio / 100.0;
+ const double minimum_used_percentage = 1.0 - maximum_free_percentage;
+ const double max_tmp = used / minimum_used_percentage;
+ size_t maximum_desired_capacity = (size_t)MIN2(max_tmp, double(max_uintx));
+ maximum_desired_capacity = MAX2(maximum_desired_capacity, init_size);
+
+ if (PrintGC && Verbose) {
+ const double free_ratio = 1.0 - (double) used / capacity;
+ gclog_or_tty->print("Shrink by free ratio: ");
+ gclog_or_tty->print("capacity : " SIZE_FORMAT ", ", capacity);
+ gclog_or_tty->print("used : " SIZE_FORMAT ", ", used);
+ gclog_or_tty->print_cr("free ratio : %f.2", free_ratio);
+ }
+
+ size_t free_bytes = capacity - used;
+ if (capacity > maximum_desired_capacity && free_bytes > 0) {
+ size_t young_gen_free_bytes = young_gen()->capacity_in_bytes() - young_gen()->used_in_bytes();
+ size_t old_gen_free_bytes = old_gen()->capacity_in_bytes() - old_gen()->used_in_bytes();
+ size_t shrink_bytes = capacity - maximum_desired_capacity;
+ if (isFullGC) {
+ size_t old_gen_shrink_bytes =
+ (size_t) (shrink_bytes * ((double) old_gen_free_bytes / free_bytes));
+ old_gen()->try_to_shrink_by(old_gen_shrink_bytes);
+ }
+ size_t young_gen_shrink_bytes =
+ (size_t) (shrink_bytes * ((double) young_gen_free_bytes / free_bytes));
+ young_gen()->try_to_shrink_by(young_gen_shrink_bytes);
+ return true;
+ }
+ return false;
+ }