GetRef的内存消耗(垃圾收集)已通过KB4525236进行了更改

问题描述 投票:11回答:1

我们在Windows 2016 Server / Windows 10客户端上安装KB4525236后遇到内存不足的问题。通过GetRef调用函数时,内存被垃圾回收时,此安全修复程序似乎已发生更改。

PréKB4525236

在通过GetRef调用的函数中创建的每个实例,在将实例变量设置为nothing之后就立即收集了垃圾”>

Post KB4525236

在通过GetRef调用的函数中创建的每个实例都保留在内存中,并且仅在整个函数完成时才收集垃圾

。在循环中创建实例时,这会迅速加起来并导致内存不足,尤其是在32位进程中。]

问题

  • 我们在网上找不到任何相关内容,因此我们希望得到其他遇到相同问题的确认。EDIT从头开始:this是相同的问题,但尚无解决方案((vbscript.dll class_terminate Bug from KB4524570(2019年11月12日,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

我们在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

如果您的脚本不太复杂,似乎值得使用。

memory-management vbscript null garbage-collection reference-type
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.