- PR -

変数に対するメモリの使い方について

投稿者投稿内容
MIRU
常連さん
会議室デビュー日: 2006/05/30
投稿数: 21
投稿日時: 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はメモリ上から存在しない、と考えてよいのでしょうか?

どなたかご教授お願いします。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-06-09 20:17
引用:

MIRUさんの書き込み (2006-06-09 20:08) より:

Dim i as string
などと宣言した変数は、PostBack時に使えなくなるのはわかるのですが、
PostBack後にiを格納していたメモリはちゃんと開放されているのでしょうか?


GCがそのうち回収してくれます。

引用:

何故そう思ったかといいますと、もし開放されているのなら、Disposeや = nothingは
必要ないのではと思ったからです。


Dispose を実装しているメソッドは
その必要があるから実装しているのだと思います。

データベースのコネクションなどは使ったら他の人のために
すぐにコネクションプールに戻してあげる必要がありますよね

Nothing を代入するのは GC の助けになるかも知れませんが
あまり意味は無いかもしれません。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-06-09 21:03
引用:

PostBack後にiを格納していたメモリはちゃんと開放されているのでしょうか?


はい。
「PostBack時」「PostBack後」というのは少し解釈が違いますが。

引用:

もし開放されているのなら、Disposeや = nothingは
必要ないのではと思ったからです。


Dispose() と メモリの解放は全く意味が違います。
GC に任せないで、早急に解放すべき「リソース」を解放するときに Dispose() を使います。
かるあさんが仰っている「コネクション」だとか、何がしかの「ハンドル」だとかです。

引用:

あと、sessionの開放についても思うところがあるのですが、・・・


「解放」ではなく、「セッション値の削除」です。メモリがどうのこうのはまた別の話ですね。


_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-09 21:28
引用:

囚人さんの書き込み (2006-06-09 21:03) より:

Dispose() と メモリの解放は全く意味が違います。
GC に任せないで、早急に解放すべき「リソース」を解放するときに Dispose() を使います。


「リソースの解放」と「メモリ管理」を、同一視している方は多いですよね。

引用:

MIRUさんの書き込み (2006-06-09 20:08) より:

何故そう思ったかといいますと、もし開放されているのなら、Disposeや = nothingは必要ないのではと思ったからです。


System.IDisposable インターフェイスが実装されているクラスは、
不要になったら早急に Dispose メソッドを呼び出すのが好ましいです。
(IDisposable インターフェイスは、Using と必ずペアで使います)

それと、Nothing を当てることの意味合いは、"参照の解放" です。
このあたり、VB6 以前の頃から間違えている人が、私の周りにも多いのですが...
結果的に "メモリ解放" になるのは、デストラクタ (Terminate) による作用です。

ローカル変数 (ブロック変数) の場合、その変数が参照できない範囲に達すると、
Nothing を当てて "参照がなくなった" のと同じ状態になります。
(スコープが狭い場合、即時参照を解放したい場合を除き、あまり意味がないです)

引用:

これは、Clearはまだメモリを保持している、
nothingはメモリ上から存在しない、と考えてよいのでしょうか?


Nothing は、変数の "参照を解放" しているだけです。
Clear とは違って、実体に何かをしているわけではありません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-06-10 09:38
ちなみに・・・

引用:

MIRUさんの書き込み (2006-06-09 20:08) より:

Webアプリを開発し始めて数ヶ月。
最近やっとメモリの使い方が気になってきたので、質問させていただきます。

環境は
#VB.NET
#Webアプリ
#Framework1.1


これらは、上記の限ったことではありません・・・一応気になったので・・・
MIRU
常連さん
会議室デビュー日: 2006/05/30
投稿数: 21
投稿日時: 2006-06-10 19:10
皆さんの回答をまとめると、
・nothingは参照できなくなるだけでメモリ管理上での意味はほとんど無い
・PostBackが起こったときは、各変数は参照が出来なくなる(nothingと同じ)
・しかし、参照が出来ないだけでメモリ上にはまだ存在する
・参照が出来なくなった変数はGCがいつか回収してくれる
・GCに任せず出来るだけ早くメモリを空けたいときは、Dispose() を使う
・session.Clear()はちゃんと削除(メモリ領域の開放)を行っている
・session(〜)=nothing はやっぱりメモリ管理上意味は無い
と、理解してよろしいのでしょうか?

あと疑問なのですが、
nothingなどで、参照されなくなったメモリの領域は、
処理に影響(処理落ちなど)を与えてしまうものなのでしょうか?


>R・田中一郎
>これらは、上記の限ったことではありません・・・一応気になったので・・・
……たしかに普通どれでも同じですよね。
session・PostBackといったらWebアプリだし……。
いちよう環境が必要かと思い投稿の最後に追加したのですが蛇足だったみたいですね。
失礼しました。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-06-10 20:01
引用:

MIRUさんの書き込み (2006-06-10 19:10) より:

・GCに任せず出来るだけ早くメモリを空けたいときは、Dispose() を使う


これは違いますね、
Dispose() はアンマネージドリソースの開放を行ってもらうためにあります
前にも書きましたが、データベースコネクションなどは
使い終わった時点で他の人が使えるように開放してあげる必要がありますよね

囚人さんや、じゃんぬさんもおっしゃってますが
メモリの開放とは別になります。

引用:

あと疑問なのですが、
nothingなどで、参照されなくなったメモリの領域は、
処理に影響(処理落ちなど)を与えてしまうものなのでしょうか?

囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-06-10 20:01
引用:

皆さんの回答をまとめると、
中略…


違います。
ガベージコレクションについては以下のリンクの「ガベージコレクション入門」を読んで理解を深めてください。
http://www.microsoft.com/japan/msdn/net/mag00/

ポストバックが云々は以下のリンクの記事を読んで下さい。
http://www.atmarkit.co.jp/fdotnet/entwebapp/entwebapp05/entwebapp05_03.html
ポストバックがどうのこうのではなく、リクエスト毎にページインスタンスが作られているだけです。

_________________
囚人のジレンマな日々

スキルアップ/キャリアアップ(JOB@IT)