ActivityManager.getMemoryClass()が許可されたヒープスペースの正常な64(MB)を返すSamsung Galaxy S3で実行すると、このようなLogCatメッセージが多数表示されます。
WAIT_FOR_CONCURRENT_GCは0msをブロックし
ましたGC_EXPLICITは267Kを解放し、35%は15885 / 24327Kを解放し、3ms + 6msを一時停止し、合計52ms
アプリはメモリに約100の連絡先サムネイルをキャッシュし、これらのGC呼び出しは連絡先/ビットマップの読み込み中に発生します。GC呼び出しの結果は、リストビューをスクロールするときのパフォーマンスが不安定になります。
私は決して電話しませんSystem.gc()
。
私の質問はこれです。GC_EXPLICIT
ログメッセージは、GCが明示的に呼び出されている場合にのみ表示されると思いました(つまり、AndroidメモリマネージャーがGCを実行していない、一部のアプリレベルのコードが実行している)。
誰が明示的にGCを呼び出しているかを確認して、コードを修正する方法をより適切に把握できるようにするにはどうすればよいですか?注:AndroidメモリマネージャーがGCを呼び出すことができ、呼び出すことを認識しています。私の理解では、結果はGC_CONCURRENT
呼び出しではなくGC_EXPLICIT
呼び出しになります。
更新:連絡先のサムネイルを読み込むコードは次のとおりです。バックグラウンドスレッドで実行されます。
public static Bitmap loadBitmapFromContentUri(
ContentResolver resolver,
Uri uri
)
{
InputStream is = null;
Bitmap result = null;
try
{
is = resolver.openInputStream(uri);
result = BitmapFactory.decodeStream(is);
}
catch (FileNotFoundException e)
{
Log.e(
TAG,
"Failed to load photo for Uri " + uri + ": " + e.getMessage()
);
}
finally
{
if (null != is)
{
try
{
is.close();
}
catch (IOException e)
{ }
}
}
return result;
}