27 * @summary Write a lots of shared strings. |
27 * @summary Write a lots of shared strings. |
28 * @requires vm.cds.archived.java.heap |
28 * @requires vm.cds.archived.java.heap |
29 * @library /test/hotspot/jtreg/runtime/appcds /test/lib |
29 * @library /test/hotspot/jtreg/runtime/appcds /test/lib |
30 * @modules jdk.jartool/sun.tools.jar |
30 * @modules jdk.jartool/sun.tools.jar |
31 * @build HelloString |
31 * @build HelloString |
32 * @run driver SharedStringsStress |
32 * @run driver/timeout=500 SharedStringsStress |
33 */ |
33 */ |
34 import java.io.File; |
34 import java.io.File; |
35 import java.io.FileOutputStream; |
35 import java.io.FileOutputStream; |
36 import java.io.OutputStreamWriter; |
36 import java.io.OutputStreamWriter; |
37 import java.io.PrintWriter; |
37 import java.io.PrintWriter; |
38 import jdk.test.lib.process.OutputAnalyzer; |
38 import jdk.test.lib.process.OutputAnalyzer; |
39 import jdk.test.lib.process.ProcessTools; |
39 import jdk.test.lib.process.ProcessTools; |
40 |
40 |
41 public class SharedStringsStress { |
41 public class SharedStringsStress { |
|
42 static String sharedArchiveConfigFile = System.getProperty("user.dir") + File.separator + "SharedStringsStress_gen.txt"; |
|
43 |
42 public static void main(String[] args) throws Exception { |
44 public static void main(String[] args) throws Exception { |
43 SharedStringsUtils.run(args, SharedStringsStress::test); |
|
44 } |
|
45 |
|
46 public static void test(String[] args) throws Exception { |
|
47 String vmOptionsPrefix[] = SharedStringsUtils.getChildVMOptionsPrefix(); |
|
48 |
|
49 String appJar = JarBuilder.build("SharedStringsStress", "HelloString"); |
|
50 |
|
51 String sharedArchiveConfigFile = System.getProperty("user.dir") + File.separator + "SharedStringsStress_gen.txt"; |
|
52 try (FileOutputStream fos = new FileOutputStream(sharedArchiveConfigFile)) { |
45 try (FileOutputStream fos = new FileOutputStream(sharedArchiveConfigFile)) { |
53 PrintWriter out = new PrintWriter(new OutputStreamWriter(fos)); |
46 PrintWriter out = new PrintWriter(new OutputStreamWriter(fos)); |
54 out.println("VERSION: 1.0"); |
47 out.println("VERSION: 1.0"); |
55 out.println("@SECTION: String"); |
48 out.println("@SECTION: String"); |
56 out.println("31: shared_test_string_unique_14325"); |
49 out.println("31: shared_test_string_unique_14325"); |
57 for (int i=0; i<100000; i++) { |
50 for (int i=0; i<200000; i++) { |
58 String s = "generated_string " + i; |
51 String s = "generated_string " + i; |
59 out.println(s.length() + ": " + s); |
52 out.println(s.length() + ": " + s); |
60 } |
53 } |
61 out.close(); |
54 out.close(); |
62 } |
55 } |
63 |
56 |
64 OutputAnalyzer dumpOutput = TestCommon.dump(appJar, TestCommon.list("HelloString"), |
57 SharedStringsUtils.run(args, SharedStringsStress::test); |
65 TestCommon.concat(vmOptionsPrefix, |
58 } |
66 "-XX:SharedArchiveConfigFile=" + sharedArchiveConfigFile)); |
59 |
67 TestCommon.checkDump(dumpOutput); |
60 public static void test(String[] args) throws Exception { |
68 OutputAnalyzer execOutput = TestCommon.exec(appJar, |
61 String vmOptionsPrefix[] = SharedStringsUtils.getChildVMOptionsPrefix(); |
69 TestCommon.concat(vmOptionsPrefix, "HelloString")); |
62 String appJar = JarBuilder.build("SharedStringsStress", "HelloString"); |
70 TestCommon.checkExec(execOutput); |
63 |
|
64 String test_cases[][] = { |
|
65 // default heap size |
|
66 {}, |
|
67 |
|
68 // Test for handling of heap fragmentation. With sharedArchiveConfigFile, we will dump about |
|
69 // 18MB of shared objects on 64 bit VM (smaller on 32-bit). |
|
70 // |
|
71 // During dump time, an extra copy of these objects are allocated, |
|
72 // so we need about 36MB, plus a few MB for other system data. So 64MB total heap |
|
73 // should be enough. |
|
74 // |
|
75 // The VM should executed a full GC to maximize contiguous free space and |
|
76 // avoid fragmentation. |
|
77 {"-Xmx64m"}, |
|
78 }; |
|
79 |
|
80 for (String[] extra_opts: test_cases) { |
|
81 vmOptionsPrefix = TestCommon.concat(vmOptionsPrefix, extra_opts); |
|
82 |
|
83 OutputAnalyzer dumpOutput = TestCommon.dump(appJar, TestCommon.list("HelloString"), |
|
84 TestCommon.concat(vmOptionsPrefix, |
|
85 "-XX:SharedArchiveConfigFile=" + sharedArchiveConfigFile, |
|
86 "-Xlog:gc+region+cds", |
|
87 "-Xlog:gc+region=trace")); |
|
88 TestCommon.checkDump(dumpOutput); |
|
89 OutputAnalyzer execOutput = TestCommon.exec(appJar, |
|
90 TestCommon.concat(vmOptionsPrefix, "HelloString")); |
|
91 TestCommon.checkExec(execOutput); |
|
92 } |
71 } |
93 } |
72 } |
94 } |