在Windows 2016 Server / Windows 10客户端上安装KB4525236后,我们会遇到内存不足的问题。通过调用函数时,内存被垃圾回收时,此安全修复程序似乎已发生更改GetRef
。
PréKB4525236
GetRef
在实例变量设置为时,在通过调用的函数中创建的每个实例都会被垃圾回收。nothing
帖子KB4525236
在通过调用的函数中创建的每个实例都GetRef
保留在内存中,并且仅在整个函数完成时才进行垃圾回收。在循环中创建实例时,这可能会迅速累加并导致内存不足,尤其是在32位进程中。
问题
- 我们在网上找不到任何相关内容,因此我们希望获得其他遇到相同问题的人的确认。
编辑从零开始:这是相同的问题,但尚未解决
(自KB4524570(2019年11月12日)Windows 10 1903起vbscript.dll class_terminate bug - 如果有人可以验证并知道可行的解决方案,那就太好了。
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
感谢您的澄清,我不确定您将如何处理该tbh。想象一下,如果有人知道,那将是@ eric-lippert,因为他们在建立VBScript的原始团队中工作。
—
Lankymart
GetRef()
直到GetRef()
结束都不会被垃圾收集。那是什么不同。我们具有通过GetRef()
创建1000个实例来调用的函数,并且它们一直在累积内存,直到GetRef()
结束为止,而在过去,它们在执行中的循环时被释放了GetRef()
。