
メモリが解放されずに残るケースというのは、どういうときがあるのでしょうか?
※asp.netでプログラムを書いています。
(1)どのクラスも、基本的にコンストラクタでメモリが確保され、
どのクラスも、その親のオブジェクトが解放されたら、自分自身のメモリも解放される。
よって、画面のCloseで、すべてのオブジェクトのメモリは解放される。と思っています。
(2)スタティックメソッドで、参照渡しの引数があるとき、何度そのメソッドを使っても、
オブジェクトのポイントが渡るだけだし、処理完了後は、そのポインタすらも解放すると思っています。
(3)画面右上の「×」のボタン以外で画面が閉じてしまったとしても、セッションタイムアウトになった時点で、その分のメモリは解放すると思っています。
◆どうしてdisposeメソッドがあるのでしょうか?
.自分は、プログラム内に1箇所も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を確実に呼び出すことが出来るようにします。
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)
のようにしようと思います。
ありがとうございます!
No.3
- 回答日時:
(1)「その親のオブジェクトが解放されたら」と書かれていますが、その親のオブジェクトが解放されるのはいつですか。
(2)解放されるタイミングは処理完了後ではありません。
(3)ASP.NETならクライアント側の画面は関係ありません。
この回答への補足
(1),(2)
親オブジェクトが、
ApplicationStartでnewされたなら、生きているのはApplicationEndまででしょうし、
SessionStartでnewされたものは、生きているのはSessionEndまででしょうし、
画面が開かれた際に作られる、画面上のオブジェクトは、画面が閉じられるまでという認識です。
画面のCloseが適正にハンドルできなかった場合などは、SessionTimeOutで消えると思っています。
No.1
- 回答日時:
.NET アプリのランタイムにはガベージコレクタが備わっているので、サーバー側ではメモリリークよりコネクションリークが問題になると思います。
詳しくは以下のページを参照してください。Dispose メソッドについても書かれています。.NETの例外処理 Part.2
http://blogs.msdn.com/b/nakama/archive/2009/01/0 …
ブラウザ側では循環参照がメモリーリークの原因として一番多いのではないかと思います。詳しくは以下のページを見てください。
Internet Explorer リーク パターンを理解して解決する
http://msdn.microsoft.com/ja-jp/library/bb250448 …
ガベージコレクタ様々ですね。
メモリ以外のリソースの割り当てと管理は、usingで行おうと思います。
ブラウザ側は、単純にデータを表示しているだけなので、今回は問題なさそうです。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルに張り付けた写真のフ...
-
キヤノン アソビカメラ iNSPiC ...
-
VB.NET Excelを読み込んでDataT...
-
aspxをhtmlに変換する方法について
-
vba 空のデータをSplitする時の...
-
VBAでPDFを作成する際、同じ名...
-
phpのファイルがブラウザで開か...
-
【VB.NET】Excelの最終行までの...
-
バッチで当日日付で作成される...
-
高校1年生情報の問題について。
-
エクセルVBAで印刷する書式をク...
-
Windows10にデュアルブートでXP...
-
Windowsで複数のファイルを同じ...
-
vba マージエリアの行数を非表...
-
SJISで、全角文字Aの文字コード...
-
SPO2測定
-
エクセルのマクロについて教え...
-
インドe-Visa 承認書のApplicat...
-
SPIの非言語の割合と比が難しく...
-
SPIの対策は参考書でやるべきか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
オブジェクトをどこでdisposeす...
-
コンストラクタ内でのthisポインタ
-
C# panel内のコントロールの使...
-
メモリリークが発生するのはど...
-
DataGridViewがクラッシュする
-
関数で値渡しと参照渡しではど...
-
最小化したフォームを元に戻す
-
メモリ解放について、ご教授く...
-
オブジェクト型の変数が定義さ...
-
【VC++6.0(MFC)】「Out of memo...
-
ボタンを押すとラベルの文字を...
-
イベントドリブンとオブジェク...
-
C#でのコンパイル時のエラー
-
デザイナ時のエラー「オブジェ...
-
ソースの書き方について
-
クラス内にWin32APIのコールバ...
-
C#でのUNZIP32.DLLの利用方法が...
-
クラス?オブジェクト?インス...
-
UMLでの「オブジェクト」と「イ...
-
既定のコンストラクタがない?
おすすめ情報