首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何加快Java VM (JVM)的启动时间?

如何加快Java VM (JVM)的启动时间?
EN

Stack Overflow用户
提问于 2009-09-29 08:43:22
回答 5查看 22.5K关注 0票数 44

我正在运行启动多个JVM进程的测试。与在JVM中运行的实际测试的时间相比,JVM的概要启动时间非常重要。我如何加快速度呢?

我已经使用了"-client“选项,这确实有帮助,但没有我想要的那么多。有没有其他方法,比如预加载一堆JVM并以某种方式重用它们?

EN

回答 5

Stack Overflow用户

发布于 2009-09-29 13:29:23

如果您确实想重用JVM,那么“以某种方式”可能是Nailgun。钉枪让JVM保持运行,然后使用轻量级本地客户端启动特定的类并处理控制台io。这对于运行小型的命令行Java实用程序是很好的,但是当它重用相同的JVM时,可能会累积状态。

为了避免状态累积,以运行多个JVM为代价,另一种选择是Drip。Drip使用正确的类路径和其他JVM选项保留了一个新的JVM,以便您可以在需要时快速连接和使用它,然后将其丢弃。Drip对JVM选项进行散列处理,并将有关如何连接到JVM的信息存储在一个目录中,该目录的名称为散列值。

票数 38
EN

Stack Overflow用户

发布于 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客户端安装上启用,但可能需要在其他位置启用一些手动步骤:

  1. 运行java -Xshare:dump以生成CDS共享归档文件
  2. -Xshare:auto添加到命令以确保它已使用

其他调优

虽然-client实际上可能会做任何事情,也可能不会做任何事情(许多系统上的JVM都不附带客户端VM --实际上,从9开始就没有了),有许多方法可以调优HotSpot服务器JVM,使其行为更像客户端VM:

堆使用只使用-XX:TieredStopAtLevel=1

  • Use (客户机)编译器:-XX:CICompilerCount=1

  • Use尽可能少的编译器线程:使用单线程串行GC:-XX:+UseSerialGC

  • Limit

  • (特别是在大型系统上),例如-Xmx512m

(-Xmx512m)-XX:CICompilerCount=1

  • Use单线程串行GC:-XX:+UseSerialGC

  • Limit

  • 使用(特别是在大型系统上)。

这应该足以提高小型短时间运行的应用程序的启动速度,但可能会对峰值性能产生非常负面的影响。当然,您还可以通过禁用您可能不使用的特性,比如-XX:-UsePerfData (禁用一些可以使用MXBeans和jvmstat检索的运行时信息)。

高级

  • jlink是Java9中提供的一个新工具,它允许您构建自定义运行时映像。如果您的控制台应用程序只使用JDK模块的一小部分,则可以将自定义运行时设置得非常小,这可以进一步缩短启动时间。仅包含java.base模块的最小映像,根据硬件和其他调优,可能会将启动时间提高约10-20ms:仅限$JAVA_HOME/bin/jlink --add-modules java.base --module-path $JAVA_HOME/jmods --output jbase
  • (Linux )Java9引入了一个实验性的AOT compilerjaotc,它可以用来帮助应用程序更快地启动,并花费更少的周期来完成此操作。开箱即用它可能会减慢立即启动的速度(因为AOT代码是一个共享库,它增加了自己的I/O开销,不支持串行GC),但通过仔细的调整,我们已经看到它将小型应用程序的启动时间减少了15-30%。
  • CPU钉住:在大型系统上,我们已经看到了源于套接字之间的缓存一致性流量的影响,绑定到单个CPU节点可以显著缩短启动时间。在Linux上,像numactl --cpunodebind=0 $JAVA_HOME/bin/java ...这样的东西应该可以做到这一点。

总而言之,我们已经能够让最小的应用程序在35毫秒(JDK 9 GA)内执行。各种启动优化已经进入JDK10分支,我现在看到的数字低至28ms。

票数 17
EN

Stack Overflow用户

发布于 2009-09-29 08:48:52

为什么不在一个JVM中加载所有的测试呢?您可以执行以下一项或多项操作吗?

  1. 通过更高级别的类加载所有测试-
  2. 在列表(配置文件)中指定测试类,并通过Class.forName()
  3. 按顺序加载每个测试类如果隔离很重要,则可以为每个测试

创建不同的类加载器

如果内存分配很大,它可以通过将JVM内存启动大小指定为与最大可分配内存相同的数字(-Xms-Xmx)来加快速度,这将使JVM不必返回操作系统以获得更多内存。然而,在这种情况下,我认为这不太可能是问题所在。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1491325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档