我听说过
- 每个主要版本都使 JVM 变得更快(在某些方面)
- 9 的模块化将带来更快的启动时间。
为了加快 Maven 构建速度,我下载jdk9-ea
了它并发现它需要更长的时间。此外,感觉在 Maven 启动之前还有更长的延迟。
我尝试使用以下代码粗略测量 JVM 启动时间
public class Sampler {
public static void main(String[] args) throws IOException, InterruptedException {
long t = System.currentTimeMillis();
if (args.length == 0 || args[0].startsWith("-")) {
sample(30, args);
} else {
long t0 = Long.parseLong(args[0]);
System.out.println(t - t0);
}
}
static void sample(int n, String[] options) throws IOException, InterruptedException {
File samples = new File("samples.txt");
for (int i = 0; i < n; i++) {
String javaPath = String.join(
System.getProperty("file.separator"),
System.getProperty("java.home"),
"bin",
"java");
List<String> command = new ArrayList<String>();
command.add(javaPath);
command.addAll(Arrays.asList(options));
command.add("Sampler");
command.add(Long.toString(System.currentTimeMillis()));
ProcessBuilder processBuilder = new ProcessBuilder(command)
.inheritIO()
.redirectOutput(ProcessBuilder.Redirect.appendTo(samples));
Process process = processBuilder.start();
process.waitFor();
}
prettyPrint(samples);
samples.delete();
}
...
}
从 Java 9 开始需要两倍的时间
>java-版本 java版本“1.8.0_74” Java(TM) SE 运行时环境 (build 1.8.0_74-b02) Java HotSpot(TM) Client VM(build 25.74-b02,混合模式,共享) >javac 采样器.java && java 采样器 n=30 单位=milisec 最小=124 最大=205 平均值=143 中值=132 >java-版本 java版本“9-ea” Java(TM) SE 运行时环境 (build 9-ea+111) Java HotSpot(TM) 客户端 VM(构建 9-ea+111,混合模式) >javac 采样器.java && java 采样器 n=30 单位=milisec 最小值=279 最大值=387 平均值=301 中值=294 >javac Sampler.java && java Sampler -XX:+UseParallelGC n=30 单位=milisec 最小=279 最大=382 平均值=297 中值=292 >java-版本 java版本“1.8.0_76-ea” Java(TM) SE 运行时环境 (build 1.8.0_76-ea-b04) Java HotSpot(TM) Client VM(build 25.76-b04,混合模式,共享) >javac 采样器.java && java 采样器 n=30 单位=milisec 最小=123 最大=227 平均值=159 中值=141 >java 采样器 -XX:+UseG1GC n=99 单位=milisec min=188 max=340 mean=213 中位数=199
注意:最初我使用的是服务器虚拟机(x64),同样的 2x 间隔,Java9 启动时间约为 0.6 秒。
后java -Xshare:dump
>java-版本 java版本“9-ea” Java(TM) SE 运行时环境 (build 9-ea+111) Java HotSpot(TM) 客户端 VM(构建 9-ea+111,混合模式,共享) >javac 采样器.java && java 采样器 n=50 单位=milisec 最小=228 最大=422 平均值=269 中值=269 >javac Sampler.java && java Sampler -Xshare:on <错误消息> n=44 单位=milisec 最小=227 最大=392 平均值=247 中值=238 >javac Sampler.java && java 采样器 -Xshare:off n=50 单位=milisec min=280 max=513 mean=315 中位数=288 >javac Sampler.java && java Sampler -Xshare:auto n=50 单位=milisec 最小=228 最大=361 平均值=283 中值=285
使用 Java 8 EA
>java -Xshare:off 采样器 n=99 单位=milisec 最小值=124 最大值=264 平均值=150 中值=136
错误信息:
处理共享存档文件时发生错误。 无法在所需地址映射只读共享空间。 初始化虚拟机时出错 无法使用共享存档。
50 次中的 44 次成功开始是我能得到的最高数字。最低的是 - 13。