2016-12-02 81 views
1

我有一臺帶有16GB RAM的Windows 7筆記本電腦。當我運行多個java服務器時,出現OutOfMemory錯誤,但是,Windows任務管理器顯示我仍有6GB剩餘物理內存。在我看來,我的JVM只能爲所有正在運行的java應用程序分配〜2GB的堆。64位JVM無法爲對象堆預留足夠的空間

所以我寫了一些非常簡單的Java代碼:

public class HelloWorld { 
    public static void main(String[] args) { 
     for(;;) System.out.println("Hello, World"); 
    } 
} 

我-jvm版本:

$ java -version 
java version "1.8.0_111" 
Java(TM) SE Runtime Environment (build 1.8.0_111-b14) 
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode) 

JAVA_HOME 「C:\ Program Files文件\的Java \ jdk1.8.0_111」

JRE_HOME「C:\ Program Files \ Java \ jre1.8.0_111」

我做了一個簡單的java -Xmx256m -Xms256m HelloWorld,它的工作糟透了不如預期,但是當我切換到java -Xmx2048m -Xms2048m HelloWorld我得到如下:

Error occurred during initialization of VM 
Could not reserve enough space for object heap 

我試過多個JDK,但他們都不工作。窗口和JVM都在64位。

我能做些什麼來解決這個問題?

+0

vmmap可能重複[「VM初始化期間發生錯誤;無法爲對象堆預留足夠的空間「使用-Xmx3G](http://stackoverflow.com/questions/9303889/error-occurred-during-initialization-of-vm-could-not-reserve-enough-space-for) 。特別是,看到這個答案http://stackoverflow.com/a/9304270/529630 – Dunes

+0

你有交換啓用? windows的內存記帳與linux相比是不同的。 – the8472

回答

1

在我看來,我的JVM只能爲所有正在運行的java應用程序分配〜2GB的堆。

這是不正確的。 JVM能夠請求並使用> 2GB的堆。

它必須是Windows限制了Java進程可以請求的內容。也可能是Windows爲多個Java進程保留了內存,但內存顯示爲空閒,因爲JVM尚未使用它。

FWIW,運行帶有比他們真正需要更多內存的JVM並不是一個好主意。

修復?

  1. 不要這樣做。不要在筆記本電腦上運行大量的2GB Java服務器,或將堆大小減小到更合理的值。在JVM開始使用您分配給它們的所有內存之前,過度使用內存是一個有吸引力的想法。然後你的系統就會崩潰...

  2. 以不同的方式做。您可以在單個JVM中運行多個服務器。

  3. 獲得更多的記憶。

0

只是不要使用-Xms2048m。它使JVM一次請求連續2Gb的內存塊。讓JVM決定何時爲堆需求獲取額外的內存。在Windows的情況下,您觀察到的效果可能是映射到proc虛擬內存(防病毒,防火牆,rootkit,病毒等)的嚴重對齊DLL導致虛擬內存碎片化的結果。從ide運行java,使用代理(使用本地impl)也可以添加隱藏內容來處理虛擬內存。觀察虛擬內存過程的一個很好的工具是從Microsoft Sysinternals suite

相關問題