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 GetRefottenuto la garbage collection non appena è stata impostata la variabile di istanzanothing
Posta KB4525236
Ogni istanza creata in una funzione chiamata through GetRefrimane 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 Withblocchi 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().