我听说过
为了加速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 -version java version "1.8.0_74" Java(TM) SE Runtime Environment (build 1.8.0_74-b02) Java HotSpot(TM) Client VM (build 25.74-b02, mixed mode, sharing) >javac Sampler.java && java Sampler n=30 units=milisec min=124 max=205 mean=143 median=132 >java -version java version "9-ea" Java(TM) SE Runtime Environment (build 9-ea+111) Java HotSpot(TM) Client VM (build 9-ea+111, mixed mode) >javac Sampler.java && java Sampler n=30 units=milisec min=279 max=387 mean=301 median=294 >javac Sampler.java && java Sampler -XX:+UseParallelGC n=30 units=milisec min=279 max=382 mean=297 median=292 >java -version java version "1.8.0_76-ea" Java(TM) SE Runtime Environment (build 1.8.0_76-ea-b04) Java HotSpot(TM) Client VM (build 25.76-b04, mixed mode, sharing) >javac Sampler.java && java Sampler n=30 units=milisec min=123 max=227 mean=159 median=141 >java Sampler -XX:+UseG1GC n=99 units=milisec min=188 max=340 mean=213 median=199
注意:最初我使用的是服务器虚拟机(x64),相同的2倍差距,Java9启动时间约为0.6秒。
java -Xshare:dump
之后
>java -version java version "9-ea" Java(TM) SE Runtime Environment (build 9-ea+111) Java HotSpot(TM) Client VM (build 9-ea+111, mixed mode, sharing) >javac Sampler.java && java Sampler n=50 units=milisec min=228 max=422 mean=269 median=269 >javac Sampler.java && java Sampler -Xshare:on <error messages> n=44 units=milisec min=227 max=392 mean=247 median=238 >javac Sampler.java && java Sampler -Xshare:off n=50 units=milisec min=280 max=513 mean=315 median=288 >javac Sampler.java && java Sampler -Xshare:auto n=50 units=milisec min=228 max=361 mean=283 median=285
使用Java 8 ea
>java -Xshare:off Sampler n=99 units=milisec min=124 max=264 mean=150 median=136
错误讯息:
An error has occurred while processing the shared archive file. Unable to map ReadOnly shared space at required address. Error occurred during initialization of VM Unable to use shared archive.在50分中有44次成功开始是我能得到的最高数字。 最低的是--13。
答案 0 :(得分:9)
是的,在当前的EA构建中确实存在一些启动回归 - 一些原因已知且积极地工作 - 其他原因更多的是&#34;一千次削减死亡&#34;考验:随着功能的实现和集成,JDK 9在开发过程中累积的小的,微不足道的低效率,然后必须在实际发布之前进行微调和优化。
我还注意到你的8/8-ea运行启用了类数据共享,但你的9-ea安装却没有(请注意-version输出中缺少&#34;共享&#34; )。如果您运行java -Xshare:dump以生成默认CDS存档,则可能会在9-ea上获得更好的数字,有关详细信息,请参阅https://docs.oracle.com/javase/8/docs/technotes/guides/vm/class-data-sharing.html。
编辑:我刚刚意识到共享已在9个版本中默认关闭,因此您还必须在9-ea中添加-Xshare:auto以启用共享。
答案 1 :(得分:3)
在Java-9上默认使用G1垃圾收集器可能会导致严重的启动延迟。在Java-9上尝试-XX:+UseParallelGC
或在Java-8上尝试-XX:+UseG1GC
以检查相同的垃圾收集器。