Как уменьшить объем памяти в приложении VB.NET для Windows? - PullRequest
0 голосов
/ 24 сентября 2010

Я работаю над многопользовательским приложением VB.NET, и когда открывается какая-либо из моих форм, объем памяти увеличивается, и через некоторое время OutOfMemoryException выдается.

Я работаю над VB.net 2008 и SqlServer 2005. Я использовал очень много общего объекта, поэтому во второй раз его выделение памяти меньше, но как я могу уменьшить его, когда форма закрыта или не используется. Могу ли я использовать сборщик мусора или утилизацию и как я использую эту функцию?

Ответы [ 5 ]

3 голосов
/ 24 сентября 2010

Вы отсоединяете все обработчики событий по мере необходимости?Это распространенный источник утечек памяти в приложениях .NET.

Вы можете устранить эту проблему, используя такие инструменты, как ANTS Memory Profiler или, если вы предпочитаете бесплатную опцию WinDbg + SOS очень полезно (но не так просто в использовании),

2 голосов
/ 24 сентября 2010

Использование .net Сборка мусора - это автоматический процесс, избавляющий от любых неиспользуемых объектов в памяти.

Большая часть памяти может быть "потеряна" для программы во время ожидания сборки мусора.

Обычно вы должны оставить сборщика мусора в покое. Это обычно делает приличную работу решения, когда уборка дома будет стоить.

Но вы можете захотеть заставить его руку время от времени.

Существует очень простой вызов для очистки сборки мусора.

GC.Collect ()

Надеюсь, это поможет.

Хотя, возможно, у вас есть другие проблемы, связанные с исключением из памяти.

Вы имеете дело с изображениями случайно?

1 голос
/ 01 июля 2013

Попробуйте этот код для выпущенной RAM MEMORY:

Сначала объявите эту функцию:

Private Declare Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal hProcess As IntPtr, ByVal dwMinimumWorkingSetSize As Int32, ByVal dwMaximumWorkingSetSize As Int32) As Int32

И вот как она используется:

Friend Sub ReleaseMemory()
    Try
        GC.Collect()
        GC.WaitForPendingFinalizers()
        If Environment.OSVersion.Platform = PlatformID.Win32NT Then
            SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1)
        End If
    Catch ex As Exception
        LogError(ex.ToString())
    End Try
End Sub
0 голосов
/ 24 октября 2014

Лучшее:

Открытый класс FreeMemory Закрытое Объявление функции SetProcessWorkingSetSize Lib "kernel32.dll" (_ ByVal процесс как IntPtr, _ ByVal минимумWorkingSetSize As Integer, _ ByVal MaximumWorkingSetSize As Integer) As Integer

Public Shared Sub FlushMemory()
    GC.Collect()
    GC.WaitForPendingFinalizers()
    If (Environment.OSVersion.Platform = PlatformID.Win32NT) Then
        SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1)
    End If
End Sub

Конечный класс

0 голосов
/ 24 сентября 2010

Убедитесь, что вы удалили все ссылки на объект, когда он вам больше не нужен.(или все ссылки на родительский объект)

Если одна из ваших активных форм по-прежнему использует объект, который вам не нужен, сборщик мусора предположит, что он вам все еще нужен, и не удалит его из памяти.

Не забывайте вызывать .Dispose (), когда это необходимо.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...