[pgsql-jp: 40494] Re: 仮想メモリが解放されない

Hiroshi Inoue inoue @ tpf.co.jp
2010年 11月 4日 (木) 17:34:28 JST


(2010/11/04 9:28), 錦戸 暖 wrote:
> (2010/11/03 8:26), Hiroshi Inoue wrote:
>> 井上です。
>>
>>> 調査した結果、以下のような単純なプログラムを実行した場合も
>>> 確保した仮想メモリが減少しないことがわかりました。
>>> ------------------------------------------------------------------
>>> // COMの初期化
>>> CoInitalizeEx(NULL, COINIT_MULTITHREADED)
>>>
>>> // コネクションの取得
>>> _ConnectionPtr c;
>>> c.CreateInstance(_T("ADODB.Connection"));
>>> c.->Open(/*接続文字列*/,/*ユーザID*/,/*パスワード*
>>> /,adConnectUnspecified);
>>>
>>> // レコードセットポインタの取得
>>> _RecordsetPtr r;
>>> r.CreateInstance(_T("ADODB.Recordset"));
>>> r->CursorLocation = adUseClient;
>>>
>>> // SQL実行
>>> r->Open(/*SQL文(SELECT)*/, _variant_t(IDispatch)c, true);
>>>
>>> // レコードセットのクローズ
>>> r->Close();
>>> r->Release();
>>> r=NULL;
>>>
>>> // コネクションのクローズ
>>> c->Close();
>>> c->Release();
>>> c = NULL;
>>>
>>> // COMの終了処理
>>> ::CoUninitalize();
>>> ------------------------------------------------------------------
>>>
>>> SELECT文により取得したデータのために確保された仮想メモリ使用量が
>>> レコードセット、コネクションのクローズ後も確保されたままとなるのですが、
>>> この現象は当然のことなのでしょうか?
>>> 上記処理繰り返すと仮想メモリ使用量が徐々に増加してしまい、仮想メモリ
>>> オーバーが発生します。
>>
>> こちらで簡単なケースを試してみましたが再現しません。何度位繰り返すと
>> 発生するのでしょうか?
> 以下のようなデータをSELECTした場合ならば、1度SQLを発行し終えた時点で
> 発行前の仮想メモリ使用量までは減少しません。
> レコード数:231427レコード
> 1レコードのバイト数:327バイト

一度割り当てた仮想メモリが解放されないのは、当然と言い切る自信は
ありませんが、不思議ではないと思います。私がお聞きしたかったのは
何度位繰り返すと仮想メモリオーバーになるのかということでした。
結構手間がかかるので、こちらのテストでは3~40回でやめています。



pgsql-jp メーリングリストの案内