Unity アプリケーションが消費しているメモリ量を取得する

Unityのロゴ。

Unity アプリケーションを実行している最中に、アプリケーション全体で消費しているメモリ量を監視しようとしたのですが上手くいきませんでした。 結論から言うと、Development Build でビルドされたアプリケーションに関しては監視ができますが、それ以外の場合には困難です。 (Unity のバージョン 5.4 で確認、Windows など PC ビルドを前提とする)

どうしても必要ならネイティブプラグインを実装することになると思います。

ダメだったパターン

C# .NET で実装されるアプリケーションでは次のようにしてメモリ消費量を監視することができます。

System.GC.GetTotalMemory(false);
System.Diagnostics.Process.GetCurrentProcess().WorkingSet64;

GC.GetTotalMemory はマネージドメモリしか確認することができず、Unity アプリケーションが実際に確保しているメモリ量とは異なる値が返ってきます。 (そもそも正確なメモリ消費量を取得するのは色々と手間が必要になりそうです)

次いで Process.WorkingSet64 ですが、なぜか Unity では常に 0 を返してきます。Process から取得することができるメモリに関する値は大体 0 です。 これは Unity が採用する Mono 側の問題だと思われ、少々改善が困難な問題です。

使えるパターン

次のコードのようなコードを使えば概ねのメモリ消費量を取得できるようですが、OS 依存のタスクマネージャや Unity プロファイラとはやや開きがあるようです。 さらに、プロファイラを経由するので、Development Build されたアプリケーションや Editor 上でなければ機能しません。

Profiler.GetMonoHeapSize; // ヒープメモリを対象とする
Profiler.usedHeapSize; // ヒープメモリを対象とする
Profiler.GetTotalAllocatedMemory();
Profiler.GetTotalReservedMemory();

したがって、アプリケーションにした状態で正確にメモリ消費量を取得したいときは、ネイティブプラグインのようなものを実装する必要があります。

Reference