取得したいメモリクエリの定義によって異なります。
通常、ヒープメモリの状態を知りたいと思います。メモリが多すぎるとOOMが発生し、アプリがクラッシュするためです。
このため、次の値を確認できます。
final Runtime runtime = Runtime.getRuntime();
final long usedMemInMB=(runtime.totalMemory() - runtime.freeMemory()) / 1048576L;
final long maxHeapSizeInMB=runtime.maxMemory() / 1048576L;
final long availHeapSizeInMB = maxHeapSizeInMB - usedMemInMB;
「usedMemInMB」変数が「maxHeapSizeInMB」に近づくほど、近づきます availHeapSizeInMB
ほど、ゼロに近づくほど、OOMが近くなります。(メモリの断片化により、これがゼロになる前にOOMが発生する場合があります。)
これは、メモリ使用量のDDMSツールが示すものでもあります。
または、実際のRAM使用量があります。これは、システム全体が使用する量です。これを計算するには、承認された回答を参照してください。
更新:Android OはアプリにネイティブRAM(少なくともビットマップストレージ用であり、これは通常、大量のメモリ使用量の主な理由です)を使用するため、ヒープだけでなく、物事が変更され、OOMが少なくなります(ヒープにはビットマップはもう含まれていません。ここをチェックしてください)。ただし、メモリリークがあると思われる場合は、メモリの使用に注意する必要があります。Android Oでは、古いバージョンでOOMを引き起こしていたはずのメモリリークがある場合、それをキャッチできずにクラッシュするだけのようです。メモリ使用量を確認する方法は次のとおりです。
val nativeHeapSize = Debug.getNativeHeapSize()
val nativeHeapFreeSize = Debug.getNativeHeapFreeSize()
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
しかし、グラフを使用してリアルタイムでデータを表示するIDEのプロファイラーを使用するのが最善かもしれないと思います。
したがって、Android Oの良いニュースは、大きなビットマップを大量に保存するOOMが原因でクラッシュするのがはるかに難しいことですが、悪いニュースは、実行時にそのようなケースをキャッチすることは不可能だということです。
編集:Debug.getNativeHeapSize()
それはあなたのアプリの合計最大メモリを示すので、時間とともに変化するようです。したがって、これらの関数は、アプリが使用している量を示すために、プロファイラーにのみ使用されます。
実際の合計および使用可能なネイティブRAMを取得する場合は、次のようにします。
val memoryInfo = ActivityManager.MemoryInfo()
(getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager).getMemoryInfo(memoryInfo)
val nativeHeapSize = memoryInfo.totalMem
val nativeHeapFreeSize = memoryInfo.availMem
val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize
Log.d("AppLog", "total:${Formatter.formatFileSize(this, nativeHeapSize)} " +
"free:${Formatter.formatFileSize(this, nativeHeapFreeSize)} " +
"used:${Formatter.formatFileSize(this, usedMemInBytes)} ($usedMemInPercentage%)")
Debug.getNativeHeapFreeSize()
。