在 ActivityManager.getMemoryClass() 返回健康的 64 (MB) 允许堆空间的三星 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;
}