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
--- 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