2015-05-22 36 views
1

假設我使用-Xms256m -Xmx1024m運行tomcat,但想增加我的堆使用率。使用java服務器應用程序必須留給操作系統多少內存?

我可以分配的最大安全堆大小是多少?

對於這個問題的目的,請假設,系統有5GB內存,是一個z/Linux系統。但是,如果可能的話,我想要一個更廣泛的經驗法則答案。

這是專用系統,所以我主要擔心操作系統的內存使用情況。我並不擔心其他項目。

此外,如果這是重複的,抱歉。我很驚訝,我沒有找到關於這種事情的更多信息。 PS:我知道可能有一些更多的系統信息需要使用。我不介意答案是否詳細說明如何找到答案,而不是給我一個數字。

+0

不要緊,如果你指定了很多內存,它只會使用它可以使用的內容 – brso05

+0

除非你有大量的網絡連接或其他不尋常的東西,否則幾乎可以忽略操作系統的內存使用情況,只需添加一點就可以了計算需要多少內存來保存緩存(以將I/O工作集保留在RAM中)。你也應該保留1%左右的頁表。 –

+1

你在x64或x32位機器上嗎? – brso05

回答

0

如果您完全關心性能,您將希望避免堆交換所有成本。這意味着您必須確保系統上的總預留內存少於可用RAM。

設置堆大小的經驗法則很難給出,因爲我們無法知道系統或應用程序的本機內存消耗。

例如,您的Java應用程序將消耗本地內存來處理元數據空間和JNI數據。

我認爲你能做的最好的事情是以不太積極的堆大小運行應用程序(想象一下5 GB RAM系統上的3 GB),以發現它通常消耗多少本機內存。

當你知道這一點,你可以相應大小的堆,並確保你留下一些記憶騰出(想想10%),以防萬一和OS級別的緩存

思想的過程應該是這樣的:

  • 記憶,當我在系統上運行沒有什麼消耗是200 MB

  • 通常是通過我的Java應用程序消耗本機內存爲300 MB

  • 我想500 MB的OS級別的緩存和 「以防萬一」

  • 然後,我應該能夠對我最大堆大小設置爲5000 - 500 - 300 - 200 = 4000 MB

+0

您忘記了Java虛擬機的內存大小不僅限於Java堆使用的內存大小。有本地堆,以及每個線程擔心的Java和本地堆棧。開銷(在堆頂上)有時會令人驚訝。我已經看到JVM的總使用內存是最大堆大小的兩倍。 –

+0

@ChristopherSchultz這就是我試圖通過編寫的觀點之一「例如,您的Java應用程序將消耗本地內存,用於像元數據和JNI數據這樣的東西。」並且「通常我的Java應用程序使用本機內存......」我的意思就是這個。雖然我的答案似乎可以更清晰。 –

相關問題