2011-12-15 42 views
0

我有一個應用程序將使用3億大小的哈希映射。爲此,我初始化JVM,初始和最大堆大小爲16 GB,即(java -Xms16384M -Xmx16384M),但是我得到java OutOfMemoryError。我的機器安裝了RedHat Linux操作系統,具有32 GB RAM。我觀察到JVM在Linux中只使用「top」命令的25%的RAM,即8GB,即使我將它設置爲16GB,但它僅使用8GB。獲取java內存不足錯誤?即使我給了JVM足夠的初始和最大內存大小

我想知道如果JVM限制了RAM嗎?

如何配置JVM以使用給定的完整最小和最大堆大小?

+0

您可以發佈確切的錯誤信息和完整的Java調用? – tobiasbayer 2011-12-15 15:04:34

回答

0

你能發佈異常堆棧跟蹤嗎?如果您發佈的數字是正確的,那麼您可能會耗盡永久內存(permagen錯誤),在這種情況下,您還需要添加-XX:PermSize和/或-XX:MaxPermSize標誌。您使用的是哪個JVM版本?

0

垃圾收集器也需要一些堆(如果大部分東西是在年輕一代中的幾乎一半是由複製集合處理的話)該內存將保持不變以供GC使用。

1

你可以試試這個程序嗎?

System.out.println("Max memory "+Runtime.getRuntime().maxMemory()/100 /1000+" MB."); 
int mb = 0; 
try { 
    List<byte[]> bytes = new ArrayList<>(); 
    while (true) { 
     bytes.add(new byte[1000 * 1000]); 
     mb++; 
    } 
} catch (OutOfMemoryError expected) { 
} 
System.out.println("OOME after " + mb + " MB allocated"); 

什麼打印您的設置?對於-mx8g我得到

Max memory 7635 MB. 
OOME after 7025 MB allocated 

對於-mx12g我得到

Max memory 11453 MB. 
OOME after 10012 MB allocated 

-mx12g -XX:MaxNewSize=512m我得到

Max memory 12705 MB. 
OOME after 12863 MB allocated