簡體   English   中英

我可以設置從jar文件運行的Java最大堆大小嗎?

[英]Can I set Java max heap size for running from a jar file?

我正在啟動一個java jar文件,它通常需要超過默認的64MB最大堆大小。 但是這個應用程序的256MB堆大小已足夠。 無論如何指定(在清單中可能?)在啟動jar時總是使用256MB的最大堆大小? (如果需要,請在下面提供更多具體細節。)


這是一個我用Java編寫的命令行應用程序,它可以進行一些圖像操作。 在高分辨率圖像(大約12百萬像素及以上,這並不罕見)我得到一個OutOfMemoryError。

目前我正在從jar文件啟動應用程序,即

java -jar MyApp.jar params...

我可以通過在命令行上指定256MB最大堆大小來避免OutOfMemoryError,即:

java -Xmx256m -jar MyApp.jar params...

但是,我不想指定這個,因為我知道即使對於高分辨率圖像,256MB也足夠了。 我想將這些信息保存在jar文件中。 那可能嗎?

編寫包含以下行的批處理或shell腳本。 放入存儲MyApp.jar的文件夾。

java -Xmx256M -jar MyApp.jar

之后,始終打開此批處理/腳本文件以啟動JAR文件。 雖然,這不會將虛擬內存大小的規范嵌入到jar文件本身中。 但是,它可以覆蓋在命令行上經常編寫相同命令的問題。

您還可以使用像launch4j這樣的包裝器,它將為大多數操作系統生成可執行文件,並允許您指定VM選項。

我有類似的需求,並認為我應該能夠在清單中指定這個,如上所述。 但是,這是不可能的。 我的解決方案與上面提到的Alex類似,但是,我所做的是讓main方法使用Java的ProcessBuilder來啟動另一個Java進程。 啟動另一個進程時,您可以指定新進程的最大內存。 基本上你有一個Java進程啟動另一個。 這是一個小小的問題,但它確實有效,它仍然允許您通過雙擊Jar文件啟動您的應用程序,我知道您想要這樣做。 查看ProcessBuilder。

在谷歌找到答案

他對JAR文件說不,在JavaWeb Start中是,並且你應該在你的(可能是系統特定的)啟動器/包裝器腳本/應用程序中執行它。

這不是很好,但你可以將它作為一個可執行的JAR,然后在它的主要部分,讓它通過命令行執行自己作為非守護程序線程與適當的參數存儲在屬性文件或計算或任何其他,然后退出原件。 您甚至可以使用另一個需要這些參數的“真實”入口點來執行jar。

是! 你需要寫一個小的入門程序 - 我寫了一個小的大多數跨平台兼容(路徑應該沒問題)程序來做 - 見下文。 這已經在Windows / Ubuntu / Mac OS X上進行了測試。

關於增加可執行Java jar堆的Silent Development Blog文章

顯然這適用於Ubuntu

> export _JAVA_OPTIONS="-Xmx1g"

java -jar jconsole.jar&Picked up _JAVA_OPTIONS:-Xmx1g

有很多方法可以做到:

你可以通過另一個Jar文件觸發你的主Jar。

或者,有一個批處理文件,它將啟動你的jar。 但要小心,如果從網上下載,用戶必須設置腳本的權限才能運行

構建安裝程序。 在Mac上,使用適用於Java 7的Oracle Java App捆綁器,Apple App捆綁器for Java 6構建.app文件。 您仍然無法重新分發它,因為不會設置必要的權限。 為app文件構建dmg。 這可以用於分發。 適用於Windows的類似安裝程序

第三種技術是最好的,因為您可以很好地打包依賴項,設置所有JVM參數等

暫無
暫無

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

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