Windows 2016 Sunucularımıza / Windows 10 İstemcilerimize KB4525236'yı yükledikten sonra bellek yetersizliği sorunları yaşıyoruz . Bu güvenlik düzeltmesi, bir işlevi çağırırken belleğin çöp toplandığı anı değiştirmiş gibi görünüyor GetRef.
Pré KB4525236
Üzerinden çağrılan bir işlevde oluşturulan her örnek GetRef, örnek değişkeni olarak ayarlanır ayarlanmaz çöp toplanırnothing
Post KB4525236
Üzerinden çağrılan bir işlevde oluşturulan her örnek GetRefbellekte kalır ve yalnızca tüm işlev tamamlandığında toplanan çöptür . Bir döngüde örnekler oluştururken, bu, özellikle 32 bit işlemde hızlı bir şekilde bellek yetersiz kalmasına neden olabilir.
Sorular
- çevrimiçi olarak alakalı bir şey bulamıyoruz, bu yüzden aynı sorunu yaşayan başkalarından onay almak istiyoruz.
EDIT çizik: Bu aynı sorun ama henüz hiçbir çözüm ile
(KB4524570 (12 Kasım 2019) Windows 10 1903 beri vbscript.dll class_terminate hata) - Herkes çalışabilir bir çözümü doğrulayabilir ve bilirse, bu harika olurdu.
POC
KB4525236 yüklü bir aygıtta çalışan aşağıdaki komut dosyası, çöp toplamadaki farkları
- doğrudan çağrılır: ikinci örnek yalnızca ilk örnek yok edildikten sonra oluşturulur (bu bizim istenen davranışımızdır)
- üzerinden çağrılır
GetRef: ikinci örnek , ilk örnek yok edilmeden önce oluşturulur , böylece bellek kullanan iki örnek olur.
farklı kaydet: KB4525236.vbs şu şekilde çalıştır : 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()sonuna kadar çöp toplanmamasıdırGetRef(). Ne olduğundan farklı.GetRef()1000 örnekleri oluşturarak çağrıldığımız işlevler varGetRef()ve geçmişte iken sonuna kadar bellek biriktirmeye devam ediyorlar, döngüyü yürütürken serbest bırakıldılarGetRef().