0

VBのメモリ管理に関して、理解できない興味深い問題が1つあります。誰かがこれを手伝ってくれるなら、してください。

1つのイベントを含む単純なクラスがあります。このクラスの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
4

2 に答える 2

3

コードはコンパイルされず、TestClassはDispose()メソッドを実装しません。

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

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

于 2010-11-18T07:24:41.577 に答える
0

わかりました、私はこの投稿で答えを見つけました。男は同じ問題を抱えていました。

http://bytes.com/topic/visual-basic-net/answers/619203-memory-leak

于 2010-11-18T07:24:17.747 に答える