2

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


要演示该问题,请在我的 Macbook Pro 上使用 Java 和 JavaScript(使用 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.js 则不然。这使得命令行工具看起来没有响应。(与上面的简单不同,如果它们依赖于多个类,则尤其如此T.java

4

5 回答 5

3

不太可能,您可以尝试的唯一方法是 JVM 的不同实现,但这可能不会改变。大多数 Java 应用程序(相对)寿命较长,并且可能是交互式的,这意味着 JVM 启动时间会在正常使用的噪音中丢失。

于 2012-05-16T22:31:09.730 回答
1

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

确保您没有为此类应用程序选择服务器 VM - 这是真正会增加启动时间的一件事。

唯一真正的方法是将 Java 编译为本机代码,您可以使用 GCJ 来完成 - 因此,如果您必须用 Java 编写这些应用程序并且必须更快地拥有它们,那么这可能是一条向下看的路线。请记住,虽然它不是最新的,并且它的维护在很大程度上似乎也正在消亡。

于 2012-05-16T22:51:55.930 回答
1

还没有尝试过,但可能值得一看 nailgun。它将在同一个 JVM 中运行您的 Java 程序,因此在“热身”之后应该非常快。“hello world”示例从 0.132s 到 0.004s

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

于 2013-03-31T19:53:56.130 回答
1

但是,您实际上是否尝试过对反复调用的 Java 命令行应用程序进行计时?我希望在文件系统缓存中的库类第一次化身之后,启动时间会有所缓解。

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

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

  • 用 Java 编写命令的 gubbins
  • 编写一个简单的本地持续运行“服务器”,接收命令并将它们传递给相关的 Java 例程
  • 编写一个简单的本机命令行包装器(或将其编写成可以快速启动的东西),其唯一存在的理由是将命令传递到 Java 服务器并输出结果。

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

于 2012-05-16T22:37:02.390 回答
0

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

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

于 2021-11-01T10:38:48.527 回答