我正在运行启动多个JVM进程的测试。与在JVM中运行的实际测试的时间相比,JVM的概要启动时间非常重要。我如何加快速度呢?
我已经使用了"-client“选项,这确实有帮助,但没有我想要的那么多。有没有其他方法,比如预加载一堆JVM并以某种方式重用它们?
发布于 2009-09-29 13:29:23
发布于 2017-10-02 04:17:50
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
(-Xmx512m)-XX:CICompilerCount=1
-XX:+UseSerialGC
这应该足以提高小型短时间运行的应用程序的启动速度,但可能会对峰值性能产生非常负面的影响。当然,您还可以通过禁用您可能不使用的特性,比如-XX:-UsePerfData (禁用一些可以使用MXBeans和jvmstat检索的运行时信息)。
高级
$JAVA_HOME/bin/jlink --add-modules java.base --module-path $JAVA_HOME/jmods --output jbasejaotc,它可以用来帮助应用程序更快地启动,并花费更少的周期来完成此操作。开箱即用它可能会减慢立即启动的速度(因为AOT代码是一个共享库,它增加了自己的I/O开销,不支持串行GC),但通过仔细的调整,我们已经看到它将小型应用程序的启动时间减少了15-30%。numactl --cpunodebind=0 $JAVA_HOME/bin/java ...这样的东西应该可以做到这一点。总而言之,我们已经能够让最小的应用程序在35毫秒(JDK 9 GA)内执行。各种启动优化已经进入JDK10分支,我现在看到的数字低至28ms。
发布于 2009-09-29 08:48:52
为什么不在一个JVM中加载所有的测试呢?您可以执行以下一项或多项操作吗?
Class.forName()?创建不同的类加载器
如果内存分配很大,它可以通过将JVM内存启动大小指定为与最大可分配内存相同的数字(-Xms与-Xmx)来加快速度,这将使JVM不必返回操作系统以获得更多内存。然而,在这种情况下,我认为这不太可能是问题所在。
https://stackoverflow.com/questions/1491325
复制相似问题