我试图将其分解为关于pix数组的主要代码:
public class BitmapProcessor {
int[] pix;
public Bitmap run(Bitmap b)
{
pix = new int[picw * pich];
bitmap.getPixels(pix, 0, picw, 0, 0, picw, pich);
// do some stuff
bm = Bitmap.createBitmap(picw, pich, Bitmap.Config.ARGB_8888);
bm.setPixels(pix, 0, picw, 0, 0, picw, pich);
pix = null;
return bm;
}
}
在此之后我仍然在显示器中看到pix。即使我点击Cause GC。数组是在位图中引用的,还是为什么它仍然存在?
答案 0 :(得分:1)
您已宣布int[] pix
为instance variable
。因此,当创建此类的对象时,将在内存中创建pix
变量的副本,它将保留在内存中,直到对象持续。
在您的情况下,您可以将int[] pix
声明为方法的局部变量。
public class BitmapProcessor {
public Bitmap run(Bitmap b)
{
int[] pix = new int[picw * pich];
bitmap.getPixels(pix, 0, picw, 0, 0, picw, pich);
// do some stuff
bm = Bitmap.createBitmap(picw, pich, Bitmap.Config.ARGB_8888);
bm.setPixels(pix, 0, picw, 0, 0, picw, pich);
return bm;
}
}
因此,当方法操作完成时,它将被GCed。
答案 1 :(得分:1)
您可能想要了解垃圾收集器的工作原理。
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
了解垃圾收集器是一个批量过程非常重要。当不再需要物体时,它不会以“及时的方式”清理。在实际清理对象之前,对象可能有资格进行垃圾收集很长时间。
垃圾收集器跟踪所有静态字段和堆栈上所有变量的引用以及这些对象引用的所有内容,以标记它可以找到的每个对象。然后它释放了它没有标记的一切。
这意味着在它积极开始标记它可以引用的所有内容之前,它不知道什么可以清理,哪些不可以。
由于此标记过程非常昂贵,因此不会非常频繁地执行,并且在需要之后,对象将在内存中停留很长时间。
兴趣点
有一个System.gc()方法可以触发垃圾收集器。我希望使用它可以释放未提及的对象,例如你问题中的数组。
你不应该在你的实际代码中使用它,这是非常糟糕的做法