Android 应用在某些手机上使用的 RAM 超过了最大堆大小

3
我有一个应用程序,在大多数手机(如Nexus **)上运行良好:内存使用量从未超过24MB。但在我的Sony Ericsson Xperia Arc手机上,运行几天后,它使用的RAM超过70MB(根据“设置”->“应用程序”->“正在运行的服务”)。Runtime.getRuntime().maxMemory()显示我的手机最大堆大小仅为32MB。 是否有办法找出我的应用在这个手机上发生了什么?这是该应用程序的adb meminfo:
C:\>adb -d shell dumpsys meminfo 4606
Applications Memory Usage (kB):
Uptime: 409334045 Realtime: 585217200

** MEMINFO in pid 4606 [com.*****************] **
                    native   dalvik    other    total
            size:    60796    10695      N/A    71491
       allocated:    54057     6091      N/A    60148
            free:     6706     4604      N/A    11310
           (Pss):    56549     1129     8385    66063
  (shared dirty):     2128     1304     4964     8396
    (priv dirty):    56496      892     8156    65544

 Objects
           Views:        0        ViewRoots:        0
     AppContexts:        0       Activities:        0
          Assets:        3    AssetManagers:        3
   Local Binders:        5    Proxy Binders:       14
Death Recipients:      222
 OpenSSL Sockets:        2

 SQL
               heap:      425         MEMORY_USED:      425
 PAGECACHE_OVERFLOW:       81         MALLOC_SIZE:       50

 DATABASES
      pgsz     dbsz   Lookaside(b)  Dbname
         1       54            223  *.db
         1       27            198  **.db
         1        5             24  ***.db
         1       11             56  ****.db

C:\>
1个回答

0

本地代码的内存使用不受Java堆大小限制,因此应用程序很容易超过该限制。虽然这意味着Android在后台运行时更有可能杀死您的应用程序,但只要不超过设备上可用的RAM,这就不应该成为问题。

如果您在一个手机上看到不同的内存使用情况,而在另一个手机上没有(并且两个应用程序的交互方式相同),那么我猜测制造商在那个特定手机上的定制版Android存在您正在触发的内存泄漏。如果是这种情况,那么您无能为力。不过,检查一下自己的代码是否存在内存泄漏也无妨。

话虽如此,在现代设备上,70MB对于大多数手机来说都不必担心。只要保持在约150MB以下,您就应该安全了。


半天后它达到了85MB,下次我检查时,它被系统杀掉了(RAM使用量降至20MB,PID已更改)。 - Qi Fan
我收到了一条市场评论,说这个应用在他的手机上超过了150MB。 - Qi Fan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接