আমরা আমাদের উইন্ডোজ 2016 সার্ভার / উইন্ডোজ 10 ক্লায়েন্টগুলিতে KB4525236 ইনস্টল করার পরে মেমরির বাইরে থাকা সমস্যার অভিজ্ঞতা অর্জন করি । কোনও ফাংশন কল করার সময় মেমরির আবর্জনা সংগ্রহ করার সময় এই সুরক্ষা ফিক্সটি মুহূর্তটির পরিবর্তিত হয়েছে বলে মনে হয় GetRef
।
প্রি KB4525236
GetRef
দৃষ্টান্তের ভেরিয়েবলটি সেট করা মাত্রই আবর্জনা সংগ্রহের মাধ্যমে ডাকা একটি ফাংশনে তৈরি প্রতিটি দৃষ্টান্তnothing
KB4525236 পোস্ট করুন
এর মাধ্যমে ডাকা একটি ফাংশনে তৈরি প্রতিটি উদাহরণ GetRef
স্মৃতিতে থেকে যায় এবং পুরো ফাংশনটি সম্পূর্ণ হলেই আবর্জনা সংগ্রহ করা হয় । একটি লুপে উদাহরণ তৈরি করার সময় এটি দ্রুত যুক্ত হতে পারে এবং বিশেষত একটি 32-বিট প্রক্রিয়াতে স্মৃতি ছাড়িয়ে যায়।
প্রশ্নাবলি
- আমরা অনলাইনে প্রাসঙ্গিক কিছু খুঁজে পাই না তাই আমরা একই সমস্যাটি অনুভব করা অন্যদের কাছ থেকে নিশ্চয়তা পেতে চাই।
সম্পাদনা স্ক্র্যাচ যে: এই একই সমস্যা কিন্তু এখনো হিসাবে কোন সমাধান সঙ্গে রয়েছেন
(KB4524570 (12 নভেম্বর, 2019 সাল থেকে vbscript.dll class_terminate বাগ) উইন্ডোজ 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()
।