有什么方法可以提升JVM启动速度?

Phy*_*win 15 java performance jvm daemon startup

据说Java在性能方面比python快10倍.这也是我从基准测试中看到的.但真正降低Java的是JVM启动时间.

这是我做的一个测试:

$time xlsx2csv.py Types\ of\ ESI\ v2.doc-emb-Package-9
...
<output skipped>
real    0m0.085s
user    0m0.072s
sys     0m0.013s


$time java  -jar -client /usr/local/bin/tika-app-0.7.jar -m Types\ of\ ESI\ v2.doc-emb-Package-9

real    0m2.055s
user    0m2.433s
sys     0m0.078s
Run Code Online (Sandbox Code Playgroud)

同样的文件,Docx和Python中的12 KB ms XLSX嵌入文件快25倍!WTH!

Java需要2.055秒.

我知道这完全是由于启动时间,但我需要的是我需要通过脚本调用它来解析一些我不想在python中重新发明轮子的文件.

但是,为了解析10k +文件,它只是不实用..

无论如何要加快它(我已经尝试过-client选项,它只加速这么少(20%)).

我的另一个想法?将其作为长时运行的守护进程运行,在本地使用UDP或Linux-ICP套接字进行通信?

Zan*_*ynx 12

试试Nailgun.

注意:我不亲自使用它.

  • 对我来说完美的解决方案.我已经测试并惊讶它是多么简单,无需在java中编写单行代码,它直接提供客户端 - 服务器长时间运行的过程!nailgun岩石! (6认同)

rog*_*ack 6

刚学会了今天的滴水,作为nailgun的另一个替代品:https://github.com/flatland/drip 另请参阅此页面了解一些一般性提示:另请参阅https://github.com/jruby/jruby/wiki/Improving -启动时间


rat*_*ath 6

我建议您参阅 Matthew Gilliard (mjg)关于该主题的博客文章。下面的任何代码示例都直接来自那里。我不会包括计时示例,部分是为了保持简短,部分是为了吸引您访问他的页面。Matthew 在Fn 项目中工作,因此他对弄清楚如何将启动时间保持在较低水平非常感兴趣。

显然有几种方法可以做到,有些方法也很简单。核心思想是缓存 JVM 的初始化周期,而不是在每次启动时都执行它。

班级数据共享 ( CDS )

CDS 缓存 JDK 的确定性(硬件相关)启动过程。这是书中最简单和最古老的(我相信从 1.5 开始)技巧(并且不是很出名)。

来自甲骨文

当 JVM 启动时,共享存档是内存映射的,以允许在多个 JVM 进程之间共享这些类的只读 JVM 元数据。启动时间减少,从而节省成本,因为恢复共享存档比加载类更快。

您可以通过运行手动创建转储

? java -Xshare:dump
Allocated shared space: 50577408 bytes at 0x0000000800000000
Loading classes to share ...
// ...snip ...
total   :  17538717 [100.0% of total] out of  46272512 bytes [ 37.9% used]
Run Code Online (Sandbox Code Playgroud)

...然后使用它

java -Xshare:on HelloJava
Run Code Online (Sandbox Code Playgroud)

AOT:提前编译(Java 9+)

来自 mjg 的博客

CDS 提前完成了部分核心类的类加载,而 AOT 实际上是提前将字节码编译为本机代码(ELF 格式的共享对象文件),并且可以应用于任何字节码。

使用SubstrateVM (Java 8+)

不是在博客文章中,而是在他几天前的演讲中展示的。

从自述文件

Substrate VM 是一个框架,它允许在封闭世界假设下将 Java 应用程序提前 (AOT) 编译为可执行映像或共享对象(ELF-64 或 64 位 Mach-O)。