メモリの割り当てとガベージ コレクション

MAXScript は、3ds Max が作業するたびに割り当てるメモリの他に、MAXScript 自体の作業メモリを割り当てます。

MAXScript に設定されている既定の作業メモリ サイズは 15 MB で、メモリはすべての 3ds Max メモリと同様に仮想で、ページング可能です。

既定の割り当てにはほとんどのタスクが収納されますが、次のように MAXScript システムのグローバル変数 heapSize で割り当てを増やすこともできます。

heapSize += 2000000 -- another 2 MB, for a total of 9.5 MB

MAXScript タスクに割り当てる追加のメモリが常に必要な場合は、このステートメントを自分のスタートアップ スクリプトに登録できます。または、3ds Max の[カスタマイズ](Customize) > [基本設定](Preferences)ダイアログ ボックスの[MAXScript]タブで、既定のサイズを設定できます。

   

MAXScript ヒープを増やすと、他の 3ds Max タスクに必要なメモリ アドレス スペースが減ります。

既定値のメモリ設定の調整は、MAXScript から「メモリ不足」というエラー メッセージが表示されるか、ガベージ コレクションにより頻繁に停止するときにだけ行います。

   

3ds Max セッション中の MAXScript ヒープは必要に応じて何度でも増やせますが、減らすことはできません。

MAXScript のメモリ ヒープを既定値の設定にリセットするには、3ds Max を再起動します。

   

MAXScript は、「自動ガベージ コレクション」というメモリ管理スキームを使用します。

つまり、既に不要になっている値が占有しているメモリを明示的にクリアする必要がないということです。

変数に新しい値を代入したり、ローカル変数のブロックが存在する場合、変数に含まれていた参照は解除されます。

ある値のメモリへの参照をプログラムがすべて解除したときが、メモリをクリアするのに適したタイミングです。

   

配列など一部の値には他の値への内部参照があります。

配列の中では、各要素に別の値への参照が含まれています。

新しい値を配列要素に代入すると、配列要素の古い参照が解除されます。

配列自体への参照をすべて削除すると、配列要素の中の参照はすべて暗示的に解除されます。

ユーザ構造体や 3ds Max オブジェクトなどのコンポーネント値も同じです。

   

MAXScript はメモリ不足になると、ガベージ コレクション パスでメモリをクリアします。

MAXScript メモリ全体のガベージがスキャンされるため、わずかな一時停止が発生することもあります。

ガベージ コレクションの利点は、値を必要な数だけ作成できること、および不要になった値が消去されることです。

 

3ds Max 9 から、 HeapSize HeapFree システム変数は、64 ビット システムの増加したメモリ アドレス スペースに対応するため、Integer から Integer 64 に変更されました。

   

3ds Max 9 以降では、ヒープ サイズの初期値は 512 MB に制限されています。

ヒープ サイズの初期値が高すぎて、指定されたメモリ ブロックを割り当てられない場合は、メモリ ブロックを割り当てられるようになるまでヒープ サイズの初期値が 10% ずつ小さくされていきます。

1MB のメモリ ブロックを割り当てることができない場合は、アサートがトリガされて 3ds Max セッションが中止されます(システムの起動時に 1MB を割り当てられないとすると、何らかの致命的な障害が発生している可能性があります)。

それ以外の場合は、要求されたヒープ サイズが自動的に減少されたことを示すメッセージと、実際に割り当てられたヒープ サイズがステータス パネルに表示されます。

ヒープ サイズの初期値が最低でも MAXScript の必須要件である 12 バイトであることを確認するためのテストが追加されています。

   

新しい値が割り当てられた場合に、ヒープ サイズが必要に応じて(ガベージ コレクションを完全に実行した後に要求されたメモリ サイズが利用できない場合など)自動的に増加されるようにするためのコードが追加されています。

まず、要求されたサイズの 50 倍または 512KB を増加しようとします。

この割り当てに失敗すると、割り当てるサイズを削減して何回かの割り当てが試行され、最後の割り当ては要求されたサイズの最大値または 256KB になります。

この最後の割り当てが失敗すると、ランタイム エラーとなります。

それ以外の場合は、ステータス パネルに、要求されたヒープ サイズが自動的に増加されたことを示すメッセージと、新しいヒープ サイズが表示されます。

   

heapCheck() 	 

heapCheck() メソッドは主に内部的なデバッギングに使用されます。

ヒープの最低限の整合性チェックを実行するために、スクリプトから呼び出されます。

3ds Max 9 以降で使用可能です。

有効な戻り値は次のとおりです。

OK - ヒープは整合しています(_HEAPOK)

-1 - ヒープが初期化されていません(_HEAPEMPTY)

-3 - 初期のヘッダ情報が不正であるか、検出されません。(_HEAPBADBEGIN)

-4 - 不正なノードが検出されました。または、ヒープが損傷しています。(_HEAPBADNODE)

-6 - ヒープへのポインタが無効です(_HEAPBADPTR)

関連するメソッドについては、「CRT デバッグ関数」も参照してください。

関連事項