Java 有没有办法提高JVM启动速度?

Java 有没有办法提高JVM启动速度?,java,performance,jvm,daemon,startup,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-ap

据说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
$time xlsx2csv.py Types\of\ESI\v2.doc-emb-Package-9
...
实际0.085s
用户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
实际0m2.055s
用户0m2.433s
系统0m0.078s
同样的文件,Docx和Python内部的12 KB ms XLSX嵌入式文件速度快25倍!!啊

Java需要2.055秒

我知道这都是因为启动时间,但我需要的是我需要通过一个脚本调用它来解析一些我不想在python中重新发明轮子的文档

但对于解析10k+文件来说,这是不实际的

无论如何,为了加快速度(我已经尝试了-client选项,但它只加快了很少的速度(20%)

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

试试


注意:我不亲自使用它。

嗯。。。将文档写入目录(如果还没有),让Java程序一次性处理所有文档?

有很多方法可以做到这一点-基本上,只要在批处理过程中保持JVM的活动状态,任何方法都可以工作

e、 例如,为什么不改变Java程序,在一次JVM调用中循环所有文件并处理它们呢

或者,您可以在Swing中构建一个简单的GUI应用程序,并使用某种可视化方式来运行批处理(例如,选择目标目录,然后按“处理所有…”按钮)

或者,您也可以使用脚本作为编写适当Java作业执行脚本的一种方式


或者,您可以创建一个服务器进程,并通过该进程发送所有文件。…

今天刚刚了解了滴水,作为钉子枪的替代品:
另请参见本页了解一些一般提示:另请参见将您的程序更改为客户机/服务器模式,其中Java部分是一个只启动一次的持久服务器,由一个告诉它该做什么的客户机提供。客户端可以是一个小的Python脚本,告诉服务器进程要使用哪些文件。可能通过套接字发送命令或信号给您。

我建议您参考Matthew Gilliard(mjg)的主题。下面的任何代码示例都是直接从这里开始的。我将不包括时间示例,部分是为了保持简短,部分是为了引导您访问他的页面。Matthew致力于这项工作,因此他对如何保持低启动时间非常感兴趣

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

类数据共享() 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]
…然后与

java -Xshare:on HelloJava
:提前编译(Java 9+) 来自mjg的博客

当CDS预先对核心类进行部分类加载时,AOT实际上预先将字节码编译为本机代码(ELF格式的共享对象文件),并且可以应用于任何字节码

使用(Java 8+) 不是在博客上,而是在他几天前的演讲中展示的

自述文件:

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


听起来很完美!!这就是我需要的!!让我试试看,会让你知道的。完美的解决方案。我已经测试并惊讶于它是多么简单,不需要用java编写一行代码,它直接为客户机-服务器提供了一个长期运行的过程!钉枪岩石!还提到滴水等…@Zan回答得很好!另外,Nailgun不安全。谢谢,但是,我正在做的是服务器端,web应用程序,ajaxed。是的,我已经有了ProcessAll按钮,目录浏览器,搜索引擎,所有的东西都已经用Python编写好了(搜索引擎是C中的Sphinx)。问题是,每次解析都需要通信回来(为了处理,放在数据库中),所以这不是重点,感谢tho,我已经考虑了这个选项。不能相信没有人提到过使用JRuBy> = 1.7.2的最新版本的JavaPosiple DoWord Debug工作吗?到目前为止,我测量任何显著加速的尝试都没有成功(即使是在通过rails new生成的一个小项目上执行的rake环境也没有好处)。[我从来没有尝试过。]什么操作系统?钉枪有用吗?(可能会问滴水的人?)显然它“可以”与jruby一起工作,而且我相信从1.7.1开始就应该有一个dripMain方法