Утечка памяти в VB - PullRequest
       38

Утечка памяти в VB

0 голосов
/ 18 ноября 2010

Мы заметили одну интересную проблему, связанную с управлением памятью в 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

Ответы [ 2 ]

3 голосов
/ 18 ноября 2010

Ваш код не компилируется, TestClass не реализует метод Dispose ().

Хотя я могу догадаться, что вы видите.В коде поддержки Edit + Continue, сгенерированном компилятором VB.NET, есть известная ошибка.Он использует WeakReference для отслеживания назначенных обработчиков событий, этот объект WR просачивается, когда вы запускаете свой код без отладчика.Проверьте, можете ли вы решить вашу проблему, либо закомментировав событие, либо запустив сборку Release вашего кода.

Вы не можете отправить сборку Debug вашего проекта, она будет бомбить OOM, когда эти утечки WeakReference потребляютвся память.Выпускается только когда-либо релизная сборка.

0 голосов
/ 18 ноября 2010

Хорошо, я нашел ответ на этот пост. У парня была такая же проблема.

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

...