Потребление памяти GetRef (сборка мусора) изменилось с помощью KB4525236 - PullRequest
11 голосов
/ 06 февраля 2020

У нас возникают проблемы с нехваткой памяти после установки KB4525236 на наши Windows 2016 Серверы / Windows 10 Клиентов. Это исправление безопасности, по-видимому, изменило момент, когда память собиралась мусором при вызове функции через GetRef.

Pr KB4525236

Каждый экземпляр, созданный в функции, вызываемой через GetRef, получал мусор собирается, как только переменная экземпляра была установлена ​​на nothing

Post KB4525236

Каждый экземпляр, созданный в функции, вызываемой через GetRef, остается в памяти и сборка мусора происходит только тогда, когда вся функция завершается . При создании экземпляров в al oop это может быстро сложиться и привести к нехватке памяти, особенно в 32-разрядном процессе.

Вопросы

  • мы можем не нашли ничего релевантного в Интернете, поэтому мы хотели бы получить подтверждение от других людей, сталкивающихся с такой же проблемой.
    РЕДАКТИРОВАТЬ , отметьте, что: это - это та же проблема, но пока не найдено решение
    (ошибка vbscript.dll в class_terminate начиная с KB4524570 (12 ноября 2019 г.) Windows 10 1903)
  • , если кто-то может проверить и знает работоспособное решение, это было бы здорово.

PO C

следующий скрипт, работающий на устройстве с установленным KB4525236, показывает разницу в сборке мусора, когда

  • вызывается напрямую: второй экземпляр создается только после первый экземпляр уничтожается (это наше желаемое поведение)
  • вызывается через GetRef: второй экземпляр создается до первый экземпляр уничтожен, поэтому у вас есть два экземпляра, использующих память.

сохранить как: KB4525236.vbs
запустить как: wscript KB4525236.vbs

Dim Name, Log

Class IDummyInstance
  Dim FName
  Sub Class_Initialize
    FName = Name
    Log = Log & "Initialize " & FName & VbNewLine
  End Sub
  Sub Class_Terminate
    Log = Log & "Terminate " & FName & vbNewLine
  End Sub
End Class

Sub CreateDestroyTwoInstances
  Dim DummyInstance
  Name = "First Instance"
  Set DummyInstance = New IDummyInstance
  Set DummyInstance = Nothing
  Name = "Second Instance"
  Set DummyInstance = New IDummyInstance
  Set DummyInstance = Nothing
End Sub

Log = "(1) Direct Call :" & VbNewLine
Call CreateDestroyTwoInstances

Log = VbNewLine & Log & "(2) GetRef Call :" & vbNewLine
Set GetRefCall = GetRef ("CreateDestroyTwoInstances")
Call GetRefCall

MsgBox Log

1 Ответ

1 голос
/ 18 февраля 2020

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

Я нашел неприятный обходной путь, который может помочь до тех пор, пока ошибка не будет устранена.

Обходной путь - не использовать локальную переменную для хранения экземпляров объекта в процедурах, которые могут выполняться через GetRef.

Вместо неявных или явных переменных использование локального (или глобального, если нет рекурсии) объекта словаря для хранения экземпляров объекта и вызова их через этот словарь работает.

Sub CreateDestroyTwoInstances
  Dim Refs
  Set Refs = CreateObject("Scripting.Dictionary")
  Name = "First Instance"
  Refs.Add "DummyInstance", New IDummyInstance
  ' Call Refs("DummyInstance").DoSomething()
  Refs.Remove "DummyInstance"
  Name = "Second Instance"
  Refs.Add "DummyInstance", New IDummyInstance
  ' Call Refs("DummyInstance").DoSomething()
  Refs.Remove "DummyInstance"
End Sub

Кажется, стоит использовать, если у вас есть скрипт, который не слишком сложен.

...