Si verificano problemi di memoria insufficiente dopo l'installazione di KB4525236 sui nostri server Windows 2016 / client Windows 10. Questa correzione di sicurezza sembra aver cambiato il momento in cui la memoria viene raccolta in modo inutile quando si chiama una funzione GetRef
.
Pré KB4525236
Ogni istanza creata in una funzione chiamata tramite ha GetRef
ottenuto la garbage collection non appena è stata impostata la variabile di istanzanothing
Posta KB4525236
Ogni istanza creata in una funzione chiamata through GetRef
rimane in memoria ed è garbage collection solo al completamento dell'intera funzione . Quando si creano istanze in un ciclo, ciò può sommarsi rapidamente e portare a memoria insufficiente, specialmente in un processo a 32 bit.
Domande
- non riusciamo a trovare nulla di rilevante online, quindi vorremmo ottenere la conferma da altri che riscontrano lo stesso problema.
MODIFICA che: questo è lo stesso problema ma ancora senza soluzione
(bug class_terminate vbscript.dll dal KB4524570 (12 novembre 2019) Windows 10 1903) - se qualcuno può verificare e conoscere una soluzione praticabile, sarebbe fantastico.
POC
lo script seguente in esecuzione su un dispositivo con KB4525236 installato mostra la differenza nella raccolta dei rifiuti quando
- chiamato direttamente: la seconda istanza viene creata solo dopo la distruzione della prima istanza (questo è il comportamento desiderato)
- chiamato attraverso
GetRef
: la seconda istanza viene creata prima che la prima istanza venga distrutta, quindi abbiamo due istanze che usano la memoria.
salva come: KB4525236.vbs
eseguito come: 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
blocchi producono ancora "Inizializza prima istanza, inizializza seconda istanza, termina prima istanza, termina seconda istanza". Questo è molto sbagliato, dovrebbe essere segnalato. A parte la cosa consumo di memoria, si rompe completamente questo .
GetRef()
non ricevono la spazzatura fino allaGetRef()
fine. È diverso da quello che era. Abbiamo funzioni richiamate attraverso laGetRef()
creazione di migliaia di istanze e continuano a accumulare memoria fino allaGetRef()
fine mentre in passato venivano liberate durante l'esecuzione del loopGetRef()
.