4

我们的应用程序有问题。随着时间的推移,我们注意到该totalPss值变得非常大(取决于设备,它将是 300-700Mb):

    int pid = android.os.Process.myPid();
    int pids[] = new int[1];
    pids[0] = pid;
    android.os.Debug.MemoryInfo[] memoryInfoArray = activityManager.getProcessMemoryInfo(pids);
    if (memoryInfoArray.length > 0)
    {
        android.os.Debug.MemoryInfo thisProcessMemoryInfo = memoryInfoArray[0];

        Log.d("totalPss", thisProcessMemoryInfo.getTotalPss()+"");
    }

这是一个显示典型运行结果的图表:

进程内存信息

但是,与此同时,该totalMemory值永远不会变得非常大(最大为 40-50Mb,但在 GC 后降至 10Mb)。

    Log.d("totalMem", Runtime.getRuntime().totalMemory()+"");

这是一个图表,显示与上面相同的运行(请忽略单位,它实际上以字节为单位):

在此处输入图像描述

getMemoryClass对于此设备,表明我们有 192Mb 可用于该应用程序:

    Log.d("getMemoryClass", activityManager.getMemoryClass()+"");

我们的内存使用模式是随着时间的推移进行大量频繁释放的大分配。很长一段时间后,大量分配将失败,这通常会导致应用程序失败。

看起来我们可能有碎片,这看起来正确吗?我们可以通过使用largeHeap属性来解决这个问题吗(我的直觉是它不会)?是否有任何工具可以帮助更确定地诊断这一点?

4

0 回答 0