我使用System.GC(GC.CollectorOn xamarin)清除垃圾收集器。 但不幸的是,在我将打开活动五次以上后,我将得到错误的Java.Lang.outof内存。为什么会这样? System.GC没有点击动态我所有的垃圾收集器?这是我的代码:
protected override void OnCreate(Bundle savedInstanceState) {
base.OnCreate(savedInstanceState);
RequestWindowFeature(WindowFeatures.NoTitle);
SetContentView(Resource.Layout.CatalogItem);
imageview = FindViewById < ImageView > (Resource.Id.ItemImageView);
GC.Collect();
GC.WaitForPendingFinalizers();
dpPath = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "student.db3");
db = new SQLiteConnection(dpPath);
var table = db.Query < CatalogItemClass > ("select ItemImg,_id,InventoryItemName,InventoryItemPrice from CatalogItemClass where CategoryID=1 ");
foreach(var item in table) {
Image = item.ItemImg;
}
if (Image != null) {
Bitmap decodedByte = BitmapFactory.DecodeByteArray(Image, 0, Image.Length);
imageview.SetImageBitmap(decodedByte);
}
}
答案 0 :(得分:3)
但不幸的是,在我将打开活动五次以上后,我将得到错误的Java.Lang.outof内存。
正如@elmorabea所说,有些东西会泄漏内存,内存泄漏会导致可用Heaps
和触发GC
频繁的次数越来越少,但是可以&#39 ; t回收这些资源,最后OOM
发生了。在这种情况下,执行GC
无法帮助您。
因此,当我按下后按i运行FinishAffinity。然后在下一个活动中运行system.gc
您已销毁导致内存泄漏的对象,以便GC
可以再次运行。您可以使用Android Device Monitor
来查找泄漏内存的对象:
答案 1 :(得分:0)
除非您需要,否则请勿清除垃圾收集器。 Android会为你做自动垃圾收集。
答案 2 :(得分:0)
首先,垃圾回收器调用它的方法,更多的是你希望GC运行的提示,没有实际保证它会立即运行。
其次,如果您有泄漏内存的东西,例如线程保持视图实例,或类似的东西,GC将无法帮助您。
请查看here
以进一步了解内存泄漏。
在其他一些情况下,它可能不是泄漏,也可能是您正在加载的图像太大了。在这种情况下,您应该使用像Picasso或Glide这样的库并使用它们的缩放功能。 或者您可能希望在加载图像之前查看一个很好的属性来缩放图像。 inJustDecodeBounds
答案 3 :(得分:0)
我发现我的答案是运行垃圾收集器的唯一方法,工作就是关闭你在活动中使用的所有元素。所以当我按下后按我运行FinishAffinity。然后在下一个活动中我运行系统.gc