繁体   English   中英

使java启动更快

[英]make java startup faster

有什么方法可以获得合理(不明显)的 Java 启动时间,从而使其适合编写命令行脚本(不是长寿命的应用程序)?


为了演示该问题,请在我的 Macbook Pro 上使用 Java 和 JavaScript(运行 w/node.js)编写一个简单的 Hello World 程序:

$ time java T
Hello world!

real    0m0.352s
user    0m0.301s
sys 0m0.053s

$ time node T.js
Hello world!

real    0m0.098s
user    0m0.079s
sys 0m0.013s

Java 版本有明显的滞后,Node 则不然。 这使得命令行工具似乎没有响应。 (与上面的简单T.java不同,如果它们依赖于多个类,则尤其如此。

不太可能,您可能只能尝试的是JVM的另一种实现,但这可能不会改变。 大多数(相对)Java应用程序虽然寿命较长,但可能具有交互性,这意味着JVM启动时间因正常使用的噪音而浪费了。

但是,您实际上是否尝试过计时重复调用的Java命令行应用程序? 我希望在第一次启动后,由于文件系统高速缓存中的库类而有所缓解。

也就是说,是的,Java平台不是最简单的平台之一,无论如何您都不会与小型本地可执行文件竞争。

编辑:正如您所说的,以上时间是针对“热身”电话的,那么可能的解决方法可能是:

  • 用Java编写命令的gubbins
  • 编写一个简单的本地连续运行的“服务器”,该服务器接受命令并将其传递给相关的Java例程
  • 编写一个简单的本机命令行包装程序(或将其编写为快速启动的程序),其唯一原因是将命令传递给Java服务器并吐出结果。

这不是很好,但是它可以允许您使用Java(我认为基本上就是您想要的)来编写例程的gubbins,同时仍保持命令行调用模型。

正如其他人所说,简单的答案只是“不是真的”。 您可以对性能进行一些小的改进,但是您永远也无法摆脱虚拟机启动和运行需要一段时间的事实。

确保没有为此类应用选择服务器VM-这确实会增加启动时间。

唯一真正的解决方法是将Java编译为本机代码,您可以使用GCJ进行处理-因此,如果必须使用Java编写这些应用程序并且必须使其具有更快的运行速度,那么这可能是一种看不起的途径。 请记住,虽然它不是最新的,但对其的维护在很大程度上似乎也将消失。

还没有尝试过,但也许值得一看。 它将在相同的JVM中运行Java程序,因此“预热”后应该很快。 一个“ hello world”示例从0.132s变为0.004s

http://www.martiansoftware.com/nailgun/background.html

您可以通过类数据共享获得小幅加速https://rmannibucau.metawerx.net/post/java-class-data-sharing-docker-startup

使用 GraalVM 本机映像对静态二进制文件进行提前编译应该会带来更大的加速,尽管使用起来仍然很棘手。 许多库尚未兼容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM