解决方法是不使用任何局部变量将对象实例保存在可能通过GetRef
执行的过程中。
我们在Windows 2016 Server / Windows 10客户端上安装KB4525236后遇到内存不足的问题。通过GetRef
调用函数时,内存被垃圾回收时,此安全修复程序似乎已发生更改。
在通过GetRef
调用的函数中创建的每个实例,在将实例变量设置为nothing
之后就立即收集了垃圾”>
在通过GetRef
调用的函数中创建的每个实例都保留在内存中,并且仅在整个函数完成时才收集垃圾
以下在安装了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
我们在Windows 2016 Server / Windows 10客户端上安装KB4525236后,我们遇到内存不足的问题。当...
解决方法是不使用任何局部变量将对象实例保存在可能通过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
如果您的脚本不太复杂,似乎值得使用。