हम अपने Windows 2016 सर्वर / Windows 10 ग्राहकों पर KB4525236 स्थापित करने के बाद मेमोरी समस्याओं का अनुभव करते हैं । इस सुरक्षा फ़िक्स ने उस क्षण को बदल दिया है जब किसी फ़ंक्शन को कॉल करने के दौरान मेमोरी एकत्रित होती है GetRef
।
Pré KB4525236
फ़ंक्शन के माध्यम से बनाए गए प्रत्येक इंस्टेंस GetRef
को उदाहरण चर के सेट होते ही कचरा एकत्र हो जाता हैnothing
पोस्ट KB4525236
फंक्शन के माध्यम से बनाए गए प्रत्येक उदाहरण GetRef
को मेमोरी में रहता है और कचरा तभी एकत्र किया जाता है जब पूरा फ़ंक्शन पूरा हो जाता है । एक लूप में उदाहरण बनाते समय, यह जल्दी से जोड़ सकता है और मेमोरी से बाहर हो सकता है, खासकर 32-बिट प्रक्रिया में।
प्रशन
- हम ऑनलाइन कुछ भी प्रासंगिक नहीं पा सकते हैं ताकि हम उसी मुद्दे का अनुभव करने वाले अन्य लोगों से पुष्टि प्राप्त करना चाहें।
EDIT खरोंच कि: यह एक ही मुद्दा है, लेकिन अभी तक कोई समाधान नहीं है
(vbscript.dll class_terminate बग के बाद से KB4524570 (12 नवंबर, 2019) विंडोज 10 1903) - अगर कोई भी काम करने योग्य समाधान को सत्यापित कर सकता है और जान सकता है, तो यह बहुत बढ़िया होगा।
POC
KB4525236 स्थापित के साथ एक उपकरण पर चल रहे स्क्रिप्ट निम्नलिखित कचरा संग्रह में अंतर दिखाता है कि कब
- सीधे कहा जाता है: पहला उदाहरण नष्ट होने के बाद ही दूसरा उदाहरण बनता है (यह हमारा वांछित व्यवहार है)
- के माध्यम से कहा जाता है
GetRef
: पहला उदाहरण नष्ट होने से पहले दूसरा उदाहरण बन जाता है, इसलिए मट्ठा में मेमोरी का उपयोग करने के दो उदाहरण हैं।
इस रूप में सहेजें: KB4525236.vbs इस प्रकार
हैं: 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
ब्लॉक अभी भी "इनिशियलाइज़ फर्स्ट इंस्टेंस, इनिशियलाइज़ सेकंड इंस्टेंस, टर्मिनेट फ़र्स्ट इंस्टेंस, टर्मिनेट सेकंड इंस्टेंस" का उत्पादन करते हैं। यह बहुत गलत है, इसकी सूचना दी जानी चाहिए। इसके अलावा स्मृति खपत बात से, यह पूरी तरह से टूट जाता है यह ।
GetRef()
तब तक कचरा इकट्ठा नहींGetRef()
होता है जब तक कि समाप्त न हो जाए। वह जो था उससे अलग है। हमारे पासGetRef()
1000 इंस्टेंसेस बनाने के माध्यम से कॉल किए गए कार्य हैं और वे मेमोरी को कम करते रहते हैं जब तकGetRef()
कि अतीत में समाप्त नहीं हो जाता है, तब तक वे लूप को निष्पादित करते समय मुक्त हो गए थेGetRef()
।