gpt4 book ai didi

memory-management - GetRef 的内存消耗(垃圾收集)随 KB4525236 改变

转载 作者:行者123 更新时间:2023-12-03 14:27:32 26 4
gpt4 key购买 nike

我们在安装后遇到内存不足问题 KB4525236在我们的 Windows 2016 服务器/Windows 10 客户端上。此安全修复程序似乎改变了通过 GetRef 调用函数时内存被垃圾回收的时刻。 .

预 KB4525236

在通过 GetRef 调用的函数中创建的每个实例将实例变量设置为 nothing 后立即进行垃圾回收

发布 KB4525236

在通过 GetRef 调用的函数中创建的每个实例留在内存中,是 仅在整个函数完成时才收集垃圾 .在循环中创建实例时,这会快速累加并导致内存不足,尤其是在 32 位进程中。

问题

  • 我们在网上找不到任何相关内容,因此我们希望得到遇到相同问题的其他人的确认。
    编辑 从头开始:this是同样的问题,但目前还没有解决方案
    (自 KB4524570(2019 年 11 月 12 日)Windows 10 1903 以来的 vbscript.dll class_terminate 错误)
  • 如果有人可以验证并知道可行的解决方案,那就太棒了。

  • 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

    最佳答案

    由于我没有解决方案或官方消息来源来解释这个问题,我一直在等待赏金到期。

    我想出了一个令人不快的解决方法,可以在修复错误之前提供帮助。

    解决方法是不使用任何局部变量来保存可能通过 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 - GetRef 的内存消耗(垃圾收集)随 KB4525236 改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60089691/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com