У нас виникають проблеми із пам'яттю після встановлення KB4525236 на наших серверах Windows 2016 / Клієнтах Windows 10. Це виправлення безпеки, схоже, змінило момент, коли пам'ять збирається сміттям під час виклику функції через GetRef
.
Pré KB4525236
Кожен екземпляр, створений у функції, яка викликається через GetRef
зібране сміття, як тільки було встановлено змінну екземпляраnothing
Повідомлення KB4525236
Кожен екземпляр, створений у функції, викликаної наскрізь, GetRef
залишається в пам'яті і збирається сміття лише тоді, коли вся функція завершена . Створюючи екземпляри в циклі, це може швидко скласти і призвести до втрати пам’яті, особливо в 32-бітному процесі.
Запитання
- ми не можемо знайти нічого релевантного в Інтернеті, тому ми хотіли б отримати підтвердження від інших, які відчувають ту саму проблему.
EDIT подряпини: це та сама проблема, але поки немає рішення
(помилка vbscript.dll class_terminate з KB4524570 (12 листопада 2019 р.) Windows 10 1903) - якщо хтось може перевірити і знає працездатне рішення, це було б приголомшливо.
POC
наступний скрипт, що працює на пристрої із встановленим 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
With New IDummyInstance : End With
блоки все ще виробляють "Ініціалізувати першу інстанцію, ініціалізувати другу інстанцію, припинити першу інстанцію, припинити другу інстанцію". Це дуже неправильно, про це слід повідомити. Крім речі, яка споживає пам'ять, це повністю порушує цю проблему .
GetRef()
, не збирають сміття доGetRef()
кінця. Це інакше, ніж це було. У нас є функції, викликані за допомогоюGetRef()
створення 1000 екземплярів, і вони зберігають накопичувальну пам'ять доGetRef()
кінців, а в минулому вони були звільнені під час виконання циклуGetRef()
.