Android 堆大小与“运行服务”内存分配

Android 堆大小与“运行服务”内存分配,android,memory,bitmap,heap,allocation,Android,Memory,Bitmap,Heap,Allocation,我有一个在Android 4.2.2 CM10.1.3上独立于活动运行的服务,它在自己的进程中运行。它通过以下方式从资源中解码位图以获取通知: Bitmap icon = BitmapFactory.decodeResource(getResources(), R.id.icon); 我注意到,在这种情况下,正在运行服务的进程使用的内存约为4.6mB,并且会保持数小时。即使我没有设置通知图标从未在其他地方使用/引用,内存仍保持在4.6mB。这让我相信位图的内存永远不会被释放。如果我擦除上述行,

我有一个在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之前,位图是在本机内存中分配的,而不是在Dalvik JVM内存中分配的。因此,在Android2.3之前,您可能不希望在JVM中看到位图,但我应该在Android4.2.2中看到它

其次,为什么即使不使用对象,位图的内存也没有被释放/垃圾回收

我已经看到内存从~4.6mB下降到~3mB,但经过许多小时之后,10+。调用icon.recycle并通过DDMS手动调用GC不会立即将其关闭