2012-08-27 171 views
0

最近,我宣佈一個功能,我把函數for循環象下面這樣:由於For循環中的堆內存不足導致內存不足?

Bitmap image = ...//Do stuff to get image's bitmap, it's quite ok 
for(int i =0; i < someNumber; i++){ 
     image = doSomeThing(image, width, height);  
} 

private Bitmap doSomeThing(image, width, height){ 
     int[] a = new int[10000]; 
     Bitmap bitmap = image.copy(sentBitmap.getConfig(), true); 
     // Do some stuff here to process image 
     ... 
     return (bitmap); 
} 

隨着for循環參數someNumber小於5,我的應用程序是相當精緻的,否則,我會outOfMemory。所以我想問一個建議來解決這個exception!我可以使用System.gc()嗎?或者我可以在每個循環for之後做些什麼來消除未被佔用的內存?

編輯:對不起,也許我省略了太多,我更新了我的代碼!

Edited2:如果不是for循環,我用電話image = doSomething(...)多次,該exception是沒有更多!

謝謝!

+1

您是否將引用保存到新數組的某處?否則我不明白爲什麼JVM應該抱怨而不是釋放內存 –

+2

也許向我們展示更多代碼? –

+0

假設循環體不包含任何其他你遺漏的東西,並且你不會泄漏doSomeThing()以外的[]的引用,你應該立即得到異常或永遠不會得到異常。你可能忽略了一些東西。 – Durandal

回答

0

Java的角度來看,System.gc()可能沒有效果,因爲當內存不足時,Java會清除它,如果可以的話。

您的doSomeThing()調用可能會爲您擁有的內存量創建太多的對象。

要麼增加它,如果因爲內存佔用的限制無法調整空間,請調整Eden空間。

+0

這是一個關於android的問題,我會懷疑它給出了增加eden空間大小的選項。 –

1

當您在for循環中完成時,您可能需要調用image.recycle()

編輯:啊,我明白你想要做什麼,對同一張圖片應用多個過濾器。試試這個:

Bitmap image = ...; 
for(int i =0; i < someNumber; i++){ 
     Bitmap newImage = doSomeThing(image, width, height); 
     image.recycle(); 
     image = newImage; 
} 
+0

但是我想'返回(位圖)',如果我調用'recycle()'我會失去一切! –

+0

如果不再使用'image',最好在'image'上調用回收站。 –

+0

你是對的,那就是我的意思。 – dmon