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 GetRef
bellekte 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()
.