2013-05-03 49 views
2

我收到的評論線以下錯誤:我如何解決的OutOfMemoryError:Java堆空間

"OutOfMemoryError: Java heap space" 

的data.bin文件很大所以這個錯誤的預期。我的問題是我如何解決這個錯誤?我已經看到了一些東西,如-Xmx1024m或相似的,但我不知道怎麼辦好,使用jgrasp編譯

try { 
    RandomAccessFile data = new RandomAccessFile("data.bin","rws"); 
    long l = data.length(); 
    long recs = l/1024; 
    long cnt = 0; 
    byte []b = new byte[1024]; 

    while(cnt < recs){ 
     cnt++; 
     data.readFully(b); 
     byte []key = Arrays.copyOfRange(b, 0, 24); 
     byte []value = Arrays.copyOfRange(b, 24, 1024); 
     en = new TEntry<String, String>(new String(key), new String(value));//ERROR 
     lst.add(en); 
    } 
+0

[changed jvm heap size - jgrasp]可能的重複(http://stackoverflow.com/questions/8332370/changing-jvm-heap-size -jgrasp) – 2013-05-03 05:01:39

+0

-Xmxn和-Xmsn是決定應用程序堆大小的最大值和最小值。 – prasanth 2013-05-03 05:04:51

回答

2

可以使用下面的命令增加你堆/堆棧大小:

-Xms<size>  set initial Java heap size 
-Xmx<size>  set maximum Java heap size 
-Xss<size>  set java thread stack size 

您還可以找到更多descriptive answers over here

1

您需要根據您的需要並在可用主存儲器的邊界內設置堆最小和最大大小。你可以通過在java運行時添加以下參數來實現這一點: -J-Xmx1024m -J-Xms512m

你在Windows上嗎?在安裝文件夾中有一個名爲「winconfig.exe」的文件,雙擊它可以改變你的堆。如果你在Linux或者Mac OS上,它可能被稱爲類似的東西(在其中有「config」一詞)。

jgrasp -J-Xmx512m -J-Xms512m

0

您正試圖將整個文件加載到內存中。當您將字節轉換爲字符串時,它將佔據文件大小的兩倍。 (字符串使用16位字符)要麼有足夠的內存來做到這一點(在這種情況下會增加最大值),要麼在程序執行時需要更改。

不是試圖加載所有的鍵和值,而是隻加載值並記住這些值的位置。即爲該值存儲文件中的偏移量。

當您再次查找該值時,需要根據需要讀取該值。在這種情況下,它可能會將內存減少20倍。

相關問題