84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
被oom搞疯了。。。recycle什么的貌似不能把内存马上释放 System.gc(); 好像也不行。。。 有没有什么办法让系统迅速启动GC,释放内存? 求内存管理的一些技巧啊
那个方法并不能即时开启内存清理,况且你还不能确定你想回收的对象是不是已经没引用了,如果有引用在,即时系统gc了,你的对象也不会被回收掉。 Bitmap对象分为java虚拟机上的内存和linux里的内存,真正的内存大户在linux上分配的部分,那里保存了图像的点阵信息。然后虚拟机里的引用主要保存图像大小等等Bitmap对象的大部分域(属性)。
recycle()方法也是通知虚拟机,该对象可以被回收,但是如果这个对象有被引用,那么无效的。 如果是Bitmap对象,那么你要确认这个对象没有在别的地方调用了,然后调用recycle之后null。但是如果你这个bitmap被控件引用,那么就要做一些处理。
Drawable d = view.getBackground(); // 如果是一个BitmapDrawable Bitmap b = ((BitmapDrawable) d).getBitmap(); if (null != b && !b.isRecycle()) { b.recycle(); b = null; } d.setBitmap(null); d.setCallback(null);
你确定
System.gc()
不行?是不是没有在正确的地方gc?
那个方法并不能即时开启内存清理,况且你还不能确定你想回收的对象是不是已经没引用了,如果有引用在,即时系统gc了,你的对象也不会被回收掉。
Bitmap对象分为java虚拟机上的内存和linux里的内存,真正的内存大户在linux上分配的部分,那里保存了图像的点阵信息。然后虚拟机里的引用主要保存图像大小等等Bitmap对象的大部分域(属性)。
recycle()方法也是通知虚拟机,该对象可以被回收,但是如果这个对象有被引用,那么无效的。
如果是Bitmap对象,那么你要确认这个对象没有在别的地方调用了,然后调用recycle之后null。但是如果你这个bitmap被控件引用,那么就要做一些处理。
你确定
不行?是不是没有在正确的地方gc?