У нас возникают проблемы с нехваткой памяти после установки 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