2011-04-17 139 views
1

在我的Java GUI應用程序,我有一個需要反覆規模某些組件,而我用下面的代碼這樣做:的ImageIcon加載越來越慢

Image newImage = myimage.getScaledInstance(width, height, Image.SCALE_REPLICATE); 

ImageIcon newIcon = new ImageIcon(newImage); 

this.setIcon(newIcon); 

this.setSize(width,height); 

//increment width, height 

起初能正常工作,但經過許多次迭代(幾百次),基於一些簡單的時間檢查,新的ImageIcon()構造函數花費了過多的時間(大約1秒)。其餘的代碼很快。

爲什麼在多次迭代後會發生這種情況,並且如何隨着迭代次數的增加而停止減速? (在後臺線程中加載圖像不起作用,因爲加載圖像不是一個常量操作)。

+0

你是否抓住舊圖像,以便它們不能被垃圾收集? – MeBigFatGuy 2011-04-17 17:06:57

+0

我不這麼認爲,因爲setIcon(newIcon)應該推出只存在於內部的舊圖標。但似乎有某種內存泄漏,因爲程序使用了過多的RAM。 – donnyton 2011-04-17 19:02:16

回答

2

看看The Perils of Image.getScaledInstance()。這可能不是問題,但直到嘗試替代方案時纔會知道。

+0

+1爲有趣的資源。我一直在使用scale實例,對結果很滿意,但是在創建對象時我只能縮放一次。 ImageIcon resizedIcon = new ImageIcon(oldIcon.getImage()。getScaledInstance(width,height,Image.SCALE_SMOOTH)); – Boro 2011-04-18 16:16:42

+0

這就是問題所在!我們完全切換到了Graphics2D轉換,並且延遲和內存泄漏都消失了。 – donnyton 2011-04-19 17:24:17

+0

很高興您對危險進行了排序並解決了問題。 :) – 2011-04-19 18:33:49

0

我記得以前的Q/A的圖像加載導致內存問題。我認爲你需要追求的理論,這是一個內存泄漏:

  • 確認這是通過運行GC記錄你的JVM啓用的問題,看看是否有日誌消息,並觀察到有一定相關性慢一點。 (這種或那種方式需要一分鐘左右的時間來確認。)

  • 使用您最喜愛的內存分析器來嘗試追蹤泄漏。

+0

我如何使用Eclipse進行GC日誌記錄? – donnyton 2011-04-17 23:29:13

+0

在運行配置工具中,將「-verbose:gc」設置爲JVM參數之一。 – 2011-04-19 13:24:45