ページ 11

メモリの断片化について

Posted: 2012年7月20日(金) 14:01
by h2so5
DXライブラリとGoogle V8 Javascript Engine を使ったプログラムを開発しているのですが、
10回に3,4回の割合で起動中にプログラムが停止します。

環境は、
[tab=30]MinGW + gcc 4.6.2
[tab=30]Windows Vista Home Basic
[tab=30]3GB RAM
[tab=30]プログラム起動成功時のプロセス使用メモリ量: 260MB

デバッガ(GDB)経由で起動した場合は今のところこの現象が確認できていません。

プログラムが停止するタイミングはまちまちなのですが、
起動時にスクリプト実行→画像ロード→スクリプト実行→画像ロードという手順が繰り返されている時のようです。
詳しくはまだチェックできていませんが、何度もメモリの確保をしている部分です。

また、しばしば Javascriptエンジンが "Allocation Failed" というエラーを出します。
原因は特定できていないのですが、今のところメモリの断片化によるアロケーション失敗を疑っています。

メモリの断片化について少し調べてみたのですが、
Windows環境において果たしてこのようなアロケーションの失敗が起こりうるのかがよく分かりません。

これだけの情報では判断が困難かと思いますが、
起動失敗の原因がメモリの断片化である可能性はあるのでしょうか?
よろしくお願いします。

Re: メモリの断片化について

Posted: 2012年7月20日(金) 18:59
by ISLe
V8のことは知らないのですが…。
Javascriptのガベージコレクション対象のヒープが不足しているのではないでしょうか?

Javascriptで大きなアプリを作ったことはないので分かりませんが、
Javaだとかなり注意深く作らないと、OutOfMemoryで落ちたりとか、Full GCで数分間ハングアップしたように止まる現象も珍しくないです。

Re: メモリの断片化について

Posted: 2012年7月21日(土) 13:15
by h2so5
スクリプトエンジンまわりのデバッグをしていたところ、
スタックを破壊している部分が見つかり、そこを修正したら正常に作動するようになりました。

Allocation Failed のエラーは、スタックの破壊によってどこかでスクリプトが暴走したのかもしれません。
ISLe さんが書きました:V8のことは知らないのですが…。
Javascriptのガベージコレクション対象のヒープが不足しているのではないでしょうか?
V8はGCの動作がかなり消極的なので、GCがボトルネックになることは少ないのではないかと思います。
ともあれ、ありがとうございました。