< 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 >