我正在研究加載文件並使用其信息填充Model
類的程序。這些文件的大小可以從幾KB到幾乎GB。當它們的大小波動時,Model
類使用的內存也一樣。如何防止文件加載時發生Java的OutOfMemoryError?
當我加載足夠大的文件時,我收到OutOfMemoryError
。
我能夠拒絕加載文件的用戶請求(基於文件大小)。我如何檢查一個文件,確定它的大小,然後確定應用程序是否可以處理它?
有沒有辦法讓這個適應用戶計算機上的RAM數量?
我正在研究加載文件並使用其信息填充Model
類的程序。這些文件的大小可以從幾KB到幾乎GB。當它們的大小波動時,Model
類使用的內存也一樣。如何防止文件加載時發生Java的OutOfMemoryError?
當我加載足夠大的文件時,我收到OutOfMemoryError
。
我能夠拒絕加載文件的用戶請求(基於文件大小)。我如何檢查一個文件,確定它的大小,然後確定應用程序是否可以處理它?
有沒有辦法讓這個適應用戶計算機上的RAM數量?
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());
謝謝,'freeMemory()'命令就是我要找的東西,而且你用這個命令擊敗了這個命令。時間到了,我會接受的。 – sdasdadas
使用File.length()來確定文件的大小,並拒絕它是否太大。
你怎麼知道它是否太大?使用Runtime.freeMemory()來查看你剩下多少堆。當然,加載文件並將其填充到Model
類中會佔用額外的內存,並且實際上可能不會保留文件的全部內容。您應該留出足夠的空間,根據您對如何使用數據的瞭解,加載課程中的所有數據。
請注意,JVM通常不會分配給用戶計算機中的所有內存,但可能默認爲某個較小的數字。如果用戶對默認值不滿意,可以使用Xmx選項修改它。
是的,但我怎麼知道它是否太大?對於其他用戶的計算機,對於一個用戶的計算機而言可能太大。 – sdasdadas
確定並設置一個上限,您知道舊的機器仍然會支持上限,所以永遠不會用完內存。較新的機器永遠不會使用所有的內存,但舊機器仍然可以使用您的網站。 –
只是一個雖然。基於'RAM',您可以對文件進行分區並以塊的形式將其加載到內存中,並填充「模型」類。 – Prateek
試着看一下這個問題: [用java來獲得操作系統級的系統信息] [1] [1]:http://stackoverflow.com/questions/25552/using-java-to- get-os-level-system-information – BobbyD17
@Prateek就像我喜歡這個想法一樣,我不認爲它是超載堆的文件。我認爲'模型'正在變得太大 - 所以分開它不會有太大的區別。 – sdasdadas