2013-09-26 51 views
0

我正在研究加載文件並使用其信息填充Model類的程序。這些文件的大小可以從幾KB到幾乎GB。當它們的大小波動時,Model類使用的內存也一樣。如何防止文件加載時發生Java的OutOfMemoryError?

當我加載足夠大的文件時,我收到OutOfMemoryError

我能夠拒絕加載文件的用戶請求(基於文件大小)。我如何檢查一個文件,確定它的大小,然後確定應用程序是否可以處理它?

有沒有辦法讓這個適應用戶計算機上的RAM數量?

+0

只是一個雖然。基於'RAM',您可以對文件進行分區並以塊的形式將其加載到內存中,並填充「模型」類。 – Prateek

+0

試着看一下這個問題: [用java來獲得操作系統級的系統信息] [1] [1]:http://stackoverflow.com/questions/25552/using-java-to- get-os-level-system-information – BobbyD17

+0

@Prateek就像我喜歡這個想法一樣,我不認爲它是超載堆的文件。我認爲'模型'正在變得太大 - 所以分開它不會有太大的區別。 – sdasdadas

回答

2
You can query the JVM to see how much free and used memory there is : 

/* Total amount of free memory available to the JVM */ 
System.out.println("Free memory (bytes): " + 
Runtime.getRuntime().freeMemory()); 

/* This will return Long.MAX_VALUE if there is no preset limit */ 
long maxMemory = Runtime.getRuntime().maxMemory(); 
/* Maximum amount of memory the JVM will attempt to use */ 
System.out.println("Maximum memory (bytes): " + 
(maxMemory == Long.MAX_VALUE ? "no limit" : maxMemory)); 

/* Total memory currently in use by the JVM */ 
System.out.println("Total memory (bytes): " + 
Runtime.getRuntime().totalMemory()); 
+0

謝謝,'freeMemory()'命令就是我要找的東西,而且你用這個命令擊敗了這個命令。時間到了,我會接受的。 – sdasdadas

2

使用File.length()來確定文件的大小,並拒絕它是否太大。

你怎麼知道它是否太大?使用Runtime.freeMemory()來查看你剩下多少堆。當然,加載文件並將其填充到Model類中會佔用額外的內存,並且實際上可能不會保留文件的全部內容。您應該留出足夠的空間,根據您對如何使用數據的瞭解,加載課程中的所有數據。

請注意,JVM通常不會分配給用戶計算機中的所有內存,但可能默認爲某個較小的數字。如果用戶對默認值不滿意,可以使用Xmx選項修改它。

+0

是的,但我怎麼知道它是否太大?對於其他用戶的計算機,對於一個用戶的計算機而言可能太大。 – sdasdadas

+0

確定並設置一個上限,您知道舊的機器仍然會支持上限,所以永遠不會用完內存。較新的機器永遠不會使用所有的內存,但舊機器仍然可以使用您的網站。 –

相關問題