デスクトップヒープが足らずにコントロール作成エラー
2011年08月22日 11時40分
納品しているプログラムが先方環境だと定期的に落ちるという報告があったので調査したところWindow Handleの作成に失敗するというエラーログが出力されていた。
Win APIを直接触るわけでもなくWindow Handleなんて.NETで意識したことなかったが調査したところデスクトップヒープ領域が足らずに落ちていることが判明。
Visual Studioで直接デバッグできないので以下のツールを使用してデバッグ。
デスクトップヒープ モニターツール ダウンロードページ
http://www.microsoft.com/downloads/en/confirmation.aspx?familyid=5CFC9B74-97AA-4510-B4B9-B2DC98C8ED8B&displaylang=en
どうもPanelにButtonをAddする度に大量に減っていく。
そしてPanel.Clear()しても開放されずに消費したままなのが原因。
Clearして参照がなくなる前にコントロールをDisposeすることで現象が解消した。
1 2 3 4 |
For i as Integer = 0 To Panel.Controls.Count - 1 Panel.Controls(i).Dispose() Next Panel.Clear() |
GCの開放タイミングの問題だが既にリリースしてPGをあまり変えられない場合は
Disposeを明示的に呼ぶことで解消する場合がある。
デスクトップヒープ モニターツール 参考ページ
http://www.atmarkit.co.jp/fwin2k/win2ktips/071desktopheap/desktopheap.html
http://support.microsoft.com/kb/914216
http://www.rcs-solutions.com/blog/2007/12/05/TheDesktopHeap.aspx
http://space.geocities.jp/nequomame/dotnet/winservice/winservice_04.html