簡體   English   中英

有什么方法可以提升JVM啟動速度?

[英]Any way to boost JVM Startup Speed?

據說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

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

Java需要2.055秒。

我知道這完全是由於啟動時間,但我需要的是我需要通過腳本調用它來解析一些我不想在python中重新發明輪子的文件。

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

無論如何要加快它(我已經嘗試過-client選項,它只加速這么少(20%))。

我的另一個想法? 將其作為長時運行的守護進程運行,在本地使用UDP或Linux-ICP套接字進行通信?

試試Nailgun

注意:我不親自使用它。

剛學會了今天的滴水,作為nailgun的另一個替代品: https//github.com/flatland/drip另請參閱此頁面了解一些一般性提示:另請參閱https://github.com/jruby/jruby/wiki/Improving -啟動時間

嗯...將文檔寫入目錄(如果它們尚未存在)並讓Java程序一次性處理所有這些文檔?

將程序更改為客戶端/服務器模型,其中Java部分是僅啟動一次的持久性服務器,由客戶端提供,告知其執行操作。 客戶端可以是一個小的Python腳本,告訴服務器進程要使用哪些文件。 也許通過套接字或信號發送命令由您決定。

我推薦給Matthew Gilliard(mjg)關於這個主題的博客文章 下面的任何代碼示例都直接來自那里。 我不會將時間示例部分包含在內,以保持簡短,部分原因是為了誘使您訪問他的頁面。 Matthew在Fn項目上工作,因此他非常有興趣弄清楚如何保持低啟動時間。

顯然有幾種方法可以做到,有些方法也很簡單。 核心思想是緩存JVM的初始化周期,而不是在每次啟動時執行它。

類數據共享( CDS

CDS緩存JDK的確定性(硬件相關)啟動過程。 這是本書中最簡單,最古老的(自1.5以來我認為)技巧(並不是很有名)。

來自Oracle

當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

AOT :提前編譯(Java 9+)

來自mjg的博客

在CDS預先對核心類進行類加載的某些部分的情況下,AOT實際上事先將字節碼編譯為本機代碼(ELF格式的共享對象文件),並且可以應用於任何字節碼。

使用SubstrateVM (Java 8+)

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

從自述文件

Substrate VM是一個框架,允許在封閉世界的假設下將Java應用程序提前編譯(AOT)到可執行映像或共享對象(ELF-64或64位Mach-O)。

有很多方法可以做到這一點 - 基本上任何東西都可以工作,只要它在所有批處理過程中保持JVM活着。

例如,為什么不改變Java程序來循環遍歷所有文件並在JVM的一次調用中處理它們?

或者您可以在Swing中構建一個簡單的GUI應用程序,並以一些可視方式運行批處理(例如,選擇目標目錄,然后按“Process All ...”按鈕)。

或者您可以使用Clojure REPL作為編寫相應Java作業執行腳本的方法....

或者您可以使用Netty之類的東西創建服務器進程並通過它發送所有文件....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM