2015-10-09 33 views
3

我有一個帶有20GB RAM和Ubuntu OS的VPS。我正在嘗試使用JAVA_TOOL_OPTIONS分配10GB內存作爲Java的最大堆,但我不能。請參閱附件截圖。它顯示可用內存爲17GB。它在我嘗試設置爲7GB時工作。但是,只有當它> 7GB時纔會出現堆錯誤。我已經安裝了glassfish並將3Gb分配給它的集羣。它的工作正常。但是當我有17GB RAM空閒時,爲什麼我不能分配大於7GB的內存。Ubuntu中的Java OutofMemory錯誤即使有足夠的內存可用

enter image description here

enter image description here

TOP enter image description here

ULIMITS

enter image description here

Java的版本 enter image description here

內存過

enter image description here

我的硬件的虛擬託管。下面是配置

  • 架構:x86_64的
  • CPU運算模式(一個或多個):32位,64位
  • 字節順序:小端
  • CPU(S):16
  • 供應商ID:GenuineIntel
  • CPU家族:6
  • 型號:26
  • 步進:5
  • CPU兆赫:2266.802
  • BogoMIPS:4533.60
  • 虛擬化:VT-X
+0

你可以跑上面看看還有其他什麼東西在跑?如果還有其他的東西。 – ryekayo

+0

向我們展示運行'java -version'的輸出;即您使用的是Java發行版/內部版本? –

+0

如果您使用的是64位版本的Java,那麼您可以檢查您的VPS使用的是哪種硬件(主板)? –

回答

0

我之所以不能分配超過5G的原因是因爲私密空間被設置爲5G。

我們可以得到該命令在Linux中的信息「執行cat/proc/user_beancounters

此外,VPS,主機託管提供商不會讓我們來定製這個值。我們必須去大型虛擬或專用服務器來增加這個限制。

這是根本原因。然而,斯蒂芬和羅賓對虛擬內存和RES內存的解釋是現實的。謝謝你們夥計

2

如果我猜的話,你沒有的RAM這7GB的連續塊,這似乎不可思議,但不知道更多關於虛擬機的分配情況,很難說。

這裏是甲骨文對此事(http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_oom)說:

The VM prints "OutOfMemoryError" and exits. Increasing max heap size doesn't help. What's going on?

The Java HotSpot VM cannot expand its heap size if memory is completely allocated and no swap space is available. This can occur, for example, when several applications are running simultaneously. When this happens, the VM will exit after printing a message similar to the following.

Exception java.lang.OutOfMemoryError: requested bytes

-Xmx-Xms-Xmx

For more information, see the evaluation section of bug 4697804.

+0

羅賓,我使用64位。 「你沒有連續的RAM塊」是什麼意思?你能解釋一下嗎?這個解釋是否適用於64位?早些時候,我有一個專用的機器與32 GB和我succesffully分配10到25 GB沒有任何問題....但是,即使我有16 GB的RAM保證,我爲什麼不能分配甚至8〜10GB的虛擬機? – Kenshin

+1

您的後續編輯顯示實際的資源使用情況非常明顯。斯蒂芬C的回答幾乎總結了它;當沒有足夠的頁面文件空間(可用RAM)時,JVM將使用虛擬內存(硬盤驅動器)。 JVM如何決定何時將頁面文件交換到虛擬內存或從虛擬內存交換頁面文件取決於正在運行的進程。這就是爲什麼建議保留相當於系統RAM的硬盤驅動器交換空間,以確保頁面文件可以交換。 –

+1

我忽略澄清「連續RAM」。 RAM被分配爲頁面文件。這些頁面需要是一個連續的可尋址空間塊。所以,即使你有大量的RAM,如果是零散到如此地步,沒有一個大到足以支持頁面文件的要求,那麼你有效地出門在外的堆空間。我不知道JVM如何分配的堆空間的初始請求,但如果它試圖創建一個單一的連續塊,所以它可以管理頁面,那麼你需要的尋址空間那是足夠大的塊。 7GB是一個大塊。 –

1

我想你可能是交換空間。當我在「virt」列中加上內存時,它會達到40+ Gb。


Why it's taking that much swap space ? What needs to be done in order to fix this ?

那麼,根據top你正在運行:

  • Glassfish的 - 9。1G
  • MySQL守護進程 - 5.4G
  • 哈德森 - 8.9克
  • 的Nexus - 6G
  • Glassfish的 - 6.9克(第二個實例)

和雜物等東西。 「virt」是它們的虛擬內存總佔用空間,其中一些將是可以共享的代碼段。

他們大多數似乎有一個小的「res」(駐留內存),這就是爲什麼有這麼多的空閒RAM。但是,如果其中的一部分在系統內存需求猛增的同時出現,系統可能會開始癱瘓。

我的建議是將Hudson和Nexus服務移至單獨的虛擬機。或者如果這是不可能的,請增加交換空間的大小......並希望不要發生顛簸。


This is true. But is this a normal behaviour?

是。

is this how memory allocation works?

是的。這確實是虛擬內存的工作原理。

I am confused with Resident memory, virtual memory and physical memory now.

而非詳細解釋,我建議你閱讀virtual memory維基百科頁面開始。

+0

爲什麼需要這麼多交換空間?爲了解決這個問題需要做些什麼? – Kenshin

+0

但是爲什麼?我將3G的最大尺寸分配給glassfish 1st實例,1GB分配給2nd。爲什麼它需要這麼多空間?如何限制?我必須更改vm.overcommit比率和內存的配置嗎?我也附上了截圖。請讓我知道如何解決這個問題? – Kenshin

+0

斯蒂芬,正如你所說,一旦我停止了Nexus和哈德森我設法開始佔據3G的GlassFish的第二個實例。 '他們大多數似乎有一個小的「res」(常駐記憶),這就是爲什麼有這麼多空閒的RAM。但是,如果其中一些產品在系統啓動的同時出現內存需求急劇上升,系統可能開始出現顛簸。「這是真的。但這是一個正常的行爲?這是如何內存分配的作品?我現在困惑於駐留內存,虛擬內存和物理內存。 – Kenshin

相關問題