我们的应用程序有问题。随着时间的推移,我们注意到该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
属性来解决这个问题吗(我的直觉是它不会)?是否有任何工具可以帮助更确定地诊断这一点?