2015-07-28 157 views
5

有大量關於堆大小的Posts和網站,但沒有一個提到如何找出調用jvm時可以保留的最大可能堆大小。預留Java JVM最大堆大小

該任務是以最大可用堆大小xmx = max動態啓動我的jvm(無需在此處討論此任務的對象!)。

人們會想到讀取當前可用或空閒的內存,並將該大小用於xms和xmx。但這不起作用。

例如在64位計算機和Windows操作系統,具有24GB RAM上,約1.8 GB上可用的虛擬存儲器:

在JVM(那些已經通過其在進程中執行的Java命令C#確定)用32位啓動!根據其他網站和帖子,如:Maximum Java heap size of a 32-bit JVM on a 64-bit OS它應該在1.4GB以上變化。

[09.07.2015 08:39:39] Total physical memory MB:  24002 
[09.07.2015 08:39:39] Available physical memory MB: 16115 
[09.07.2015 08:39:39] Total virtual memory MB:   2047 
[09.07.2015 08:39:39] Available virtual memory MB:  1810 

調用Java程序:

的Java -Xms1536m -Xmx1536m對myApp

導致:

Could not reserve enough space for 1572864KB object heap

同樣下降到1136米一路,這是儘可能最大!

因此我的問題: 如何檢查堆棧大小可能調用jvm,沒有試驗的錯誤嗎?

UDPATE: 基於這些意見,我提出了所有那些Pro的另一個問題: 你們如何運行你的Java應用程序?

  1. 選擇你檢查了應用程序的堆需要約。並讓用戶死於一個錯誤,如果堆不可能
  2. 試驗一個錯誤:降低堆並重新運行你的應用程序,直到發現有效的最大堆
  3. 使用這種祕密的方式來確定保證的最大堆大小和運行它順利(如果是這樣,請放在你的信任圈:))

我對你的答案絕對好奇!

+0

'只有1136米是可能的!'你使用的是32位JRE嗎? –

+0

@FranMontero對不起,我忘記了這一點,看到更新回答 – gantners

+0

其實我在幾周前發佈了一個類似的問題XD http:// stackoverflow。com/questions/31533378 /無法運行-java-with-xmx-966m/31534282#comment51067983_31534282 –

回答

1

How to check upfront the heap size possible for calling the jvm, without trial and error?

有沒有辦法。

當然,沒有一種方法可以根據您需要處理的信息的種類給出可靠答案。

(如果有一種方法,那麼你可以肯定的是甲骨文會知道,並會告訴我們。)

的問題是,有太多的「變數」的公式中,許多其中的「隱藏變量」。

+0

好的,但最大可以改變一次到另一個?或者對於相同的JRE;,OS,RAM始終是相同的最大值? –

+0

是的,最大可能會有所不同。它也可能取決於應用程序,JVM設置,OS調整參數等。 –

+0

最大值可能因您要使用的堆內存量有多少而異,例如,線程堆棧,GUI組件,共享庫,直接緩衝區。你甚至不知道什麼是因爲你的JVM啓動了,以後你不會用完虛擬內存。 +1 –