我在Android 4.2.2(CM10.1.3)上有一个在自己的进程中运行的服务,与活动分开。它通过以下方式从资源(用于通知)解码位图:
Bitmap icon = BitmapFactory.decodeResource(getResources(), R.id.icon);
我注意到在这种情况下,“运行服务”下的进程使用的内存大约为4.6mB,并且保持这么长时间。即使我没有设置通知(图标从未在其他地方使用/引用),内存仍保持在4.6mB。这让我相信位图的内存永远不会被释放。如果我擦除上面的行,运行服务中显示的内存大约是3.0mB。
我开始研究这个并用DDMS检查我的堆大小。它显示为2.3mB。首先,为什么“运行服务”分配不匹配JVM堆大小?
据我所知,在Android 2.3之前,Bitmaps是在本机内存而不是Dalvik JVM内存中分配的。因此,在Android 2.3之前,您可能不会在JVM中看到位图,但我应该在Android 4.2.2中看到它。
其次,为什么不释放位图的内存/垃圾收集(即使没有使用该对象)?
我已经看到记忆从~460mB下降到~3mB但是经过许多小时(10+)。调用icon.recycle()并通过DDMS手动调用GC不会立即将其关闭。