- - PR -
変数に対するメモリの使い方について
1|2|3|4|5
次のページへ»
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-06-09 20:08
こんばんわ。
Webアプリを開発し始めて数ヶ月。 最近やっとメモリの使い方が気になってきたので、質問させていただきます。 環境は #VB.NET #Webアプリ #Framework1.1 です。 ソースで Dim i as string などと宣言した変数は、PostBack時に使えなくなるのはわかるのですが、 PostBack後にiを格納していたメモリはちゃんと開放されているのでしょうか? 何故そう思ったかといいますと、もし開放されているのなら、Disposeや = nothingは 必要ないのではと思ったからです。 あと、sessionの開放についても思うところがあるのですが、 session.Clear と session(〜)=nothing では開放の仕方が違うのでしょうか? その後の、クイックウォッチで値を見ると Clearは""、nothingはnothingとなっています。 これは、Clearはまだメモリを保持している、 nothingはメモリ上から存在しない、と考えてよいのでしょうか? どなたかご教授お願いします。 | ||||||||||||
|
投稿日時: 2006-06-09 20:17
GCがそのうち回収してくれます。
Dispose を実装しているメソッドは その必要があるから実装しているのだと思います。 データベースのコネクションなどは使ったら他の人のために すぐにコネクションプールに戻してあげる必要がありますよね Nothing を代入するのは GC の助けになるかも知れませんが あまり意味は無いかもしれません。 | ||||||||||||
|
投稿日時: 2006-06-09 21:03
はい。 「PostBack時」「PostBack後」というのは少し解釈が違いますが。
Dispose() と メモリの解放は全く意味が違います。 GC に任せないで、早急に解放すべき「リソース」を解放するときに Dispose() を使います。 かるあさんが仰っている「コネクション」だとか、何がしかの「ハンドル」だとかです。
「解放」ではなく、「セッション値の削除」です。メモリがどうのこうのはまた別の話ですね。 _________________ 囚人のジレンマな日々 | ||||||||||||
|
投稿日時: 2006-06-09 21:28
「リソースの解放」と「メモリ管理」を、同一視している方は多いですよね。
System.IDisposable インターフェイスが実装されているクラスは、 不要になったら早急に Dispose メソッドを呼び出すのが好ましいです。 (IDisposable インターフェイスは、Using と必ずペアで使います) それと、Nothing を当てることの意味合いは、"参照の解放" です。 このあたり、VB6 以前の頃から間違えている人が、私の周りにも多いのですが... 結果的に "メモリ解放" になるのは、デストラクタ (Terminate) による作用です。 ローカル変数 (ブロック変数) の場合、その変数が参照できない範囲に達すると、 Nothing を当てて "参照がなくなった" のと同じ状態になります。 (スコープが狭い場合、即時参照を解放したい場合を除き、あまり意味がないです)
Nothing は、変数の "参照を解放" しているだけです。 Clear とは違って、実体に何かをしているわけではありません。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2006-06-10 09:38
ちなみに・・・
これらは、上記の限ったことではありません・・・一応気になったので・・・ | ||||||||||||
|
投稿日時: 2006-06-10 19:10
皆さんの回答をまとめると、
・nothingは参照できなくなるだけでメモリ管理上での意味はほとんど無い ・PostBackが起こったときは、各変数は参照が出来なくなる(nothingと同じ) ・しかし、参照が出来ないだけでメモリ上にはまだ存在する ・参照が出来なくなった変数はGCがいつか回収してくれる ・GCに任せず出来るだけ早くメモリを空けたいときは、Dispose() を使う ・session.Clear()はちゃんと削除(メモリ領域の開放)を行っている ・session(〜)=nothing はやっぱりメモリ管理上意味は無い と、理解してよろしいのでしょうか? あと疑問なのですが、 nothingなどで、参照されなくなったメモリの領域は、 処理に影響(処理落ちなど)を与えてしまうものなのでしょうか? >R・田中一郎 >これらは、上記の限ったことではありません・・・一応気になったので・・・ ……たしかに普通どれでも同じですよね。 session・PostBackといったらWebアプリだし……。 いちよう環境が必要かと思い投稿の最後に追加したのですが蛇足だったみたいですね。 失礼しました。 | ||||||||||||
|
投稿日時: 2006-06-10 20:01
これは違いますね、 Dispose() はアンマネージドリソースの開放を行ってもらうためにあります 前にも書きましたが、データベースコネクションなどは 使い終わった時点で他の人が使えるように開放してあげる必要がありますよね 囚人さんや、じゃんぬさんもおっしゃってますが メモリの開放とは別になります。
| ||||||||||||
|
投稿日時: 2006-06-10 20:01
違います。 ガベージコレクションについては以下のリンクの「ガベージコレクション入門」を読んで理解を深めてください。 http://www.microsoft.com/japan/msdn/net/mag00/ ポストバックが云々は以下のリンクの記事を読んで下さい。 http://www.atmarkit.co.jp/fdotnet/entwebapp/entwebapp05/entwebapp05_03.html ポストバックがどうのこうのではなく、リクエスト毎にページインスタンスが作られているだけです。 _________________ 囚人のジレンマな日々 |
1|2|3|4|5
次のページへ»