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