• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:メモリリークが発生するのはどういうときですか?)

メモリリークの発生時の条件とdisposeメソッドの使い方

このQ&Aのポイント
  • メモリリークはメモリが解放されずに残るケースであり、画面のCloseやセッションタイムアウトなどでメモリが解放されるが、その他の条件ではメモリリークが発生する可能性がある。
  • クラスのコンストラクタでメモリが確保され、親オブジェクトが解放されると自分自身のメモリも解放される。スタティックメソッドで参照渡しの引数がある場合は、オブジェクトのポインタが渡され、処理完了後に解放される。
  • 画面右上の×ボタン以外で画面が閉じても、セッションタイムアウト時にはメモリが解放される。disposeメソッドはメモリリークを防ぐために用いられるが、特定の条件で使用する必要があり、必ずしも全ての箇所で使用する必要はない。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

メモリの確保はnew演算子のタイミングです (コンストラクタではありません)。 staticなフィールドに関しては,別のタイミングになります。 また,解放されるのは, ・そのインスタンスへの全てのルート参照から(強)参照で辿るためのパスが存在しない ・該当世代のガベージコレクションが実行された の両方を満たすタイミングです。 # ファイナライザがあると,解放が1世代遅れます。 で,staticなフィールドはルート参照であり,そこから(強)参照で辿れるインスタンスは,解放されることがありません。 クラスTのstaticなフィールドにList<T>を用意し,TのコンストラクタでそのフィールドにthisをAddしているような場合に相当します。 staticなフィールドから辿れるインスタンスは,明示的にListからRemoveするなり,nullを代入するなりして,参照を辿れなくする必要があります。 ASP.NETにおけるメモリリークは,これが一番の原因になると思います。 IDisposable.Disposeメソッドは,インスタンスの後処理を行うためのメソッドです。 主に,メモリ以外のリソースの解放処理を行います。 ファイルやネットワーク,DBコネクションなどはGCのタイミングで解放されたのでは遅いことが多いため,Disposeを呼び出します。 なお,通常はusing文を使ってIDisposable.Disposeを確実に呼び出すことが出来るようにします。

souken_200
質問者

お礼

try...finallyよりも、usingの方がシンプルなソースになるので、そっちを調べてみました。 ◆ファイル,ネットワーク,DBコネクションなどのときは、 Dim s As String Using sr As New System.IO.StreamReader( _ "C:\test.txt", System.Text.Encoding.GetEncoding(932)) s = sr.ReadToEnd() End Using Console.WriteLine(s) のようにしようと思います。 ありがとうございます!

その他の回答 (2)

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.3

(1)「その親のオブジェクトが解放されたら」と書かれていますが、その親のオブジェクトが解放されるのはいつですか。 (2)解放されるタイミングは処理完了後ではありません。 (3)ASP.NETならクライアント側の画面は関係ありません。

souken_200
質問者

お礼

調べる良いきっかけになりました。ありがとうございます。

souken_200
質問者

補足

(1),(2) 親オブジェクトが、 ApplicationStartでnewされたなら、生きているのはApplicationEndまででしょうし、 SessionStartでnewされたものは、生きているのはSessionEndまででしょうし、 画面が開かれた際に作られる、画面上のオブジェクトは、画面が閉じられるまでという認識です。 画面のCloseが適正にハンドルできなかった場合などは、SessionTimeOutで消えると思っています。

  • WebSurfer
  • ベストアンサー率55% (33/59)
回答No.1

.NET アプリのランタイムにはガベージコレクタが備わっているので、サーバー側ではメモリリークよりコネクションリークが問題になると思います。詳しくは以下のページを参照してください。Dispose メソッドについても書かれています。 .NETの例外処理 Part.2 http://blogs.msdn.com/b/nakama/archive/2009/01/02/net-part-2.aspx ブラウザ側では循環参照がメモリーリークの原因として一番多いのではないかと思います。詳しくは以下のページを見てください。 Internet Explorer リーク パターンを理解して解決する http://msdn.microsoft.com/ja-jp/library/bb250448(v=vs.85).aspx

souken_200
質問者

お礼

ガベージコレクタ様々ですね。 メモリ以外のリソースの割り当てと管理は、usingで行おうと思います。 ブラウザ側は、単純にデータを表示しているだけなので、今回は問題なさそうです。 ありがとうございます。

関連するQ&A