データベースから約 3000 レコード (@ 約 100 バイト) をメモリBrowseActivity
にロードし、ListView
. AVD でロードするのに約 3 ~ 6 秒かかりますが、これは問題ありません。
this 内から新しいアクティビティを開始したいときに問題が発生しますBrowseActivity
。最も些細なアクティビティを開くだけでも、約 30 秒かかります。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 秒)、アクティビティの読み込みが大幅に高速化されました (それぞれ 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
アクティビティの読み込み時間が遅いのは、GC のオーバーヘッドが原因のようです。私の質問は、Dalvik VM が多くの GC を実行するのはなぜですか? 3000 のレコードがあっても、メモリ内の上位 500 KB しか使用しないと思います。GC のオーバーヘッドが原因でない場合、アクティビティの負荷が遅い原因として他に考えられるものは何ですか?
記録のために、組み込みクラスActivityManager.MemoryInfoによって提供される情報を使用して、メモリの可用性を記録しました。