2017-08-13 156 views
4

我正在製作一個Java程序。 它涉及到尺寸高達9933 * 14043像素(這是A0尺寸和300 PPI)的圖像。圖像是24位,所以它將佔用大約400mb的空間。 BufferedImage類一些如何比位圖的實際大小佔用更多的RAM,所以圖像將佔用大約600 MB的RAM。 使用其他數據時,應用程序在渲染大圖時最多需要700 mb的內存。到目前爲止,我還沒有遇到任何問題。但是,如果最終用戶沒有足夠的可用內存,則JVM將無法爲位圖分配內存,並會拋出OutOfMemoryError。我應該在我的Java程序中使用多少內存?

那我該怎麼辦?

我想出了:

  1. 捕獲錯誤並拋出提示給用戶。
  2. 等一段時間,直到這裏有足夠的內存。如果等待時間過長,則會提示。
  3. 編寫我自己的位圖類,並用FileOutputStream部分編寫圖像。 .bmp格式不是非常複雜。 (實際上,我已經寫了大部分內容並進行了優化。)通過部分渲染位圖,整個圖像不必留在RAM中。可根據可用內存大小動態更改部件的大小。然而這是重新發明輪子並且需要大量工作。此外,涉及文本的圖像部分必須放置在BufferedImage中,然後轉換爲我的類(因爲我不想查看真正的字體格式)。無論如何,如果Java BufferedImage類在我的情況下工作,我不會這樣下去。
+1

使用'-Xmx'標誌增加內存限制有什麼問題嗎? –

+0

從OutOfMemoryError中恢復並不可靠。因此,在一段時間後重試它可能會產生意想不到的結果。 –

+0

通過等待一段時間,我的意思是使用Runtime.freeMemory()方法來查找可用內存,直到可用內存量大於所需內存爲止。 –

回答

3

我懷疑現在任何人都沒有少於ram的演出。所以你可以檢查用戶是否有足夠的內存與Runtime.getRuntime().maxMemory(),如果他們不只是顯示錯誤,並關閉。下面是在錯誤的情況下使用JOptionPane一個例子:

long memory = Runtime.getRuntime().maxMemory(); //in bytes 
long required = 700 * 1024 * 1024; //700MB, in bytes 
if(memory < required) { 
    JOptionPane.showMessageDialog(null, "You don't have enough memory. (700MB required)", "Error", JOptionPane.ERROR_MESSAGE); 
    System.exit(0); 
} 

maxMemory()返回JVM將嘗試使用(以字節計)的存儲器的最大量。

+0

也許我太擔心了,但如果用戶在同一時間運行一些ram消費程序(遊戲或Photoshop是什麼)呢? –

+0

您可以使用'freeMemory()'重複檢查免費的內存 – Professor901

相關問題