让java启动更快

时间:2012-05-16 22:28:10

标签: java

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


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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

你是否真的试过计时重复调用的Java命令行应用程序?我希望在启动时的第一个化身后,文件系统缓存中的库类可以稍微减轻这种情况。

那就是说,是的,Java平台不是最简单的平台之一,无论如何你都不会与一个小的原生可执行文件竞争。

编辑:正如你所说上面的时间是针对“预热”的电话,那么可能的解决办法可能是:

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

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

答案 2 :(得分:1)

正如其他人所说,简单的回答只是“不是真的”。您可以进行轻微的性能改进,但是您永远不会忘记虚拟机需要一段时间才能启动并开始运行。

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

唯一真正的方法是将Java编译为本机代码,你可以使用GCJ - 所以如果你必须用Java编写这些应用程序而你必须让它们更快,那么可能是向下看的路线。请记住,虽然它不是最新的,但它的维护似乎也很快就会消失。

答案 3 :(得分:1)

尚未尝试过,但可能值得看看nailgun。它将在同一个JVM中运行您的Java程序,因此“预热”应该非常快。一个“你好世界”的例子从0.132s到0.004s

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