我正在运行启动多个JVM进程的测试.与在JVM中运行的实际测试时间相比,JVM的摘要启动时间非常重要.我如何加快速度?
我已经使用了"-client"选项,这确实有所帮助,但没有我想要的那么多.有没有其他方法,比如预加载一堆JVM并以某种方式重用它们?
Cla*_*tad 11
JVM启动性能可以通过多种方式得到改进:CDS,直接调整,CPU固定和jlink(自JDK 9以来)可以是很好的选择.AOT(JDK 9,仅限Linux)有一些粗略的边缘,但可以调整以帮助小型应用程序.
类数据共享是在1.5版本中为客户端VM开发的,但自从开始使用HotSpot的所有变体(自8年以来的所有GC)以来已经有了很大的改进,在启用时大大提高了启动性能.
CDS始终在32位JRE客户端安装上启用,但可能需要在其他地方启用一些手动步骤:
java -Xshare:dump
以生成CDS共享存档-Xshare:auto
到您的命令以确保它已被使用虽然-client
可能会或可能不会实际执行任何操作(许多系统上的JVM不附带客户端VM - 实际上从9开始都没有),有很多方法可以调整HotSpot服务器JVM以使其更像客户端VM:
-XX:TieredStopAtLevel=1
-XX:CICompilerCount=1
-XX:+UseSerialGC
-Xmx512m
这应该足以为小型短期运行应用程序提升启动速度,但可能会对峰值性能产生非常不利的影响.您当然可以通过禁用可能未使用的功能来进一步实现,例如-XX:-UsePerfData
(禁用使用MXBeans和jvmstat可检索的某些运行时信息).
jlink是Java 9中提供的一种新工具,它允许您构建自定义运行时映像.如果您的控制台应用程序仅使用一小部分JDK模块,则可以使自定义运行时非常小,这可以进一步缩短启动时间.一个只包含java.base模块的最小图像,可能会将启动时间提高大约10-20ms,具体取决于硬件和其他调整:$JAVA_HOME/bin/jlink --add-modules java.base --module-path $JAVA_HOME/jmods --output jbase
(仅限Linux)Java 9引入了一个实验性AOT编译器,jaotc
可用于帮助应用程序更快地启动,并且可以减少周期.开箱即用它可能会减慢立即启动速度(因为AOT代码是一个共享库,它增加了自己的I/O开销,不支持串行GC ..),但仔细调整我们'我们看到它将小型应用程序的启动时间缩短了15-30%.
CPU固定:在大型系统上,我们已经看到源自套接字之间的缓存一致性流量的效果,并且绑定到单个CPU节点可以大大缩短启动时间.在Linux上numactl --cpunodebind=0 $JAVA_HOME/bin/java ...
应该做的事情.
总而言之,我们已经能够在短至35毫秒内完成最少的应用程序(JDK 9 GA).各种启动优化已进入JDK10分支,我现在看到数字低至28ms.
为什么不在一个 JVM 中加载所有测试?你能做到以下一项或多项吗?
Class.forName()
?按顺序加载每个测试类如果内存分配相当大,则可以通过将 JVM 内存启动大小指定为与最大可分配内存 ( -Xms
vs -Xmx
) 相同的数字来加快速度,这将使 JVM 不必返回操作系统来获取更多内存。但在这种情况下,我认为这不太可能成为问题。
归档时间: |
|
查看次数: |
17053 次 |
最近记录: |