8160827: gc/stress/TestStressG1Humongous.java fails with OOME
authormchernov
Tue, 19 Jul 2016 18:15:46 +0300
changeset 39981 eb1282859915
parent 39980 dcef6760667c
child 39983 295ff7a5e92d
child 39984 8ecc78131588
child 39987 66623d85bbd8
8160827: gc/stress/TestStressG1Humongous.java fails with OOME Reviewed-by: tschatzl
hotspot/test/gc/stress/TestStressG1Humongous.java
--- a/hotspot/test/gc/stress/TestStressG1Humongous.java	Tue Jul 19 09:30:30 2016 +0200
+++ b/hotspot/test/gc/stress/TestStressG1Humongous.java	Tue Jul 19 18:15:46 2016 +0300
@@ -26,9 +26,6 @@
  * @key gc
  * @key stress
  * @summary Stress G1 by humongous allocations in situation near OOM
- * Fails intermittently on 32-bit VMs due to 8160827 so quarantine
- * it on those platforms:
- * @requires vm.bits != "32"
  * @requires vm.gc.G1
  * @requires !vm.flightRecorder
  * @run main/othervm/timeout=200 -Xlog:gc=debug -Xmx1g -XX:+UseG1GC -XX:G1HeapRegionSize=4m
@@ -56,6 +53,7 @@
     private static final int THREAD_COUNT = Integer.getInteger("threads", 2);
     private static final int REGION_SIZE = Integer.getInteger("regionsize", 1) * 1024 * 1024;
     private static final int HUMONGOUS_SIZE = (int) (REGION_SIZE * Double.parseDouble(System.getProperty("humongoussize", "1.5")));
+    private static final int NUMBER_OF_FREE_REGIONS = 2;
 
     private volatile boolean isRunning;
     private final ExecutorService threadExecutor;
@@ -95,8 +93,12 @@
     private int getExpectedAmountOfObjects() {
         long maxMem = Runtime.getRuntime().maxMemory();
         int expectedHObjects = (int) (maxMem / HUMONGOUS_SIZE);
-        // Will allocate 1 region less to give some free space for VM.
-        int checkedAmountOfHObjects = checkHeapCapacity(expectedHObjects) - 1;
+        // Will allocate NUMBER_OF_FREE_REGIONS region less to give some free space for VM.
+        int checkedAmountOfHObjects = checkHeapCapacity(expectedHObjects) - NUMBER_OF_FREE_REGIONS;
+        if (checkedAmountOfHObjects <= 0) {
+            throw new RuntimeException("Cannot start testing because selected maximum heap "
+                    + "is not large enough to contain more than " + NUMBER_OF_FREE_REGIONS + " regions");
+        }
         return checkedAmountOfHObjects;
     }