Chúng tôi gặp phải sự cố hết bộ nhớ sau khi cài đặt KB4525236 trên Máy chủ Windows 2016 / Máy khách Windows 10 của chúng tôi. Khắc phục bảo mật này dường như đã thay đổi thời điểm bộ nhớ bị thu gom rác khi gọi hàm thông quaGetRef
.
Pré KB4525236
Mỗi phiên bản được tạo trong một hàm được gọi thông qua GetRef
đã thu thập rác ngay khi biến thể hiện được đặt thànhnothing
Bài KB4525236
Mỗi phiên bản được tạo trong một hàm được gọi thông qua GetRef
vẫn còn trong bộ nhớ và chỉ được thu gom rác khi toàn bộ chức năng hoàn thành . Khi tạo các thể hiện trong một vòng lặp, điều này có thể nhanh chóng bổ sung và dẫn đến tình trạng hết bộ nhớ, đặc biệt là trong quy trình 32 bit.
Câu hỏi
- chúng tôi không thể tìm thấy bất cứ điều gì có liên quan trực tuyến vì vậy chúng tôi muốn nhận được xác nhận từ những người khác gặp vấn đề tương tự.
EDIT cào rằng: đây là vấn đề tương tự nhưng chưa có giải pháp nào
(lỗi vbscript.dll class_terminate kể từ KB4524570 (ngày 12 tháng 11 năm 2019) Windows 10 1903) - nếu bất cứ ai có thể xác minh và biết một giải pháp khả thi, điều đó sẽ thật tuyệt vời.
POC
tập lệnh sau chạy trên thiết bị có cài đặt KB4525236 cho thấy sự khác biệt trong thu gom rác khi
- được gọi trực tiếp: thể hiện thứ hai chỉ được tạo sau khi cá thể thứ nhất bị hủy (đây là hành vi mong muốn của chúng tôi)
- được gọi qua
GetRef
: thể hiện thứ hai được tạo trước khi cá thể thứ nhất bị hủy để chúng có hai thể hiện sử dụng bộ nhớ.
lưu dưới dạng: KB4525236.vbs
chạy dưới dạng: 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
khối vẫn tạo ra "Khởi tạo sơ thẩm, khởi tạo sơ thẩm thứ hai, chấm dứt sơ thẩm, chấm dứt sơ thẩm thứ hai". Điều này là rất sai, nó cần được báo cáo. Ngoài việc tiêu thụ bộ nhớ, nó hoàn toàn phá vỡ điều này .
GetRef()
không được thu gom rác cho đến khiGetRef()
kết thúc. Điều đó khác với những gì nó đã được. Chúng ta có các hàm được gọi thông quaGetRef()
việc tạo ra 1000 trường hợp và chúng tiếp tục tích lũy bộ nhớ cho đến khiGetRef()
kết thúc trong quá khứ, chúng được giải phóng trong khi thực hiện vòng lặpGetRef()
.