8023158: hotspot/test/gc/7168848/HumongousAlloc.java fails 14 full gcs, expect 0 full gcs
Reviewed-by: brutisso, tschatzl
--- a/hotspot/test/TEST.groups Tue Oct 15 11:18:42 2013 +0200
+++ b/hotspot/test/TEST.groups Tue Oct 15 11:38:47 2013 +0200
@@ -124,7 +124,7 @@
compiler/whitebox/IsMethodCompilableTest.java \
gc/6581734/Test6581734.java \
gc/7072527/TestFullGCCount.java \
- gc/7168848/HumongousAlloc.java \
+ gc/g1/TestHumongousAllocInitialMark.java \
gc/arguments/TestG1HeapRegionSize.java \
gc/metaspace/TestMetaspaceMemoryPool.java \
runtime/InternalApi/ThreadCpuTimesDeadlock.java \
--- a/hotspot/test/gc/7168848/HumongousAlloc.java Tue Oct 15 11:18:42 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test Humongous.java
- * @bug 7168848
- * @summary G1: humongous object allocations should initiate marking cycles when necessary
- * @run main/othervm -Xms100m -Xmx100m -XX:+PrintGC -XX:G1HeapRegionSize=1m -XX:+UseG1GC HumongousAlloc
- *
- */
-import java.lang.management.GarbageCollectorMXBean;
-import java.lang.management.ManagementFactory;
-import java.util.List;
-
-public class HumongousAlloc {
-
- public static byte[] dummy;
- private static int sleepFreq = 40;
- private static int sleepTime = 1000;
- private static double size = 0.75;
- private static int iterations = 50;
- private static int MB = 1024 * 1024;
-
- public static void allocate(int size, int sleepTime, int sleepFreq) throws InterruptedException {
- System.out.println("Will allocate objects of size: " + size
- + " bytes and sleep for " + sleepTime
- + " ms after every " + sleepFreq + "th allocation.");
- int count = 0;
- while (count < iterations) {
- for (int i = 0; i < sleepFreq; i++) {
- dummy = new byte[size - 16];
- }
- Thread.sleep(sleepTime);
- count++;
- }
- }
-
- public static void main(String[] args) throws InterruptedException {
- allocate((int) (size * MB), sleepTime, sleepFreq);
- List<GarbageCollectorMXBean> collectors = ManagementFactory.getGarbageCollectorMXBeans();
- for (GarbageCollectorMXBean collector : collectors) {
- if (collector.getName().contains("G1 Old")) {
- long count = collector.getCollectionCount();
- if (count > 0) {
- throw new RuntimeException("Failed: FullGCs should not have happened. The number of FullGC run is " + count);
- }
- else {
- System.out.println("Passed.");
- }
- }
- }
- }
-}
-
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/g1/TestHumongousAllocInitialMark.java Tue Oct 15 11:38:47 2013 +0200
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test TestHumongousAllocInitialMark
+ * @bug 7168848
+ * @summary G1: humongous object allocations should initiate marking cycles when necessary
+ * @library /testlibrary
+ */
+
+import com.oracle.java.testlibrary.*;
+
+public class TestHumongousAllocInitialMark {
+ private static final int heapSize = 200; // MB
+ private static final int heapRegionSize = 1; // MB
+ private static final int initiatingHeapOccupancyPercent = 50; // %
+
+ public static void main(String[] args) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UseG1GC",
+ "-Xms" + heapSize + "m",
+ "-Xmx" + heapSize + "m",
+ "-XX:G1HeapRegionSize=" + heapRegionSize + "m",
+ "-XX:InitiatingHeapOccupancyPercent=" + initiatingHeapOccupancyPercent,
+ "-XX:+PrintGC",
+ HumongousObjectAllocator.class.getName());
+
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldContain("GC pause (G1 Humongous Allocation) (young) (initial-mark)");
+ output.shouldNotContain("Full GC");
+ output.shouldHaveExitValue(0);
+ }
+
+ static class HumongousObjectAllocator {
+ private static byte[] dummy;
+
+ public static void main(String [] args) throws Exception {
+ // Make object size 75% of region size
+ final int humongousObjectSize =
+ (int)(heapRegionSize * 1024 * 1024 * 0.75);
+
+ // Number of objects to allocate to go above IHOP
+ final int humongousObjectAllocations =
+ (int)((heapSize * initiatingHeapOccupancyPercent / 100.0) / heapRegionSize) + 1;
+
+ // Allocate
+ for (int i = 1; i <= humongousObjectAllocations; i++) {
+ System.out.println("Allocating humongous object " + i + "/" + humongousObjectAllocations +
+ " of size " + humongousObjectSize + " bytes");
+ dummy = new byte[humongousObjectSize];
+ }
+ }
+ }
+}
+