如何找出谁明确调用垃圾收集器?

时间:2013-01-07 09:10:42

标签: java android garbage-collection galaxy

在三星Galaxy S3上运行,其中ActivityManager.getMemoryClass()返回一个健康的64(MB)允许堆空间,我收到许多这样的LogCat消息。

  

WAIT_FOR_CONCURRENT_GC阻止0ms
  GC_EXPLICIT释放267K,35%免费15885 / 24327K,暂停3ms + 6ms,总计52ms

应用程序在内存中加载大约100个联系人缩略图的缓存,并且在联系人/位图加载期间发生这些GC调用。滚动列表视图时,GC调用的结果是干扰性能。

我从不打电话给System.gc()

我的问题是这个。我认为只有在显式调用GC时才显示GC_EXPLICIT日志消息(即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;
}

0 个答案:

没有答案