8165313: Inserting freed regions during Free Collection Set serial phase takes very long on huge heaps
authortschatzl
Mon, 12 Sep 2016 09:34:51 +0200
changeset 41075 d60e54a9bb67
parent 41074 ff67d4b3c085
child 41076 8c6aa0873dd1
8165313: Inserting freed regions during Free Collection Set serial phase takes very long on huge heaps Summary: Sort the collection set in ascending order so that the optimization when adding free regions can be exploited. Reviewed-by: sjohanss, mgerdin
hotspot/src/share/vm/gc/g1/g1CollectionSet.cpp
--- a/hotspot/src/share/vm/gc/g1/g1CollectionSet.cpp	Sat Sep 10 12:23:52 2016 -0700
+++ b/hotspot/src/share/vm/gc/g1/g1CollectionSet.cpp	Mon Sep 12 09:34:51 2016 +0200
@@ -32,6 +32,7 @@
 #include "gc/g1/heapRegionSet.hpp"
 #include "logging/logStream.hpp"
 #include "utilities/debug.hpp"
+#include "utilities/quickSort.hpp"
 
 G1CollectorState* G1CollectionSet::collector_state() {
   return _g1->collector_state();
@@ -396,6 +397,16 @@
   return time_remaining_ms;
 }
 
+static int compare_region_idx(const uint a, const uint b) {
+  if (a > b) {
+    return 1;
+  } else if (a == b) {
+    return 0;
+  } else {
+    return -1;
+  }
+}
+
 void G1CollectionSet::finalize_old_part(double time_remaining_ms) {
   double non_young_start_time_sec = os::elapsedTime();
   double predicted_old_time_ms = 0.0;
@@ -493,6 +504,8 @@
 
   double non_young_end_time_sec = os::elapsedTime();
   phase_times()->record_non_young_cset_choice_time_ms((non_young_end_time_sec - non_young_start_time_sec) * 1000.0);
+
+  QuickSort::sort<uint>(_collection_set_regions, (int)_collection_set_cur_length, compare_region_idx, true);
 }
 
 #ifdef ASSERT