У нас возникают проблемы с нехваткой памяти после установки KB4525236 на наших серверах Windows 2016/клиентах Windows 10. Это исправление безопасности, похоже, изменило момент, когда память очищается сборщиком мусора при вызове функции через GetRef
.
Pré KB4525236
Каждый экземпляр, созданный в функции, вызываемой через GetRef
, собирал мусор, как только переменная экземпляра была установлена на nothing
.
Сообщение KB4525236
Каждый экземпляр, созданный в функции, вызываемой через GetRef
, остается в памяти и собирается мусором только после завершения всей функции. При создании экземпляров в цикле это может быстро накапливаться и приводить к нехватке памяти, особенно в 32-разрядном процессе.
Вопросы
- мы не можем найти ничего подходящего в Интернете, поэтому мы хотели бы получить подтверждение от других, столкнувшихся с той же проблемой.
ИЗМЕНИТЬ зачеркните это: это та же проблема, но без решения, как из еще
(ошибка vbscript.dll class_terminate начиная с KB4524570 (12 ноября 2019 г.) Windows 10 1903) - если кто-нибудь может проверить и знает работоспособное решение, это было бы здорово.
ПОС
следующий скрипт, работающий на устройстве с установленным 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
GetRef()
, почему бы просто не установить ссылку на объектGetRefCall
наNothing
, чтобы вручную очистить память, вместо того, чтобы полагаться на сборку мусора VBScript? - person user692942   schedule 06.02.2020GetRef()
, не собирают мусор, пока не закончитсяGetRef()
. Это отличается от того, что было. У нас есть функции, вызываемые черезGetRef()
, создающие 1000 экземпляров, и они продолжают накапливать память до тех пор, пока не закончитсяGetRef()
, тогда как в прошлом они освобождались при выполнении цикла вGetRef()
. - person Lieven Keersmaekers   schedule 06.02.2020With New IDummyInstance : End With
по-прежнему производят инициализацию первого экземпляра, инициализацию второго экземпляра, завершение первого экземпляра, завершение второго экземпляра. Это очень неправильно, об этом следует сообщить. Помимо потребления памяти, это полностью нарушает это. - person GSerg   schedule 08.02.2020CreateDestroyTwoInstances
, которая создает, использует и уничтожаетIDummyInstance
, не возвращая ее вCreateDestroyTwoInstances
. Что я и сделал, и нет, такое же поведение. - person GSerg   schedule 08.02.2020