2011-09-16 28 views
0

管理対象外オブジェクトのリリースに関するクエリが1つあります。アンマネージドオブジェクトはCLRの直接管理下にないので、CLRはそれを直接解放することはできません。そのためにdisposeコマンドを呼び出しますが、そのアンマネージドオブジェクトに対してアプリケーションでdisposeコマンドを使用しなかった場合、 。未管理オブジェクトのメモリ管理

例: C#コードで接続オブジェクトを使用している場合

try 
{ 
    string strConnectionString = ""; 
    strConnectionString = "Server=FTSPROD\\FTS_PROD;Database=tdps_uat;User ID=txnapp;password=txnapp;Min Pool Size=5;Max Pool Size=10000;"; 
    for (int i = 0; i < 10000; i++) 
    {    
     SqlConnection cnUpdateTransaction;      
     cnUpdateTransaction = new SqlConnection(strConnectionString); 
     cnUpdateTransaction.Open(); 
     cnUpdateTransaction. 
     //cnUpdateTransaction.Close(); 
    } 
} 
catch (Exception Ex) 
{ 

} 

ここで私は10000インスタンスの接続オブジェクトを開き、ガベージコレクションのために残しています。さて、それらは管理されていないオブジェクトであり、私はこのオブジェクトがどのように解放されるかを最後に呼び出したり、処理したりしていません。オペレーティングシステムがこれと何かを行うかどうか。この問題については、文書リンクをご利用ください。

+0

あなたは変数を ""に初期化してすぐにそれを別のものに設定することで、悪い習慣を守っています。 'using'ブロックを実装しないことで、コードに接続文字列を含めてコードを投稿する(ヒント:データベースのパスワードを今すぐ変更する**)。 –

+0

私はあなたが言ったことすべてを認識していますが、ここに書かれたコードは非常に基本的なものであり、アンマネージド接続を複数回開いてdisposeまたはcloseメソッドを呼び出さなかった場合のこのアンマネージド接続オブジェクトのリリース方法を知りたいだけです。 。また、C#でこのクラス(SqlConnection)に実装されているファイナライザを見たことがありません – funsukvangdu

答えて

0

IDisposableを実装し、そのクラスに管理されていないリソースがある場合は、Disposeメソッドを呼び出すFinalizerを実装する必要があります。この方法で、クラスのユーザーがDispose管理対象外のリソースにコールできなかった場合、GCの実行時に(最終的に)解放されます。良い例は、Implement IDisposable correctlyを参照してください。

オブジェクトにアンマネージリソースへの参照が含まれ、ファイナライザが含まれておらず、Diposeが呼び出されていない場合、そのメモリは自動的に再要求されません。基本的には、メモリリークがあります。プロセスがシャットダウンされるまで、メモリは再利用されません。興味深い解説はIdentify And Prevent Memory Leaks In Managed Codeを参照してください。

+0

finalizerを実装するとアンマネージリソースが解放されますが、私が知りたいことは、disposeでfinalizerを実装しなかった場合、その管理されていないオブジェクトの何が起こったのか、それがどのように解放されるのでしょうか。このようなオブジェクトを消去するオペレーティングシステム – funsukvangdu