gpt4 book ai didi

Android:为什么开始新 Activity 需要这么长时间?

转载 作者:太空狗 更新时间:2023-10-29 14:23:27 25 4
gpt4 key购买 nike

我有一个 Android Activity BrowseActivity,它将大约 3000 条记录(@ 大约 100 字节)从数据库加载到内存中,并在 ListView 中显示它们。在 AVD 中加载大约需要 3 到 6 秒,这很好。

当我想从此 BrowseActivity 中开始一个新 Activity 时,问题就出现了。它需要大约 30 秒,即使只是打开最琐碎的 Activity 。由于未知原因,Dalvik VM 似乎进行了大量垃圾收集。请检查下面的 logcat 输出。

01-30 02:06:27.025: D/dalvikvm(553): GC_FOR_MALLOC freed 3889 objects / 221200 bytes in 45ms
01-30 02:06:28.234: D/dalvikvm(553): GC_FOR_MALLOC freed 2784 objects / 76864 bytes in 48ms
01-30 02:06:29.614: D/dalvikvm(553): GC_FOR_MALLOC freed 2665 objects / 70088 bytes in 64ms
01-30 02:06:30.915: D/BrowseActivity(553): Low memory status: false
01-30 02:06:30.915: D/BrowseActivity(553): Low memory threshold (KB): 16384
01-30 02:06:30.915: D/BrowseActivity(553): Memory available (KB): 451348
01-30 02:06:31.095: D/dalvikvm(553): GC_EXTERNAL_ALLOC freed 2711 objects / 85904 bytes in 62ms
01-30 02:06:49.705: D/dalvikvm(553): GC_FOR_MALLOC freed 8894 objects / 600272 bytes in 89ms
01-30 02:06:50.414: D/dalvikvm(553): GC_FOR_MALLOC freed 10757 objects / 730720 bytes in 68ms
01-30 02:06:51.105: D/dalvikvm(553): GC_FOR_MALLOC freed 10251 objects / 694864 bytes in 67ms
... and about 30 more garbage collection messages

我已经尝试过较少数量的记录:1 和 300。它导致垃圾收集消息少得多(分别为 1 和 7)和更快的 Activity 负载(分别为 1 和 6 秒),但内存可用性差异非常小:

01-30 02:03:35.295: D/BrowseActivity(491): Low memory status: false
01-30 02:03:35.295: D/BrowseActivity(491): Low memory threshold (KB): 16384
01-30 02:03:35.295: D/BrowseActivity(491): Memory available (KB): 453184

01-30 02:04:53.494: D/BrowseActivity(522): Low memory status: false
01-30 02:04:53.494: D/BrowseActivity(522): Low memory threshold (KB): 16384
01-30 02:04:53.494: D/BrowseActivity(522): Memory available (KB): 453152

Activity 加载时间缓慢似乎是由 GC 开销引起的。我的问题是:为什么 Dalvik VM 会执行大量 GC?即使有 3000 条记录,我相信它也只会占用前 500 KB 内存。如果不是关于 GC 开销,那么导致这种缓慢的 Activity 加载的其他可能原因是什么?

作为记录,我使用内置类 ActivityManager.MemoryInfo 提供的信息记录了内存可用性.

最佳答案

我认为您没有对其中包含 3000 条记录的 Activity 的引用,这会导致在您更改 Activity 时激活 GC。

如果您使用 MVC 类型模式并且有一个 Controller 引用每个 Activity ,我认为 GC 不会清理这些记录。当一段内存存在但没有已知的引用时,GC 就会启动,一旦您切换 Activity ,对 Activity 的引用及其所有函数和成员变量都不再使用,因此应该清理。

GC 的行为方式也可能取决于硬件,即如果系统有大量可用内存,它的工作方式可能与没有时不同。

我有一个加载了 3000 多条记录的应用程序, Controller 有对每个 Activity 的引用,因此 ListView 适配器中的数据没有被清理。

至于开销,这不一定是 GC - 但它看起来会增加开销。唯一的其他影响因素是在屏幕上呈现组件所花费的时间等。

希望对您有所帮助!

~丹

关于Android:为什么开始新 Activity 需要这么长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14595936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com