เราพบปัญหาหน่วยความจำไม่เพียงพอหลังจากติดตั้งKB4525236ใน Windows 2016 Servers / Windows 10 Clients GetRefแก้ไขการรักษาความปลอดภัยนี้ดูเหมือนว่าจะมีการเปลี่ยนแปลงช่วงเวลาที่หน่วยความจำที่เก็บขยะเมื่อเรียกฟังก์ชั่นผ่าน
ก่อน KB4525236
แต่ละอินสแตนซ์ที่สร้างขึ้นในฟังก์ชั่นที่เรียกใช้ผ่านGetRefได้รวบรวมขยะทันทีที่ตัวแปรอินสแตนซ์ถูกตั้งค่าเป็นnothing
โพสต์ KB4525236
เช่นกันสร้างขึ้นในฟังก์ชั่นที่เรียกว่าผ่านGetRefยังคงอยู่ในหน่วยความจำและเก็บขยะเฉพาะเมื่อเสร็จสมบูรณ์ทั้งฟังก์ชั่น เมื่อสร้างอินสแตนซ์ในการวนซ้ำสิ่งนี้สามารถเพิ่มและนำไปสู่หน่วยความจำไม่เพียงพอโดยเฉพาะอย่างยิ่งในกระบวนการ 32 บิต
คำถาม
- เราไม่พบสิ่งที่เกี่ยวข้องทางออนไลน์ดังนั้นเราจึงต้องการได้รับการยืนยันจากผู้อื่นที่ประสบปัญหาเดียวกัน 
 แก้ไขรอยขีดข่วนที่: นี่เป็นปัญหาเดียวกัน แต่ยังไม่มีวิธีแก้ปัญหา ณ
 (vbscript.dll class_terminate bug ตั้งแต่ 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 LogWith New IDummyInstance : End Withช่วงตึกยังคงสร้าง "เตรียมใช้งานอินสแตนซ์แรกเริ่มต้นอินสแตนซ์ที่สองสิ้นสุดบัญชีอินสแตนซ์แรกสิ้นสุดอินสแตนซ์ที่สอง" สิ่งนี้ผิดมากควรรายงาน นอกเหนือจากสิ่งที่ใช้หน่วยความจำมันสมบูรณ์แบ่งนี้ 
                
GetRef()ไม่ได้ถูกรวบรวมขยะจนกว่าจะGetRef()สิ้นสุด มันแตกต่างจากที่เคยเป็น เรามีฟังก์ชั่นที่เรียกว่าผ่านGetRef()การสร้าง 1000 ของอินสแตนซ์และพวกเขาให้ cumulating หน่วยความจำจนกว่าจะสิ้นสุดลงในขณะที่ในอดีตที่ผ่านมาพวกเขาเป็นอิสระในขณะที่รันวงในGetRef()GetRef()