java - 优化 Android 粘性后台服务的内存使用

标签 java android service

我有一个粘性后台服务,它以 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/

相关文章:

java - 使用的表型 Spring Boot 的最大行大小

android - 关闭时加快 'Navigation Drawer' 动画速度?

apache - Windows 无法在本地计算机上启动 Apache CouchDB 服务

service - 如何检查 IONIC FRAMEWORK 中的 GPS 服务是否启用

android - 是否可以通过 NFC 一键连接两个 Android 设备交换数据?

android - 如何在android中调用服务中的方法

java - 提高 Primefaces 数据表性能

java - 使用 customAdapter 后项目的错误位置

java - Play Framework : Using JPA entityManager in Interceptor Action class

java - 如何设置多列表代号一个的样式?