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; + }