2010-08-12 86 views
18

通過JVM -Xmx參數,可以將JVM的最大堆大小設置爲某個值。但是,有沒有辦法讓價值動態?換句話說,我想告訴JVM「看,如果你需要的話,只要不停地從系統中取內存,直到系統不存在爲止。」JVM最大堆大小可以動態變化嗎?

問題的兩部分原因: 首先,有問題的應用程序可以使用非常廣泛的RAM,具體取決於用戶在做什麼,所以概念最小值和最大值相差甚遠。其次,在啓動時,JVM似乎從虛擬內存中保留了最大堆空間。這個特殊的應用程序運行在各種各樣的硬件上,因此選擇「一刀切」的最大堆空間是很困難的,因爲它必須足夠低才能在低端硬件上運行,但我們真的喜歡能夠充分利用真正健壯的機器。

+1

可能的重複:http://stackoverflow.com/questions/763295/setting-jvm-heap-size-at-runtime – 2010-08-12 22:51:42

+1

和相關:http://stackoverflow.com/questions/2073869/how-to-以編程方式增加java-heap-size- – 2010-08-12 22:52:20

+1

與這些問題的區別在於意圖;我不想自己做任何事情,我只是希望JVM能夠爲我做出奇蹟般的事情。 :) – 2010-08-12 22:54:16

回答

8

但是,有沒有辦法讓這個價值動態?

從字面上看,沒有。最大堆大小設置爲JVM啓動時間,不能增加。

實際上,您可能會在處將最大堆大小設置爲與您的平臺所允許的一樣大,並讓JVM根據需要增加堆。這樣做有明顯的風險;即您的應用程序使用所有的內存並導致用戶的機器停下來。但是這個風險隱含在你的問題中。

編輯

值得注意的是,有各種-XX... GC調整選項,讓您調整的JVM擴展堆(達到最大)的方式。

另一種可能性是將您的應用程序分爲兩部分。應用程序的第一部分進行所有必要的準備工作,以確定問題的「規模」。然後找出適當的最大堆大小,並在新的JVM中啓動應用程序內存飢餓的第二部分。

  • 這隻適用於如果應用程序可以像上面那樣明智地分區。

  • 這隻有在可以計算問題大小的情況下才有效。在某些情況下,計算問題的大小無異於計算結果。

  • 目前還不清楚,如果您只是讓堆增長到最大規模,您將獲得更好的整體性能。

+0

這就是我的想法,我只是想確保... – 2010-08-12 22:55:23

+1

我討厭gravedig和所有,但是你能不能創建一個本地庫,以一種非常冒險的方式,通過realloc和設置合適的變量來調整堆大小? – 2013-03-12 16:17:53

5

它沒有。它可能,它可能應該:

-Xmx90% // 90% of physical memory 

但是,一個默認的隱含,100%,可能不是一個好主意。

用非GC語言編寫的程序非常認真地管理它的內存,它會盡快修剪任何垃圾。假設它負責提示垃圾處理,讓它獲得它請求的任何內存是有意義的。

GC語言不同。它只在必要時收集垃圾。只要有空間,它並不在乎垃圾纏綿。如果它能夠獲得它想要的所有內存,它將獲得計算機中的所有內存。

因此,GC程序員不必擔心會丟棄每一塊垃圾,但他仍然必須對可容忍的垃圾/活性物體比率有一個總體的瞭解,並指示GC使用-Xmx。

+0

優秀的建議! – 2013-05-24 10:35:36

+0

爲了補充一點,這個限制不是固有的GC'd語言,僅僅是可疑實現Java的選擇 – Basic 2015-03-25 15:55:44

+1

Microsoft Java實現(回頭)沒有'-Xmx'概念,並且可以分配儘可能多的內存是需要的。 – 2016-07-23 14:55:39

3

基本上,你不能適應使用純Java的各種用戶的硬件:這是當一些shell /批處理腳本可以派上用場的時候。

我在OS X和Linux上只是這樣做的:我有一點bash shell腳本負責根據運行應用程序的硬件找到正確的JVM參數,然後調用JVM。

請注意,如果你提供一個桌面Java應用程序,那麼你可能想使用類似的IzPack提供用戶安裝程序:

http://izpack.org

我不知道在所有的Java是否Web Start可以用來提供不同的JVM參數,具體取決於用戶的配置(可能不是,如果你打算提供一個專業的桌面應用程序,JWS真的會花大點時間)。