1

在 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;
}
4

0 回答 0