2010-11-18 15 views
0

私たちは理解できないVBのメモリ管理に関する興味深い問題に気付きました。もし誰かがこれで私たちを助けることができたら、してください。VBのメモリリーク

私たちは、単一のイベントを持つ単純なクラスを持っています。このクラスのインスタンスを5000個作成して破棄し、テストを実行する前にプロセスのメモリー使用量を読み取ります。最後にGCを強制して再びメモリをチェックします。我々が気づいたのは、一定のメモリが成長していることです。私たちはC#で同じサンプルを作成しましたが、この問題は発生しませんでした。ここに有線のポイントがあります。クラスからのイベント宣言を省略すると、予想どおりにメモリが消去されます。誰にも理由が分かり、このクラスを完成させる正しい方法は何ですか?ここで

はサンプルコードです:

Public Class Form1 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim memorySize As Long 
     memorySize = System.Diagnostics.Process.GetCurrentProcess().WorkingSet64 

     Console.Out.WriteLine(System.Diagnostics.Process.GetCurrentProcess().WorkingSet64/(1024.0 * 1024.0)) 
     For index As Integer = 1 To 5000 
      Dim x As New TestClass() 


      x = Nothing 
      Me.Text = index.ToString() 
     Next 
     GC.Collect() 
     Console.Out.WriteLine(System.Diagnostics.Process.GetCurrentProcess().WorkingSet64/(1024.0 * 1024.0)) 
     Console.Out.WriteLine("delta: " + ((System.Diagnostics.Process.GetCurrentProcess().WorkingSet64 - memorySize)/(1024.0)).ToString() + " kb") 

    End Sub 
End Class 

とテストクラス:

Imports System.ComponentModel 
Imports System.ComponentModel.Design.Serialization 
Imports System.Xml 
Imports System.Xml.XPath 

Public Class TestClass 

    Friend Event ForeColorChanged() 

    Public Sub New() 
    End Sub 


    Protected Overrides Sub Finalize() 
     MyBase.Finalize() 
    End Sub 

End Class 

そして、いくつかの実行後、プリントアウト:

22,76953125 
23,828125 
delta: 2016 kb 
24,08984375 
24,0625 
delta: 228 kb 
24,4375 
24,2109375 
delta: 24 kb 
24,58984375 
24,83984375 
delta: 384 kb 
24,84375 
24,890625 
delta: 48 kb 

答えて

3

、TestClassをは廃棄()メソッドを実装していません。

私はあなたが何を見ているのか推測できます。 VB.NETコンパイラが生成するEdit + Continueサポートコードには既知のバグがあります。 WeakReferenceを使用して割り当てられたイベントハンドラを追跡し、デバッガなしでコードを実行するとWRオブジェクトがリークする。イベントをコメントアウトするか、コードのリリースビルドを実行して問題を解決できるかどうかを確認してください。

プロジェクトのデバッグビルドを出荷することはできません。リークされたWeakReferenceオブジェクトがすべてのメモリを消費すると、OOMが爆発します。リリースビルドのみを出荷します。

+0

はいごめんなさい。私はこの行を削除しました。しかし、はい、あなたは正しいです。それはバグです。私はrelaseとコードの最適化を設定し、メモリ管理は今okです。ご回答有難うございます。 – Gico