m-hamada @ ウィキ
Investigate
最終更新:
m-hamada
-
view
ガベージコレクション
●アプリケーション開発時のメモリリーク対応方法
アプリ開発ではoperator newやmalloc等の関数をオーバーライドするなどし、
自前でメモリ管理マネージャを作成します。(-> RML等に該当)
これは次の機能を実装していることが多いです。
アプリ開発ではoperator newやmalloc等の関数をオーバーライドするなどし、
自前でメモリ管理マネージャを作成します。(-> RML等に該当)
これは次の機能を実装していることが多いです。
1.メモリ管理機能
2.メモリコンパクション機能
3.メモリリーク検出機能およびレポート機能
a.リーク検出機能
b.検出時のメモリの確保位置(ファイル名と行数)等のデバッグ情報をレポートする機能。(デバッグ版のみ)
4. 断片化率など現在状態のレポート機能
3.メモリリーク検出機能およびレポート機能
a.リーク検出機能
b.検出時のメモリの確保位置(ファイル名と行数)等のデバッグ情報をレポートする機能。(デバッグ版のみ)
4. 断片化率など現在状態のレポート機能
アプリケーションステートの大きな変化タイミングで、(*1)
断片化率をみてメモリコンパクション(もしくは完全初期化)とメモリリーク検出を行います。
3-(b)の機能があると非常に役に立ちます。
断片化率をみてメモリコンパクション(もしくは完全初期化)とメモリリーク検出を行います。
3-(b)の機能があると非常に役に立ちます。
*1)RPGでワールド画面から戦闘画面へ以降した場合など
●要望
ということでRMLのメモリ管理機能に3-(b)の機能があれば嬉しいかもしれません。
(ユーザ側でも、 RMLのメモリ確保関数を呼び出す時に、メモリ参照オブジェクトとデバッグ情報
構造体(__FILE__,__LINE__を含む)をstd::map<RML_HMEMOBJ, デバッグ情報>
こんな感じでmapすればできますが、、)
ということでRMLのメモリ管理機能に3-(b)の機能があれば嬉しいかもしれません。
(ユーザ側でも、 RMLのメモリ確保関数を呼び出す時に、メモリ参照オブジェクトとデバッグ情報
構造体(__FILE__,__LINE__を含む)をstd::map<RML_HMEMOBJ, デバッグ情報>
こんな感じでmapすればできますが、、)
簡単に実装したサンプルを送ります。メモリ確保するときにマクロを使用して、呼び出し側の__FILE__, __LINE__情報を
保存する所がポイントです。サンプルは意図を伝達するため、アバウトな作りであり見直しやテストなどはしていません。
保存する所がポイントです。サンプルは意図を伝達するため、アバウトな作りであり見直しやテストなどはしていません。
<関連知識>
■garbage collection
ガベージコレクションといった場合、一般的に二つの機能が有ります。
1.メモリコンパクション(メモリ断片化の解消)
2.メモリの自動開放
■garbage collection
ガベージコレクションといった場合、一般的に二つの機能が有ります。
1.メモリコンパクション(メモリ断片化の解消)
2.メモリの自動開放
■メモリの自動開放を検出するアルゴリズム
- 参照カウンタ法
対象オブジェクトへのポインタが増加するたび、参照カウンタをインクリメントする。 減少した場合、デクリメントする。参照カウンタ値が0になったとき対象オブジェクトを開放する。
-循環参照になった場合、メモリは開放されない。
-実装例:各種スマートポインタ( auto_ptr<>, smart_ptr<> )
http://www.stlport.org/ 等
http://www.stlport.org/ 等
- Mark-sweep法
ポインタや専用メモリ管理オブジェクトのデータを順にたどることで、
対象メモリブロックが使用中か否かを判断する。処理負荷が高い。
対象メモリブロックが使用中か否かを判断する。処理負荷が高い。
- Generational Garbage Collection
複数のアルゴリズムを組み合わせた方法。最近はこれが流行り。
■オープンソースの組み込み用GCモジュール
http://sourceforge.net/project/showfiles.php?group_id=28788&package_id=23074
http://sourceforge.net/project/showfiles.php?group_id=28788&package_id=23074