2010-10-06 168 views
0

我有一個程序,使用大量的圖像。 它從文件中加載了很多圖像,並將它們存儲起來,因此只加載一次。 它還創建了多個BufferedImages,大約400x400,其中不會超過10個。Java圖像佔用太多內存

來自文件的圖像總計大約6MB。 每個BufferedImage應該大約400x400x4 = 640KB。

但是,內存使用量是500MB!

其中的一部分將用於該程序的其餘部分,但我確信圖像佔用了大部分空間。

有沒有人知道該怎麼辦? 或使用較少內存的BufferedImage的替代方法?

+3

聽起來很腥,我會在責怪圖書館之前責怪你的代碼,對不起。小心粘貼一些?當你強制垃圾收集器運行時會發生什麼?必須有一些Java可用的內存分析器。 http://www.google.com/#hl=en&expIds=17259,18168,26792,26885,27006&sugexp=ldymls&xhr=t&q=memory+profiler+java&cp=17&pf=p&sclient=psy&safe=off&aq=0&aqi=g4g-o1&aql=&oq = memory + profiler + j&gs_rfai =&pbx = 1&fp = 7c8f32f65b860aba – 2010-10-06 01:24:43

+0

同意Hamish,它可能是加載和緩存圖像的代碼中的一個錯誤。也許它實際上每次加載和緩存圖像不止一次。 – 2010-10-06 01:26:08

+0

是的,最初我認爲這是一個內存泄漏。但是一開始,最多的就是400x400 BufferedImages中的10個。開始時它是500MB,它似乎並沒有從那裏增長很多,它在開始時只是一個巨大的數額。 @Hamish我們試圖強制垃圾收集器,但這並沒有太多。當我有機會時,我會研究內存分析工具。至於粘貼代碼,這將是不切實際的,因爲它實際上是相當意大利麪。我們正在爲大學的一個團隊項目開發一個冒險遊戲,代碼是一個完整的mess = s。 – DanielGibbs 2010-10-06 10:13:30

回答

4

這聽起來像我的應用程序(而不是庫)有內存泄漏。在第一種情況下,您應該嘗試使用標準的Java內存分析器來識別泄漏。

編輯

現在你已經確定了有很多BufferedImages遊逛,你需要做的下一件事就是找出爲什麼他們仍然到達。拿堆轉儲,看看一些實例,看看它們是如何連接到堆根的;請參閱http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/heapdump.html

在做這類東西時,使用您最喜愛的Java IDE查看Java源代碼的相關部分很有用。

+0

Steven,如何使用它?任何好的鏈接?謝謝。 – 2010-10-06 02:05:54

+1

從VisualVM開始http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/profiler.html ...或者在註釋中查看上面提供的Google搜索結果。 – 2010-10-06 02:23:00

+0

謝謝!我沒有意識到我的機器上一直都有這個...好像看起來BufferedImages是問題,我有206個= O。但是我的所有對象都沒有提及它們中的大多數!所以他們似乎堅持在我完成他們後... – DanielGibbs 2010-10-06 10:55:17

1

您的程序是一個Web應用程序嗎?或者您正在開發類似JRE的應用程序?你如何加載你的圖片?

在基於Web的應用程序中,我將使用CSS-Sprite圖像來解決我的問題,因爲它會中斷多個HTTP請求並在加載時提高帶寬使用率和內存使用率。

在JRE應用程序中,應該有一種方法以相同的方式使用圖像精靈,加載圖像精靈的400x400的偏移量以減少BufferedImage對象的使用並提高性能。

+0

這是一個正常的JRE程序。從文件加載的圖像使用Toolkit.getDefaultToolkit()。createImage(imageName)。 BufferedImages是使用標準的BufferedImage構造函數創建的。不太確定你對圖像精靈的意思,你有一個例子嗎? – DanielGibbs 2010-10-06 10:16:44

+0

你可以看看這個網站的精靈技術的基於Web的版本:http://css-tricks.com/css-sprites/ 我還沒有找到任何方法來實現這樣的技術在一個基於JRE的計劃,也許Stephen C的領導可能會有所幫助。 – LoganWolfer 2010-10-06 15:30:41