8005452: NPG: Create new flags for Metaspace resizing policy
Reviewed-by: johnc, jwilhelm, coleenp, stefank
--- a/hotspot/src/share/vm/memory/metaspace.cpp Mon Feb 11 15:24:48 2013 -0800
+++ b/hotspot/src/share/vm/memory/metaspace.cpp Wed Jan 23 19:08:04 2013 -0800
@@ -1064,11 +1064,11 @@
//
// After the GC the compute_new_size() for MetaspaceGC is called to
// resize the capacity of the metaspaces. The current implementation
-// is based on the flags MinHeapFreeRatio and MaxHeapFreeRatio used
+// is based on the flags MinMetaspaceFreeRatio and MaxHeapFreeRatio used
// to resize the Java heap by some GC's. New flags can be implemented
// if really needed. MinHeapFreeRatio is used to calculate how much
// free space is desirable in the metaspace capacity to decide how much
-// to increase the HWM. MaxHeapFreeRatio is used to decide how much
+// to increase the HWM. MaxMetaspaceFreeRatio is used to decide how much
// free space is desirable in the metaspace capacity before decreasing
// the HWM.
@@ -1166,7 +1166,7 @@
size_t capacity_until_GC = vsl->capacity_bytes_sum();
size_t free_after_gc = capacity_until_GC - used_after_gc;
- const double minimum_free_percentage = MinHeapFreeRatio / 100.0;
+ const double minimum_free_percentage = MinMetaspaceFreeRatio / 100.0;
const double maximum_used_percentage = 1.0 - minimum_free_percentage;
const double min_tmp = used_after_gc / maximum_used_percentage;
@@ -1232,8 +1232,8 @@
max_shrink_words));
// Should shrinking be considered?
- if (MaxHeapFreeRatio < 100) {
- const double maximum_free_percentage = MaxHeapFreeRatio / 100.0;
+ if (MaxMetaspaceFreeRatio < 100) {
+ const double maximum_free_percentage = MaxMetaspaceFreeRatio / 100.0;
const double minimum_used_percentage = 1.0 - maximum_free_percentage;
const double max_tmp = used_after_gc / minimum_used_percentage;
size_t maximum_desired_capacity = (size_t)MIN2(max_tmp, double(max_uintx));
--- a/hotspot/src/share/vm/runtime/arguments.cpp Mon Feb 11 15:24:48 2013 -0800
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Wed Jan 23 19:08:04 2013 -0800
@@ -1896,6 +1896,24 @@
// Keeping the heap 100% free is hard ;-) so limit it to 99%.
MinHeapFreeRatio = MIN2(MinHeapFreeRatio, (uintx) 99);
+ // Min/MaxMetaspaceFreeRatio
+ status = status && verify_percentage(MinMetaspaceFreeRatio, "MinMetaspaceFreeRatio");
+ status = status && verify_percentage(MaxMetaspaceFreeRatio, "MaxMetaspaceFreeRatio");
+
+ if (MinMetaspaceFreeRatio > MaxMetaspaceFreeRatio) {
+ jio_fprintf(defaultStream::error_stream(),
+ "MinMetaspaceFreeRatio (%s" UINTX_FORMAT ") must be less than or "
+ "equal to MaxMetaspaceFreeRatio (%s" UINTX_FORMAT ")\n",
+ FLAG_IS_DEFAULT(MinMetaspaceFreeRatio) ? "Default: " : "",
+ MinMetaspaceFreeRatio,
+ FLAG_IS_DEFAULT(MaxMetaspaceFreeRatio) ? "Default: " : "",
+ MaxMetaspaceFreeRatio);
+ status = false;
+ }
+
+ // Trying to keep 100% free is not practical
+ MinMetaspaceFreeRatio = MIN2(MinMetaspaceFreeRatio, (uintx) 99);
+
if (FullGCALot && FLAG_IS_DEFAULT(MarkSweepAlwaysCompactCount)) {
MarkSweepAlwaysCompactCount = 1; // Move objects every gc.
}
--- a/hotspot/src/share/vm/runtime/globals.hpp Mon Feb 11 15:24:48 2013 -0800
+++ b/hotspot/src/share/vm/runtime/globals.hpp Wed Jan 23 19:08:04 2013 -0800
@@ -3010,10 +3010,16 @@
"Min change in heap space due to GC (in bytes)") \
\
product(uintx, MinMetaspaceExpansion, ScaleForWordSize(256*K), \
- "Min expansion of permanent heap (in bytes)") \
+ "Min expansion of Metaspace (in bytes)") \
+ \
+ product(uintx, MinMetaspaceFreeRatio, 40, \
+ "Min percentage of Metaspace free after GC to avoid expansion") \
+ \
+ product(uintx, MaxMetaspaceFreeRatio, 70, \
+ "Max percentage of Metaspace free after GC to avoid shrinking") \
\
product(uintx, MaxMetaspaceExpansion, ScaleForWordSize(4*M), \
- "Max expansion of permanent heap without full GC (in bytes)") \
+ "Max expansion of Metaspace without full GC (in bytes)") \
\
product(intx, QueuedAllocationWarningCount, 0, \
"Number of times an allocation that queues behind a GC " \