Version: 2021.3
言語: 日本語
メモリアロケーターのカスタマイズ
インクリメンタルガベージコレクション

ガーベジコレクターの概要

Unity は、ガベージコレクター を使用して、アプリケーションや Unity が使用しなくなったオブジェクトからメモリを回収します。スクリプトがマネージヒープ上で割り当てを行う際に十分なヒープの空きメモリがない場合、Unity はガベージコレクターを起動します。ガベージコレクターを実行すると、ヒープ にあるすべてのオブジェクトを調べ、アプリケーションが参照しなくなったオブジェクトに削除のマークを付けます。Unity は参照されていないオブジェクトを削除し、メモリを解放します。

ガベージコレクターは、必要なブロックサイズを割り当てるのに十分な大きさの空き領域がなくなるまで、継続するリクエストを同じ方法で処理します。この状況では、割り当てられたすべてのメモリがまだ使用されている可能性はあまりありません。Unity のスクリプトバックエンドは、その場所を特定できる参照変数が存在する間だけヒープの参照アイテムにアクセスできます。メモリブロックへのすべての参照がなくなると (参照変数が再割り当てされた場合や、参照変数がスコープ外になったローカル変数で場合)、ガベージコレクターは占有していたメモリを再割り当てすることができます。

どのヒープブロックが使用されていないかを判断するために、ガベージコレクターはすべてのアクティブな参照変数を検索し、それらが参照しているメモリブロックを “live” (ライブ) とマークします。検索が終わると、ガベージコレクターは “ライブ” ブロックの間のスペースが空であると判断し、その後の割り当てに使用するためにマークを付けます。未使用のメモリを探して解放するプロセスは、ガベージコレクション (GC) と呼ばれます。

ノート: WebGL では、ガベージコレクターの動作が異なります。詳しくは、ガベージコレクションの注意点 を参照してください。

Unity では、ガベージコレクターには以下のモードがあります。

  • Use incremental GC (インクリメンタルな GC を使用): このモードは、環境設定 (Project Settings > Player > Configuration) でデフォルトで有効になっています。ガベージコレクションの処理を複数のフレームに分散させます。
  • Use incremental GC 無効: Use incremental GC を Player Setting で無効にすると、ガベージコレクターは、アプリケーションの実行を停止してヒープのオブジェクトを検査して処理します。
  • 自動ガベージコレクション無効: GarbageCollector.GCMode API を使用して、Unity がガベージコレクターを実行するタイミングを完全に制御します。

割り当ての追跡

Unity には、メモリの割り当てを追跡するための以下のツールがあります。

CPU Usage モジュールでは、Hierarchy ウィンドウGC Alloc 列があります。この列は、Unity が特定のフレームでマネージヒープに割り当てたバイト数を表示します。また、ガベージコレクターが管理したメモリの量も表示されます。またこれには、Unity が後続のフレームで割り当てて再利用した可能性のあるメモリも含まれます。つまり、すべてのフレームの GC Alloc の合計は、その間のマネージメモリの増加量を合計するものではありません。

最も正確な情報を得るためには、常に、ターゲットとするプラットフォームやデバイスの開発ビルドでアプリケーションをプロファイルする必要があります。Unity エディターはビルドとは異なる方法で機能し、これはプロファイリングデータに影響します。例えば、 GetComponent メソッドは、エディターで実行される場合に常にメモリを割り当てますが、ビルドされたプロジェクトではそうではありません。

また、Profiler の Call Stacks モード を使用して、どのメソッドで割り当てが行われているかを判断することができます。GC.Alloc サンプルのフルコールスタックトレースを有効にして、ガベージコレクターがいつどこで実行されたかを判断することができます。

メモリアロケーターのカスタマイズ
インクリメンタルガベージコレクション