2011-12-11 63 views
0

我是新來的面向對象編程。我用靜態方法創建了一個類,以不同的間隔捕捉屏幕上各種不同大小的矩形。在捕獲使用靜態機器人實例存儲在一個靜態的BufferedImage:如何使用Java BufferedImage和Robot以理想的方式進行內存管理?

myStaticBufferedImage = myStaticRobot.createScreenCapture(arbitrarySizeRectangle); 

一些操作上的數據(包括偶爾的圖像寫入bmp文件)執行。在下次捕獲時,不需要來自先前捕獲的圖像數據。

由於bufferedImage將包含可變大小的數據,直到我的屏幕分辨率的完整大小,我應該在我的應用程序開始使用它之前聲明它爲止嗎?

private static BufferedImage myStaticBufferedImage = new BufferedImage(RESOLUTION_X, RESOLUTION_Y, APPROPRIATE_IMAGE_TYPE); 

這是否分配內存可重複使用的塊,沒有任何泄漏或效率低下,因爲我多次捕獲圖像?或者,createScreenCapture方法每次使用它時都會填充越來越多的內存,並簡單地爲myStaticBufferedImage分配一個新的指針?

我在OSX Lion上運行這個應用程序以及一些CPU密集型軟件。內存管理的最佳做法是什麼?謝謝!

回答

0

您不應將myStaticBufferedImage初始化爲最大分辨率。 createScreenCapture()將在內存中創建自己的BufferedImage,然後myStaticBufferedImage將被提及。在任何情況下,createScreenCapture()都不會使用myStaticBufferedImage的緩衝區。這就是說,如果你只會創建幾個BufferedImage s,它可能不會在CPU密集型(內存密集型)軟件旁邊產生影響。

+0

我剛剛發現了createScreenCapture的源代碼並達到了相同的實現。我將在應用程序終止之前的幾個小時內捕獲超過幾個 - 更像每分鐘幾個。我很擔心內存,但也許Java 6垃圾回收器會爲我處理所有事情。 –

+0

啊,我明白了。然而,據我所知,你一次只有一個'BufferedImage',所以你不應該用盡內存。你可以通過使用JVM參數'-XX:NewRatio = 10'來微調gc - 一個更大的數字本質上可以更快速地在瞬態對象上調用gc。你也可以直接調用它:'Runtime r = Runtime.getRuntime(); r.gc();' –