我有一个粘性后台服务,它以 sdk/库的形式实现。我正在努力最小化内存使用量。我确实尝试使用单独的进程,但 Android 似乎使用该库加载了很多可能属于主应用程序的额外内容。当我将库与空的 SDKtest 应用程序一起使用时,内存使用量会下降到合理的水平。另外,内存可以追溯到预加载的系统可绘制对象,但无法弄清楚为什么在一种情况下这些对象被归类为私有(private)脏对象。因此,将服务作为外部 apk 可以解决问题,但正如您可以猜到的那样,这是不切实际的。知道如何继续吗?
** MEMINFO in pid 14571 [org.abc.abc:Service] **
Pss Private Private Swapped Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 4481 4308 0 1008 7292 6353 938
Dalvik Heap 5649 5532 0 0 7373 6980 393
Dalvik Other 616 616 0 0
Stack 332 332 0 0
Other dev 5 0 4 0
.so mmap 2623 152 1472 2832
.apk mmap 204 0 128 0
.ttf mmap 56 0 48 0
.dex mmap 1576 0 1484 0
.oat mmap 3467 0 1588 0
.art mmap 2739 760 264 0
Other mmap 6 4 0 0
GL mtrack 3380 3380 0 0
Unknown 166 164 0 144
TOTAL 25300 15248 4988 3984 14665 13333 1331
Objects
Views: 0 ViewRootImpl: 0
AppContexts: 3 Activities: 0
Assets: 3 AssetManagers: 3
Local Binders: 8 Proxy Binders: 23
Parcel memory: 40 Parcel count: 54
Death Recipients: 0 OpenSSL Sockets: 0
SQL
MEMORY_USED: 0
PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 0
** MEMINFO in pid 7908 [org.abc.sdktest:abcSDKTestService] **
Pss Private Private Swapped Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 1754 1576 0 1880 5320 4132 1187
Dalvik Heap 1101 976 0 2680 7122 5390 1732
Dalvik Other 244 244 0 0
Stack 176 176 0 0
Other dev 5 0 4 0
.so mmap 299 68 0 2868
.apk mmap 168 0 140 0
.dex mmap 1532 0 1448 0
.oat mmap 1275 0 0 0
.art mmap 2130 604 8 0
Other mmap 4 4 0 0
Unknown 78 76 0 160
TOTAL 8766 3724 1600 7588 12442 9522 2919
Objects
Views: 0 ViewRootImpl: 0
AppContexts: 3 Activities: 0
Assets: 3 AssetManagers: 3
Local Binders: 4 Proxy Binders: 19
Parcel memory: 32 Parcel count: 42
Death Recipients: 0 OpenSSL Sockets: 0
SQL
MEMORY_USED: 0
PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 0
最佳答案
根本原因是有条件的 Toast 显示。删除 toast 解决了这个问题。但通知不会导致同样的现象。显然,Toast 会初始化 viewroot 及其所有行李,例如预加载的可绘制对象。虽然这些预加载的绘图理想情况下不应显示为私有(private)脏内存,因为它们属于 zygote,但我想如果以某种方式它们不被任何其他应用程序使用,它就会显示为我自己的内存占用。因此在这种情况下必须删除 UI 元素...
关于java - 优化 Android 粘性后台服务的内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42555210/