2011-11-09 21 views
0

実行時に以下のコードがメモリリークを引き起こすのはなぜですか?このエラーは、Microsoft Visual Studio 2005または2008をvb.net言語で使用する場合にのみ発生します。私がC#を使用している場合、問題はありません。VB.NetではOracle Data Access(ODP)を使用したOracle Connectionのメモリリーク(C#はありません)

Dim strCon As String = "data source=SRV-10G;user id=Test;password=1234" 

dim factory as DbProviderFactory = DbProviderFactories.GetFactory("Oracle.DataAccess.Client"); 

Dim conexao As IDbConnection = factory.CreateConnection 

conexao.ConnectionString = strCon 

conexao.Open() 


For cont As Integer = 1 To 100000 

    Dim comando As IDbCommand = conexao.CreateCommand() 

    comando.CommandText = "Select * from tabela where campo = " & cont 

    Dim leitor As IDataReader = comando.ExecuteReader 

    While leitor.Read 

    Dim v As String = leitor.GetValue(1).ToString 

    End While 

    leitor.Close() 
    leitor.Dispose() 

    comando.Dispose() 
Next 

conexao.Close() 
conexao.Dispose() 
+0

作業用のC#コードを投稿して、2つのコードを比較することはできますか。そして、メモリリークがあると思う理由を投稿することができます(プロセスメモリが増加し続ける、データベース接続が閉じられないなど)。 – ligos

答えて

0

どのようにメモリリークがあるのですか?どのようにガベージコレクションされた言語でメモリリークを起こすことができますか?メモリリークがあることを具体的に示すエラーメッセージが表示された場合は、データベースドライバ自体に問題がある可能性があります。これは、任意の言語で書かれている可能性があります。そのドライバに対して.NETコードを書くことは、あなたが使っている.NET言語のおかげで何の問題も起こしてはいけません。

+0

上記のコードを実行して「タスクネーム」に入ると、メモリの量はダイプロセスに上がります。この例では、C#で実行すると同じエラーは発生しません。メモリは一定のままです。この例を使用し、自分で見てください。 –

+0

"どのようにガベージコレクションされた言語でメモリリークを起こすことができますか?" .NETでメモリリークを起こすことができないと思っている場合(または正確なメモリの保持)、ガベージコレクタの動作についてもう少し詳しくお読みください。 1つの例は、イベントハンドラの登録を忘れることです。 –

0

あなたが投稿したコードはOKと思われます。 VB.NETにはUsingというステートメントがありますが、少なくとも広告を読むのが簡単になります!あなたはもっと多くの提案をする前に、より多くの情報を投稿する必要があります。

この古い答えをチェックしたいと思うかもしれません:Any decent C# profilers out there? c#に特有ですが、すべての.NETメモリプロファイラもVB.NETでも動作します。

関連する問題