< prev index next >

test/gc/shenandoah/TestStringDedupStress.java

Print this page
rev 10790 : [backport] Prefix Shenandoah tests with "Test"

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2017, 2018 Red Hat, Inc. and/or its affiliates.
+ * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
  *
  * 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.
  *

@@ -20,79 +20,83 @@
  * questions.
  *
  */
 
  /*
- * @test TestShenandoahStringDedup.java
+ * @test TestStringDedupStress
  * @summary Test Shenandoah string deduplication implementation
  * @key gc
- * @run main/othervm -XX:+UseShenandoahGC -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseStringDeduplication -Xmx512M
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M
  *                   -DtargetStrings=3000000
- *                   ShenandoahStrDedupStress
+ *                   TestStringDedupStress
  *
- * @run main/othervm -XX:+UseShenandoahGC -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseStringDeduplication -Xmx512M
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M
  *                   -XX:ShenandoahGCHeuristics=aggressive -DtargetStrings=2000000
- *                   ShenandoahStrDedupStress
+ *                   TestStringDedupStress
  *
- * @run main/othervm -XX:+UseShenandoahGC -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseStringDeduplication -Xmx512M
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M
  *                   -XX:ShenandoahGCHeuristics=aggressive -XX:+ShenandoahOOMDuringEvacALot -DtargetStrings=2000000
- *                    ShenandoahStrDedupStress
+ *                    TestStringDedupStress
  *
- * @run main/othervm -XX:+UseShenandoahGC -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseStringDeduplication -Xmx512M
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M
  *                   -XX:ShenandoahGCHeuristics=static -DtargetStrings=4000000
- *                   ShenandoahStrDedupStress
+ *                   TestStringDedupStress
  *
- * @run main/othervm -XX:+UseShenandoahGC -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseStringDeduplication -Xmx512M
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M
  *                   -XX:ShenandoahGCHeuristics=compact
- *                   ShenandoahStrDedupStress
+ *                   TestStringDedupStress
  *
- * @run main/othervm -XX:+UseShenandoahGC -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseStringDeduplication -Xmx1024M
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx1024M
  *                   -XX:ShenandoahGCHeuristics=passive -XX:+ShenandoahDegeneratedGC -DtargetOverwrites=40000000
- *                   ShenandoahStrDedupStress
+ *                   TestStringDedupStress
  *
- * @run main/othervm -XX:+UseShenandoahGC -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseStringDeduplication -Xmx1024M
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx1024M
  *                   -XX:ShenandoahGCHeuristics=passive -XX:-ShenandoahDegeneratedGC -DtargetOverwrites=40000000
- *                   ShenandoahStrDedupStress
+ *                   TestStringDedupStress
  *
- * @run main/othervm -XX:+UseShenandoahGC -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseStringDeduplication -Xmx512M
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M
  *                   -XX:ShenandoahUpdateRefsEarly=off -DtargetStrings=3000000
- *                   ShenandoahStrDedupStress
+ *                   TestStringDedupStress
  *
- * @run main/othervm -XX:+UseShenandoahGC -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseStringDeduplication -Xmx512M
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M
  *                   -XX:ShenandoahGCHeuristics=compact -XX:ShenandoahUpdateRefsEarly=off -DtargetStrings=2000000
- *                   ShenandoahStrDedupStress
+ *                   TestStringDedupStress
  *
- * @run main/othervm -XX:+UseShenandoahGC -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseStringDeduplication -Xmx512M
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M
  *                   -XX:ShenandoahGCHeuristics=aggressive -XX:ShenandoahUpdateRefsEarly=off -DtargetStrings=2000000
- *                   ShenandoahStrDedupStress
+ *                   TestStringDedupStress
  *
- * @run main/othervm -XX:+UseShenandoahGC -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseStringDeduplication -Xmx512M
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M
  *                   -XX:ShenandoahGCHeuristics=static -XX:ShenandoahUpdateRefsEarly=off -DtargetOverwrites=4000000
- *                   ShenandoahStrDedupStress
+ *                   TestStringDedupStress
  *
- * @run main/othervm -XX:+UseShenandoahGC -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseStringDeduplication -Xmx512M
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -XX:+UseStringDeduplication -Xmx512M
  *                   -XX:ShenandoahGCHeuristics=aggressive -XX:ShenandoahUpdateRefsEarly=off -XX:+ShenandoahOOMDuringEvacALot -DtargetStrings=2000000
- *                   ShenandoahStrDedupStress
+ *                   TestStringDedupStress
  */
 
+import java.lang.management.*;
 import java.lang.reflect.*;
 import java.util.*;
+
 import sun.misc.*;
 
-public class ShenandoahStrDedupStress {
+public class TestStringDedupStress {
   private static Field valueField;
   private static Unsafe unsafe;
 
   private static long TARGET_STRINGS = Long.getLong("targetStrings", 2_500_000);
   private static long TARGET_OVERWRITES = Long.getLong("targetOverwrites", 600_000);
+    private static final long MAX_REWRITE_GC_CYCLES = 6;
 
   private static final int UNIQUE_STRINGS = 20;
+
   static {
     try {
       Field field = Unsafe.class.getDeclaredField("theUnsafe");
       field.setAccessible(true);
-      unsafe = (Unsafe)field.get(null);
+            unsafe = (Unsafe) field.get(null);
 
       valueField = String.class.getDeclaredField("value");
       valueField.setAccessible(true);
     } catch (Exception e) {
       throw new RuntimeException(e);

@@ -108,72 +112,98 @@
   }
 
   static class StringAndId {
     private String str;
     private int    id;
+
     public StringAndId(String str, int id) {
       this.str = str;
       this.id = id;
     }
 
-    public String str() { return str; }
-    public int    id()  { return id;  }
+        public String str() {
+            return str;
   }
 
-  private static void generateStrings(ArrayList<StringAndId> strs, int unique_strs) {
-    Random rn = new Random();
-    for (int u = 0; u < unique_strs; u ++) {
-      int n = Math.abs(rn.nextInt() % 2);
-      for (int index = 0; index < n; index ++) {
-          strs.add(new StringAndId("Unique String " + u, u));
+        public int id() {
+            return id;
       }
     }
+
+    // Generate uniqueStrings number of strings
+    private static void generateStrings(ArrayList<StringAndId> strs, int uniqueStrings) {
+        Random rn = new Random();
+        for (int u = 0; u < uniqueStrings; u++) {
+            int n = rn.nextInt(uniqueStrings);
+            strs.add(new StringAndId("Unique String " + n, n));
+        }
   }
 
   private static int verifyDedepString(ArrayList<StringAndId> strs) {
     HashMap<Object, StringAndId> seen = new HashMap<>();
     int total = 0;
     int dedup = 0;
 
     for (StringAndId item : strs) {
-      total ++;
-      StringAndId existing_item = seen.get(getValue(item.str()));
-      if (existing_item == null) {
+            total++;
+            StringAndId existingItem = seen.get(getValue(item.str()));
+            if (existingItem == null) {
         seen.put(getValue(item.str()), item);
       } else {
-        if (item.id() != existing_item.id() ||
-            !item.str().equals(existing_item.str())) {
+                if (item.id() != existingItem.id() ||
+                        !item.str().equals(existingItem.str())) {
           System.out.println("StringDedup error:");
-          System.out.println("id: " + item.id() + " != " + existing_item.id());
-          System.out.println("or String: " + item.str() + " != " + existing_item.str());
+                    System.out.println("id: " + item.id() + " != " + existingItem.id());
+                    System.out.println("or String: " + item.str() + " != " + existingItem.str());
           throw new RuntimeException("StringDedup Test failed");
         } else {
-          dedup ++;
+                    dedup++;
         }
       }
     }
     System.out.println("Dedup: " + dedup + "/" + total + " unique: "  + (total - dedup));
     return (total - dedup);
   }
 
   static volatile ArrayList<StringAndId> astrs = new ArrayList<>();
+    static GarbageCollectorMXBean gcCycleMBean;
+
   public static void main(String[] args) {
     Random rn = new Random();
 
-    long gen_iterations = TARGET_STRINGS * 2 / UNIQUE_STRINGS;
+        for (GarbageCollectorMXBean bean : ManagementFactory.getGarbageCollectorMXBeans()) {
+            if ("Shenandoah Cycles".equals(bean.getName())) {
+                gcCycleMBean = bean;
+                break;
+            }
+        }
+
+        if (gcCycleMBean == null) {
+            throw new RuntimeException("Can not find Shenandoah GC cycle mbean");
+        }
 
-    for(long index = 0; index < gen_iterations; index ++) {
+        // Generate roughly TARGET_STRINGS strings, only UNIQUE_STRINGS are unique
+        long genIters = TARGET_STRINGS / UNIQUE_STRINGS;
+        for (long index = 0; index < genIters; index++) {
       generateStrings(astrs, UNIQUE_STRINGS);
     }
 
-    for (long loop = 1; loop < TARGET_OVERWRITES; loop ++) {
-      int arr_size = astrs.size();
-      int index = Math.abs(rn.nextInt()) % arr_size;
+        long cycleBeforeRewrite = gcCycleMBean.getCollectionCount();
+
+        for (long loop = 1; loop < TARGET_OVERWRITES; loop++) {
+            int arrSize = astrs.size();
+            int index = rn.nextInt(arrSize);
       StringAndId item = astrs.get(index);
-      int n = Math.abs(rn.nextInt() % UNIQUE_STRINGS);
+            int n = rn.nextInt(UNIQUE_STRINGS);
       item.str = "Unique String " + n;
       item.id = n;
-    }
 
+            if (loop % 1000 == 0) {
+                // enough GC cycles for rewritten strings to be deduplicated
+                if (gcCycleMBean.getCollectionCount() - cycleBeforeRewrite >= MAX_REWRITE_GC_CYCLES) {
+                    break;
+                }
+            }
+        }
     verifyDedepString(astrs);
   }
 }
< prev index next >