【问题标题】:make java startup faster让java启动更快
【发布时间】:2012-05-16 22:28:09
【问题描述】:

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


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

$ 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 不同。

【问题讨论】:

  • Java 在虚拟机中运行。 JavaScript 直接从代码中执行。尝试对较大的程序(较小的开销)或仅对执行时间(无虚拟机延迟)进行计时。
  • Java 适合编写命令行脚本。还有许多其他语言更适合它。为工作使用适当的工具。
  • @GuillaumePolet 尝试主要为 OSX/Unix 编写代码,但谢谢。
  • @skaffman 不幸的是,有许多库的最佳接口是 Java,例如ANTLR(我知道有 C 目标选项,但它与代码不同步,是一种 Java-in-C 风格的代码。)

标签: java


【解决方案1】:

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

【讨论】:

  • FWIW 我发现 Java 启动在 Linux 1.7 JVM 上比在 Mac 1.6JVM 上快得多。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 是的,我有 - 第一次运行通常需要大约 3.5 秒,然后是上面显示的用于随后运行 Hello Word 的时间。
  • 啊,好的。现在我再次查看您的时间安排,对于 Java 初创公司来说,三分之一秒实际上并不是那么糟糕。如果您真的需要更快,那么我已经修改了我的答案以提出一个笨拙的解决方法。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        • 2012-06-17
        • 1970-01-01
        • 2012-02-02
        • 2012-09-10
        • 2014-12-21
        • 1970-01-01
        相关资源
        最近更新 更多