942 943 #ifndef PRODUCT 944 void ParallelScavengeHeap::record_gen_tops_before_GC() { 945 if (ZapUnusedHeapArea) { 946 young_gen()->record_spaces_top(); 947 old_gen()->record_spaces_top(); 948 perm_gen()->record_spaces_top(); 949 } 950 } 951 952 void ParallelScavengeHeap::gen_mangle_unused_area() { 953 if (ZapUnusedHeapArea) { 954 young_gen()->eden_space()->mangle_unused_area(); 955 young_gen()->to_space()->mangle_unused_area(); 956 young_gen()->from_space()->mangle_unused_area(); 957 old_gen()->object_space()->mangle_unused_area(); 958 perm_gen()->object_space()->mangle_unused_area(); 959 } 960 } 961 #endif | 942 943 #ifndef PRODUCT 944 void ParallelScavengeHeap::record_gen_tops_before_GC() { 945 if (ZapUnusedHeapArea) { 946 young_gen()->record_spaces_top(); 947 old_gen()->record_spaces_top(); 948 perm_gen()->record_spaces_top(); 949 } 950 } 951 952 void ParallelScavengeHeap::gen_mangle_unused_area() { 953 if (ZapUnusedHeapArea) { 954 young_gen()->eden_space()->mangle_unused_area(); 955 young_gen()->to_space()->mangle_unused_area(); 956 young_gen()->from_space()->mangle_unused_area(); 957 old_gen()->object_space()->mangle_unused_area(); 958 perm_gen()->object_space()->mangle_unused_area(); 959 } 960 } 961 #endif 962 963 bool ParallelScavengeHeap::try_to_shrink_by_free_ratio(bool isFullGC) { 964 if (MaxHeapFreeRatio >= 100) { 965 // nothing to do in this case 966 return false; 967 } 968 969 size_t capacity = old_gen()->capacity_in_bytes() + young_gen()->capacity_in_bytes(); 970 size_t used = old_gen()->used_in_bytes() + young_gen()->used_in_bytes(); 971 size_t init_size = old_gen()->init_gen_size() + young_gen()->init_gen_size(); 972 const double maximum_free_percentage = MaxHeapFreeRatio / 100.0; 973 const double minimum_used_percentage = 1.0 - maximum_free_percentage; 974 const double max_tmp = used / minimum_used_percentage; 975 size_t maximum_desired_capacity = (size_t)MIN2(max_tmp, double(max_uintx)); 976 maximum_desired_capacity = MAX2(maximum_desired_capacity, init_size); 977 978 if (PrintGC && Verbose) { 979 const double free_ratio = 1.0 - (double) used / capacity; 980 gclog_or_tty->print("Shrink by free ratio: "); 981 gclog_or_tty->print("capacity : " SIZE_FORMAT ", ", capacity); 982 gclog_or_tty->print("used : " SIZE_FORMAT ", ", used); 983 gclog_or_tty->print_cr("free ratio : %f.2", free_ratio); 984 } 985 986 size_t free_bytes = capacity - used; 987 if (capacity > maximum_desired_capacity && free_bytes > 0) { 988 size_t young_gen_free_bytes = young_gen()->capacity_in_bytes() - young_gen()->used_in_bytes(); 989 size_t old_gen_free_bytes = old_gen()->capacity_in_bytes() - old_gen()->used_in_bytes(); 990 size_t shrink_bytes = capacity - maximum_desired_capacity; 991 if (isFullGC) { 992 size_t old_gen_shrink_bytes = 993 (size_t) (shrink_bytes * ((double) old_gen_free_bytes / free_bytes)); 994 old_gen()->try_to_shrink_by(old_gen_shrink_bytes); 995 } 996 size_t young_gen_shrink_bytes = 997 (size_t) (shrink_bytes * ((double) young_gen_free_bytes / free_bytes)); 998 young_gen()->try_to_shrink_by(young_gen_shrink_bytes); 999 return true; 1000 } 1001 return false; 1002 } |