src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp

Print this page




 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 }