模拟器的GC是否比真实设备慢,有什么我可以做的加速吗?

时间:2011-02-27 16:48:43

标签: android

我一直试图追查我最初认为是内存泄漏的内容,但却发现内存确实最终会被模拟器的GC释放,但速度很慢。

基本上我已启动应用程序,转到根节点(选择模式),启动活动并点击后退键。我重复了几次,直到堆几乎满了。我知道每次退出时都会调用活动的onDestroy()。

这些是我收集的数据

在垃圾收集发生之前:

                    native   dalvik    other    total
            size:    14256     6407      N/A    20663
       allocated:    14083     5184      N/A    19267
            free:      124     1223      N/A     1347
           (Pss):     3993     8315     9819    22127
  (shared dirty):     1968     4584     1448     8000
    (priv dirty):     3792     4216     8176    16184

 Objects
           Views:      210        ViewRoots:        2
     AppContexts:       13       Activities:       12
          Assets:        2    AssetManagers:        2
   Local Binders:       22    Proxy Binders:       25
Death Recipients:        2
 OpenSSL Sockets:        0

垃圾收集后

                    native   dalvik    other    total
            size:    14256     6407      N/A    20663
       allocated:     6107     3894      N/A    10001
            free:     1776     2513      N/A     4289
           (Pss):     2513     8227     3499    14239
  (shared dirty):     1968     4584     1448     8000
    (priv dirty):     2312     4128     1856     8296

 Objects
           Views:       48        ViewRoots:        2
     AppContexts:        4       Activities:        3
          Assets:        2    AssetManagers:        2
   Local Binders:       22    Proxy Binders:       16
Death Recipients:        2
 OpenSSL Sockets:        0

垃圾收集时间(我在16:13完成切换活动)

02-27 16:13:51.022: DEBUG/INF_TAG(13723): Select Mode onStop
02-27 16:14:07.863: DEBUG/dalvikvm(13723): GC freed 31080 objects / 1978968 bytes in  52ms
02-27 16:14:48.562: DEBUG/dalvikvm(13723): GC freed 45884 objects / 2084224 bytes in 251ms
02-27 16:15:30.802: DEBUG/dalvikvm(13723): GC freed 46405 objects / 2157376 bytes in 265ms
02-27 16:16:12.863: DEBUG/dalvikvm(13723): GC freed 45091 objects / 2085880 bytes in 391ms
02-27 16:17:00.992: DEBUG/dalvikvm(13723): GC freed 45346 objects / 2072712 bytes in 251ms
02-27 16:17:44.542: DEBUG/dalvikvm(13723): GC freed 45177 objects / 2101152 bytes in 187ms
02-27 16:18:29.182: DEBUG/dalvikvm(13723): GC freed 45603 objects / 2106496 bytes in 242ms
02-27 16:19:19.823: DEBUG/dalvikvm(13723): GC freed 58797 objects / 2723784 bytes in 266ms
02-27 16:19:40.122: DEBUG/dalvikvm(13723): GC freed 22403 objects / 1058168 bytes in 216ms
02-27 16:20:06.223: DEBUG/dalvikvm(13723): GC freed 21685 objects / 993504 bytes in 211ms
02-27 16:20:29.173: DEBUG/dalvikvm(13723): GC freed 20948 objects / 980304 bytes in 223ms
02-27 16:20:52.272: DEBUG/dalvikvm(13723): GC freed 21149 objects / 968136 bytes in 207ms
02-27 16:21:16.332: DEBUG/dalvikvm(13723): GC freed 21349 objects / 972216 bytes in 207ms
02-27 16:21:40.233: DEBUG/dalvikvm(13723): GC freed 22008 objects / 984904 bytes in 110ms
02-27 16:22:03.313: DEBUG/dalvikvm(13723): GC freed 21115 objects / 948144 bytes in 215ms
02-27 16:22:27.362: DEBUG/dalvikvm(13723): GC freed 21646 objects / 970288 bytes in 222ms
02-27 16:22:50.463: DEBUG/dalvikvm(13723): GC freed 21834 objects / 981016 bytes in 218ms
02-27 16:23:15.133: DEBUG/dalvikvm(13723): GC freed 21821 objects / 965472 bytes in 211ms
02-27 16:23:40.662: DEBUG/dalvikvm(13723): GC freed 23011 objects / 990424 bytes in 122ms
02-27 16:24:47.162: DEBUG/dalvikvm(13723): GC freed 28716 objects / 874880 bytes in 124ms
02-27 16:25:55.603: DEBUG/dalvikvm(13723): GC freed 30100 objects / 943888 bytes in 135ms

我已经准备好接受我可能会泄漏一些小对象,但我只是不明白为什么GC需要这么长时间来释放堆并从堆栈中删除活动。这是真正手机上的典型行为吗?

P.S。我尝试在根节点的onResume()中调用System.gc(),但它没有区别

1 个答案:

答案 0 :(得分:0)

操作系统似乎对运行GC非常保守,因为无论何时运行它都会干扰用户体验。由于手机(和模拟器)具有大量内存,因此GC往往不经常运行并且递增。只有当内存开始变低时,操作系统才会更加积极地回收资源。