เราพบปัญหาหน่วยความจำไม่เพียงพอหลังจากติดตั้ง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 Log
With New IDummyInstance : End With
ช่วงตึกยังคงสร้าง "เตรียมใช้งานอินสแตนซ์แรกเริ่มต้นอินสแตนซ์ที่สองสิ้นสุดบัญชีอินสแตนซ์แรกสิ้นสุดอินสแตนซ์ที่สอง" สิ่งนี้ผิดมากควรรายงาน นอกเหนือจากสิ่งที่ใช้หน่วยความจำมันสมบูรณ์แบ่งนี้
GetRef()
ไม่ได้ถูกรวบรวมขยะจนกว่าจะGetRef()
สิ้นสุด มันแตกต่างจากที่เคยเป็น เรามีฟังก์ชั่นที่เรียกว่าผ่านGetRef()
การสร้าง 1000 ของอินสแตนซ์และพวกเขาให้ cumulating หน่วยความจำจนกว่าจะสิ้นสุดลงในขณะที่ในอดีตที่ผ่านมาพวกเขาเป็นอิสระในขณะที่รันวงในGetRef()
GetRef()