19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 /*
25 * @test
26 * @bug 8174749
27 * @summary MemberNameTable should reuse entries
28 * @library /test/lib
29 * @build sun.hotspot.WhiteBox
30 * @run driver ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission
31 * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. MemberNameLeak
32 */
33
34 import java.lang.invoke.*;
35 import jdk.test.lib.process.OutputAnalyzer;
36 import jdk.test.lib.process.ProcessTools;
37
38 import sun.hotspot.code.Compiler;
39
40 public class MemberNameLeak {
41 static class Leak {
42 public void callMe() {
43 }
44
45 public static void main(String[] args) throws Throwable {
46 Leak leak = new Leak();
47
48 for (int i = 0; i < 10; i++) {
49 MethodHandles.Lookup lookup = MethodHandles.lookup();
50 MethodType mt = MethodType.fromMethodDescriptorString("()V", Leak.class.getClassLoader());
51 // findSpecial leaks some native mem
52 MethodHandle mh = lookup.findSpecial(Leak.class, "callMe", mt, Leak.class);
53 mh.invokeExact(leak);
54 }
55
56 System.gc(); // make mh unused
57 }
58 }
59
60 public static void test(String gc) throws Throwable {
61 // Run this Leak class with logging
62 ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
63 "-Xlog:membername+table=trace",
64 gc, Leak.class.getName());
65 OutputAnalyzer output = new OutputAnalyzer(pb.start());
66 output.shouldContain("ResolvedMethod entry added for MemberNameLeak$Leak.callMe()V");
67 output.shouldContain("ResolvedMethod entry found for MemberNameLeak$Leak.callMe()V");
68 output.shouldContain("ResolvedMethod entry removed");
69 output.shouldHaveExitValue(0);
70 }
71
72 public static void main(java.lang.String[] unused) throws Throwable {
73 test("-XX:+UseG1GC");
74 test("-XX:+UseParallelGC");
75 test("-XX:+UseSerialGC");
76 if (!Compiler.isGraalEnabled()) { // Graal does not support CMS
77 test("-XX:+UseConcMarkSweepGC");
78 }
79 }
80 }
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 /*
25 * @test
26 * @bug 8174749
27 * @summary MemberNameTable should reuse entries
28 * @library /test/lib
29 * @build sun.hotspot.WhiteBox
30 * @run driver ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission
31 * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. MemberNameLeak
32 */
33
34 import java.lang.invoke.*;
35 import jdk.test.lib.process.OutputAnalyzer;
36 import jdk.test.lib.process.ProcessTools;
37
38 import sun.hotspot.code.Compiler;
39 import sun.hotspot.gc.GC;
40
41 public class MemberNameLeak {
42 static class Leak {
43 public void callMe() {
44 }
45
46 public static void main(String[] args) throws Throwable {
47 Leak leak = new Leak();
48
49 for (int i = 0; i < 10; i++) {
50 MethodHandles.Lookup lookup = MethodHandles.lookup();
51 MethodType mt = MethodType.fromMethodDescriptorString("()V", Leak.class.getClassLoader());
52 // findSpecial leaks some native mem
53 MethodHandle mh = lookup.findSpecial(Leak.class, "callMe", mt, Leak.class);
54 mh.invokeExact(leak);
55 }
56
57 System.gc(); // make mh unused
58 }
59 }
60
61 public static void test(String gc) throws Throwable {
62 // Run this Leak class with logging
63 ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
64 "-Xlog:membername+table=trace",
65 "-XX:+UnlockExperimentalVMOptions",
66 gc, Leak.class.getName());
67 OutputAnalyzer output = new OutputAnalyzer(pb.start());
68 output.shouldContain("ResolvedMethod entry added for MemberNameLeak$Leak.callMe()V");
69 output.shouldContain("ResolvedMethod entry found for MemberNameLeak$Leak.callMe()V");
70 output.shouldContain("ResolvedMethod entry removed");
71 output.shouldHaveExitValue(0);
72 }
73
74 public static void main(java.lang.String[] unused) throws Throwable {
75 test("-XX:+UseG1GC");
76 test("-XX:+UseParallelGC");
77 test("-XX:+UseSerialGC");
78 if (!Compiler.isGraalEnabled()) { // Graal does not support CMS and Shenandoah
79 test("-XX:+UseConcMarkSweepGC");
80 if (GC.Shenandoah.isSupported()) {
81 test("-XX:+UseShenandoahGC");
82 }
83 }
84 }
85 }
|