アプリに問題があります。時間の経過とともに、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
(私の直感では解決できないと思います)。これをより確実に診断するのに役立つツールはありますか?