2010-05-04 62 views
2

是否有一個用於內存的實用程序(對於Windows),因此我可以創建一個JVM「無法爲對象堆預留足夠的空間」錯誤?創建「無法爲對象堆預留足夠的空間」錯誤

我想在JVM之外的進程中使用此內存。

+0

在什麼平臺上? – 2010-05-04 15:18:47

+0

這裏真正的目標是什麼?由於盒子內存耗盡使JVM無法啓動?或者你只是在尋找任何技巧來打印信息? – 2010-05-04 23:00:30

回答

7

只需使用-Xms標誌

java -Xms3g org.foo.Main 

以上將嘗試創建3 GB的初始堆大小,只需調整數量,以便它比你的系統的總內存較大(物理&虛擬)

+0

這實際上不會像你在32位Windows機器上解釋的那樣工作,或者至少在我認爲你的意思上是這樣。 JVM需要堆的連續地址範圍,而Windows有2GB的漏洞。所以是的,它失敗了,但不一定是盒子內存不足,而是因爲它不適合單個地址空間。 – 2010-05-04 22:59:36

-1

我想你可以用這一個嘗試:

String s = "b"; 
for (int i = 0; i < 1000 000; i++) { 
    s+="b"; 
} 

因爲新的字符串將每次S + =「b」的運行線路,它應該運行了Java堆分配。

+0

舊的字符串可以在每次堆耗盡時收集垃圾,因此智能實現可能永遠不會因此發出異常。 – Arkku 2010-05-04 15:31:55

+0

他們仍然必須存儲結果字符串。因此,它可能是無限遞增給定的字符串。 – Puppy 2010-05-04 15:49:10

-1
List<Object> leak = new ArrayList<Object>(); 
while(true) { 
    leak.add(new Object()); 
} 
-1

您可以通過運行一些腳本使用了內存的任意量是這樣的:

public static void main(String[] args) 
{ 
    List<String> l = new ArrayList<String>(); 
    for (long i = 0 ; i < 100000000l ; i++) 
    { 
     l.add(new String("AAAAAAA")); 
    } 
} 

具有足夠大的堆空間(例如, -Xmx1024M)。問題在於,任何現代操作系統都會嘗試使用虛擬內存來允許應用程序仍然運行,這將導致硬盤驅動器發生顛簸而不是JVM的內存不足。您可能需要將您的操作系統總交換空間設置爲實際遇到此方案的某些內容。

-1

這是給你一個小C程序會消耗在命令行上指定的字節數:

#include <stdlib.h> 
int main(int argc, char *argv[]) { 
    int bytes = atoi(argv[1]); 
    char *buf = malloc(bytes); 
    while (1) { 
    int i; 
    for (i = 0; i < bytes; i++) buf[i] += 1; 
    } 
} 
相關問題