質問: --- アプリケーション:asp.net 言語:vb.net --------- 上記環境でWEBアプリを開発しています。 画面遷移などでsessionにデータを溜める作りにしています。 どのぐらいアプリケーションサーバが耐えられるか 試してみたくて、テスト環境で大量データを 段階的にサイズを増やしてセッションに格納しました。 アプリケーションサーバでテストする前に 自分の端末でvisualStudioの機能を使い セッションがちゃんと増えるか 増えたセッションがちゃんと消えるかを稼働確認しました。 例)ループを100回行ってセッション変数名に session("XXXX"+カウンタ変数)」とつけ若干大きいデータを格納。 ループ後デバッグで中に入っていることを確認。 廃棄用のボタンを用意して、それを押すと 同じ様にループして、1個ずつsession("XXXX"+カウンタ変数).remove デバッグで何も取れない事を確認。 格納と廃棄が確認出来たので、 アプリケーションサーバにリリースして実行しました。 すると、メモリがモリモリ増えていき わーすごいなぁーと、のほほんと見ていたのですが、 いざ廃棄用のボタンを押してもメモリが減りませんでした。 とりあえずアプリケーションプールをリサイクルして 元に戻したので問題は無いのですが・・・。 sessionの破棄についてネットで検索したり 参考書を読むとremoveやremoveallなどやりなさいと書いてありますが 実は意味が無いのでしょうか? なんのためのremoveなんですか? それともiisが何か影響しているのでしょうか? iisの設定はほぼデフォルトでセッションの時間を 少し長くしたぐらいです。inprocにしています。 理由がわかる方がいらっしゃいましたら 教えてください。
回答: .NET のメモリ開放について調べたことがあるので、回答させて頂きます。 .NET はメモリ管理が自動化されており、オブジェクトへの参照がなくなる事で メモリが解放されます。 (Session の Remove により格納したデータへの参照がなくなります) しかし、空きメモリとして再割り当て可能になるには、ガーベージコレクションが 実行されるのを待たなければなりません。 ベージ コレクションの条件.aspx#conditions_for_a_garbage_collection) 通常、ガーベージコレクションの手動実行は不要ですが、テスト的にメモリ開放を リアルタイムで確かめたい場合は、手動実行してみると良いと思います。