[英]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,同时仍保持命令行调用模型。
正如其他人所说,简单的答案只是“不是真的”。 您可以对性能进行一些小的改进,但是您永远也无法摆脱虚拟机启动和运行需要一段时间的事实。
确保没有为此类应用选择服务器VM-这确实会增加启动时间。
唯一真正的解决方法是将Java编译为本机代码,您可以使用GCJ进行处理-因此,如果必须使用Java编写这些应用程序并且必须使其具有更快的运行速度,那么这可能是一种看不起的途径。 请记住,虽然它不是最新的,但对其的维护在很大程度上似乎也将消失。
还没有尝试过,但也许值得一看。 它将在相同的JVM中运行Java程序,因此“预热”后应该很快。 一个“ hello world”示例从0.132s变为0.004s
您可以通过类数据共享获得小幅加速https://rmannibucau.metawerx.net/post/java-class-data-sharing-docker-startup
使用 GraalVM 本机映像对静态二进制文件进行提前编译应该会带来更大的加速,尽管使用起来仍然很棘手。 许多库尚未兼容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.