
メモリが解放されずに残るケースというのは、どういうときがあるのでしょうか?
※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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vba メモリ節約 3 2022/09/16 21:45
- その他(プログラミング・Web制作) Pythonのデータ型 2 2023/04/26 12:53
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Ruby 【メモリ不足で落ちる(python)】 1 2022/05/26 21:22
- システム CPUの問題について 2 2022/07/09 12:04
- Visual Basic(VBA) <excel vba>selenium basicのWebDriverの自動更新のエラーについて 1 2022/10/01 17:07
- その他(自然科学) 論文のまとめに関して(小論文)添削お願いします。 6 2023/07/16 14:24
- Excel(エクセル) テキストの背後にあるオブジェクトとは 3 2023/01/03 20:22
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- その他(Microsoft Office) オフィス365のエクセル 3 2023/06/29 13:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6では、Applicationは未定義...
-
メモリ解放について、ご教授く...
-
最小化したフォームを元に戻す
-
VBA チェックボックスをオーバ...
-
FriendとPublicの違い。。。
-
DataGridViewのセルに斜線を引...
-
C# using の有効範囲
-
ダイアログクラスのコントロー...
-
VB.NETでクラスライブラリプロ...
-
C++勉強中なんですが
-
イベントにAddHandlerされてい...
-
個々の関数について継承してい...
-
WindowsAPIのリストビューの...
-
C#で、動的にサブクラスを取得...
-
C#でVB.NETのReplaceコマンドを...
-
MFCのドラッグ&ドロップについて
-
MFCアプリのコマンドラインでパ...
-
既定のコンストラクタがない?
-
ダイアログ表示時にチェックボ...
-
エディットコントロールのイベ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
オブジェクト型の変数が定義さ...
-
C# panel内のコントロールの使...
-
delete演算子によるメモリ解放...
-
CreateObjectとはどういう意味...
-
関数で値渡しと参照渡しではど...
-
ボタンを押すとラベルの文字を...
-
オブジェクトをどこでdisposeす...
-
クラス内にWin32APIのコールバ...
-
コンストラクタ内でのthisポインタ
-
【VC++6.0(MFC)】「Out of memo...
-
C#でのUNZIP32.DLLの利用方法が...
-
SetとNothingの存在意味?
-
一時オブジェクト?の生存期間
-
「R = ActiveCell」がエラーに...
-
最小化したフォームを元に戻す
-
DataGridViewがクラッシュする
-
クラス?オブジェクト?インス...
-
メモリ解放について、ご教授く...
-
メモリリークが発生するのはど...
-
UMLでの「オブジェクト」と「イ...
おすすめ情報