Android: int 数组设置为 null 但在 GC 后仍在内存中
Android: int array set null but still in memory after GC
我试着把它分解成关于 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;
}
}
此后我仍然在监视器中看到图像。即使我点击 Cause GC。数组是在位图中被引用还是为什么它仍然存在?
您已声明 int[] pix
为 instance variable
。因此,当创建此 class 的对象时,将在内存中创建 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;
}
}
所以当方法操作完成时它将被GC。
您可能想要了解垃圾收集器的工作原理。
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
了解垃圾收集器是一个批量进程很重要。当不再需要对象时,它不会在 "timely fashion" 中清理。一个对象可能在很长一段时间内符合垃圾回收条件,然后才真正被清理。
垃圾收集器跟踪所有静态字段和堆栈上的所有变量以及这些对象引用的所有内容等的引用,以标记它可以找到的每个对象。然后它释放所有它没有标记的东西。
这意味着在它主动开始标记它可以引用的所有内容之前,它不知道什么可以清理,什么不能清理。
由于此标记过程的成本很高,因此不会经常执行,并且对象在需要后会在内存中停留很长时间。
兴趣点
有一个System.gc()方法可以触发垃圾收集器。我希望使用它来释放未引用的对象,例如您问题中的数组。
你不应该在你的实际代码中使用它,这是非常糟糕的做法
我试着把它分解成关于 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;
}
}
此后我仍然在监视器中看到图像。即使我点击 Cause GC。数组是在位图中被引用还是为什么它仍然存在?
您已声明 int[] pix
为 instance variable
。因此,当创建此 class 的对象时,将在内存中创建 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;
}
}
所以当方法操作完成时它将被GC。
您可能想要了解垃圾收集器的工作原理。
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
了解垃圾收集器是一个批量进程很重要。当不再需要对象时,它不会在 "timely fashion" 中清理。一个对象可能在很长一段时间内符合垃圾回收条件,然后才真正被清理。
垃圾收集器跟踪所有静态字段和堆栈上的所有变量以及这些对象引用的所有内容等的引用,以标记它可以找到的每个对象。然后它释放所有它没有标记的东西。
这意味着在它主动开始标记它可以引用的所有内容之前,它不知道什么可以清理,什么不能清理。
由于此标记过程的成本很高,因此不会经常执行,并且对象在需要后会在内存中停留很长时间。
兴趣点
有一个System.gc()方法可以触发垃圾收集器。我希望使用它来释放未引用的对象,例如您问题中的数组。
你不应该在你的实际代码中使用它,这是非常糟糕的做法