107 analyzer.shouldContain("All good");
108 } else {
109 analyzer.shouldHaveExitValue(1);
110 analyzer.shouldContain("java.lang.OutOfMemoryError");
111 analyzer.shouldNotContain("All good");
112 }
113 }
114
115 public static void main(String[] args) throws Exception {
116 if (args.length > 0) {
117 String classDir = TestClassLoaderLeak.class.getProtectionDomain().getCodeSource().getLocation().getPath();
118 for (int c = 0; c < COUNT; c++) {
119 load(classDir);
120 }
121 System.out.println("All good");
122 return;
123 }
124
125 String[][][] modeHeuristics = new String[][][] {
126 {{"normal"}, {"adaptive", "compact", "static", "aggressive"}},
127 {{"passive"}, {"passive"}}
128 };
129
130 for (String[][] mh : modeHeuristics) {
131 String mode = mh[0][0];
132 String[] heuristics = mh[1];
133 for (String h : heuristics) {
134 // Forceful enabling should work
135 passWith("-XX:ShenandoahGCMode=" + mode, "-XX:ShenandoahGCHeuristics=" + h, "-XX:+ClassUnloading");
136 passWith("-XX:ShenandoahGCMode=" + mode, "-XX:ShenandoahGCHeuristics=" + h, "-XX:+ClassUnloadingWithConcurrentMark");
137
138 // Even when concurrent unloading is disabled, Full GC has to recover
139 passWith("-XX:ShenandoahGCMode=" + mode, "-XX:ShenandoahGCHeuristics=" + h, "-XX:+ClassUnloading", "-XX:-ClassUnloadingWithConcurrentMark");
140 passWith("-XX:ShenandoahGCMode=" + mode, "-XX:ShenandoahGCHeuristics=" + h, "-XX:+ClassUnloading", "-XX:-ClassUnloadingWithConcurrentMark", "-XX:ShenandoahUnloadClassesFrequency=0");
141 passWith("-XX:ShenandoahGCMode=" + mode, "-XX:ShenandoahGCHeuristics=" + h, "-XX:+ClassUnloading", "-XX:+ClassUnloadingWithConcurrentMark", "-XX:ShenandoahUnloadClassesFrequency=0");
142
143 // Should OOME when unloading forcefully disabled, even if local flags try to enable it back
144 failWith("-XX:ShenandoahGCMode=" + mode, "-XX:ShenandoahGCHeuristics=" + h, "-XX:-ClassUnloading");
145 failWith("-XX:ShenandoahGCMode=" + mode, "-XX:ShenandoahGCHeuristics=" + h, "-XX:-ClassUnloading", "-XX:+ClassUnloadingWithConcurrentMark");
146 failWith("-XX:ShenandoahGCMode=" + mode, "-XX:ShenandoahGCHeuristics=" + h, "-XX:-ClassUnloading", "-XX:+ClassUnloadingWithConcurrentMark", "-XX:ShenandoahUnloadClassesFrequency=1");
|
107 analyzer.shouldContain("All good");
108 } else {
109 analyzer.shouldHaveExitValue(1);
110 analyzer.shouldContain("java.lang.OutOfMemoryError");
111 analyzer.shouldNotContain("All good");
112 }
113 }
114
115 public static void main(String[] args) throws Exception {
116 if (args.length > 0) {
117 String classDir = TestClassLoaderLeak.class.getProtectionDomain().getCodeSource().getLocation().getPath();
118 for (int c = 0; c < COUNT; c++) {
119 load(classDir);
120 }
121 System.out.println("All good");
122 return;
123 }
124
125 String[][][] modeHeuristics = new String[][][] {
126 {{"normal"}, {"adaptive", "compact", "static", "aggressive"}},
127 {{"traversal"}, {"adaptive", "aggressive"}},
128 {{"passive"}, {"passive"}}
129 };
130
131 for (String[][] mh : modeHeuristics) {
132 String mode = mh[0][0];
133 String[] heuristics = mh[1];
134 for (String h : heuristics) {
135 // Forceful enabling should work
136 passWith("-XX:ShenandoahGCMode=" + mode, "-XX:ShenandoahGCHeuristics=" + h, "-XX:+ClassUnloading");
137 passWith("-XX:ShenandoahGCMode=" + mode, "-XX:ShenandoahGCHeuristics=" + h, "-XX:+ClassUnloadingWithConcurrentMark");
138
139 // Even when concurrent unloading is disabled, Full GC has to recover
140 passWith("-XX:ShenandoahGCMode=" + mode, "-XX:ShenandoahGCHeuristics=" + h, "-XX:+ClassUnloading", "-XX:-ClassUnloadingWithConcurrentMark");
141 passWith("-XX:ShenandoahGCMode=" + mode, "-XX:ShenandoahGCHeuristics=" + h, "-XX:+ClassUnloading", "-XX:-ClassUnloadingWithConcurrentMark", "-XX:ShenandoahUnloadClassesFrequency=0");
142 passWith("-XX:ShenandoahGCMode=" + mode, "-XX:ShenandoahGCHeuristics=" + h, "-XX:+ClassUnloading", "-XX:+ClassUnloadingWithConcurrentMark", "-XX:ShenandoahUnloadClassesFrequency=0");
143
144 // Should OOME when unloading forcefully disabled, even if local flags try to enable it back
145 failWith("-XX:ShenandoahGCMode=" + mode, "-XX:ShenandoahGCHeuristics=" + h, "-XX:-ClassUnloading");
146 failWith("-XX:ShenandoahGCMode=" + mode, "-XX:ShenandoahGCHeuristics=" + h, "-XX:-ClassUnloading", "-XX:+ClassUnloadingWithConcurrentMark");
147 failWith("-XX:ShenandoahGCMode=" + mode, "-XX:ShenandoahGCHeuristics=" + h, "-XX:-ClassUnloading", "-XX:+ClassUnloadingWithConcurrentMark", "-XX:ShenandoahUnloadClassesFrequency=1");
|