This commit is contained in:
Vladimir Kozlov 2016-10-19 17:53:01 +00:00
commit ccc0015fb4
3 changed files with 21 additions and 14 deletions

View File

@ -51,23 +51,29 @@ public class TestHumongousShrinkHeap {
private static final int REGION_SIZE = 1024 * 1024; // 1M private static final int REGION_SIZE = 1024 * 1024; // 1M
private static final int LISTS_COUNT = 10; private static final int LISTS_COUNT = 10;
private static final int HUMON_SIZE = Math.round(.9f * REGION_SIZE); private static final int HUMON_SIZE = Math.round(.9f * REGION_SIZE);
private static final long AVAILABLE_MEMORY
= Runtime.getRuntime().freeMemory();
private static final int HUMON_COUNT
= (int) ((AVAILABLE_MEMORY / HUMON_SIZE)
/ LISTS_COUNT);
private static final long TOTAL_MEMORY = Runtime.getRuntime().totalMemory();
private static final long MAX_MEMORY = Runtime.getRuntime().maxMemory();
private static final int HUMON_COUNT = (int) ((TOTAL_MEMORY / HUMON_SIZE) / LISTS_COUNT);
public static void main(String[] args) { public static void main(String[] args) {
if (HUMON_COUNT == 0) { if (HUMON_COUNT == 0) {
System.out.println("Skipped. Heap is too small"); System.out.println("Skipped. Heap is too small");
return; return;
} }
System.out.format("Running with %s max heap size. "
+ "Will allocate humongous object of %s size %d times.%n", if (TOTAL_MEMORY + REGION_SIZE * HUMON_COUNT > MAX_MEMORY) {
MemoryUsagePrinter.humanReadableByteCount(AVAILABLE_MEMORY, false), System.out.println("Skipped. Initial heap size is to close to max heap size.");
MemoryUsagePrinter.humanReadableByteCount(HUMON_SIZE, false), return;
HUMON_COUNT }
System.out.format("Running with %s initial heap size of %s maximum heap size. "
+ "Will allocate humongous object of %s size %d times.%n",
MemoryUsagePrinter.humanReadableByteCount(TOTAL_MEMORY, false),
MemoryUsagePrinter.humanReadableByteCount(MAX_MEMORY, false),
MemoryUsagePrinter.humanReadableByteCount(HUMON_SIZE, false),
HUMON_COUNT
); );
new TestHumongousShrinkHeap().test(); new TestHumongousShrinkHeap().test();
} }

View File

@ -31,7 +31,6 @@ import utils.*;
* @modules java.base/jdk.internal.misc * @modules java.base/jdk.internal.misc
* @library /test/lib * @library /test/lib
* @library ../share * @library ../share
* @ignore 8155570
* @run main/othervm -XX:+UsePerfData -Xmx128M -XX:MaxMetaspaceSize=128M GcTest02 * @run main/othervm -XX:+UsePerfData -Xmx128M -XX:MaxMetaspaceSize=128M GcTest02
*/ */

View File

@ -50,7 +50,7 @@ public class GcProvokerImpl implements GcProvoker {
used += memoryChunk; used += memoryChunk;
} catch (OutOfMemoryError e) { } catch (OutOfMemoryError e) {
list = null; list = null;
throw new RuntimeException("Unexpected OOME while eating " + targetUsage + " of heap memory."); throw new RuntimeException("Unexpected OOME '" + e.getMessage() + "' while eating " + targetUsage + " of heap memory.");
} }
} }
return list; return list;
@ -73,8 +73,10 @@ public class GcProvokerImpl implements GcProvoker {
@Override @Override
public void eatMetaspaceAndHeap(float targetMemoryUsagePercent) { public void eatMetaspaceAndHeap(float targetMemoryUsagePercent) {
eatenMemory = eatHeapMemory(targetMemoryUsagePercent); // Metaspace should be filled before Java Heap to prevent unexpected OOME
// in the Java Heap while filling Metaspace
eatenMetaspace = eatMetaspace(targetMemoryUsagePercent); eatenMetaspace = eatMetaspace(targetMemoryUsagePercent);
eatenMemory = eatHeapMemory(targetMemoryUsagePercent);
} }
private static List<Object> eatMetaspace(float targetUsage) { private static List<Object> eatMetaspace(float targetUsage) {
@ -97,7 +99,7 @@ public class GcProvokerImpl implements GcProvoker {
list.add(gp.create(0)); list.add(gp.create(0));
} catch (OutOfMemoryError oome) { } catch (OutOfMemoryError oome) {
list = null; list = null;
throw new RuntimeException("Unexpected OOME while eating " + targetUsage + " of Metaspace."); throw new RuntimeException("Unexpected OOME '" + oome.getMessage() + "' while eating " + targetUsage + " of Metaspace.");
} }
MemoryUsage memoryUsage = metaspacePool.getUsage(); MemoryUsage memoryUsage = metaspacePool.getUsage();
currentUsage = (((float) memoryUsage.getUsed()) / memoryUsage.getMax()); currentUsage = (((float) memoryUsage.getUsed()) / memoryUsage.getMax());