গেটআরফের মেমরির খরচ (আবর্জনা সংগ্রহ) KB4525236 এর সাথে পরিবর্তিত হয়েছে


11

আমরা আমাদের উইন্ডোজ 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

1
@ ল্যানকিমার্ট - সমস্যাটি হ'ল যে পরিস্থিতি তৈরি হয়েছে GetRef()তা GetRef()শেষ না হওয়া পর্যন্ত আবর্জনা সংগ্রহ করবেন না । এটি যা ছিল তার থেকে আলাদা। আমাদের GetRef()1000 টি ইনস্ট্যান্স তৈরির মাধ্যমে ডাকা ফাংশন রয়েছে এবং তারা GetRef()অতীতের সময় শেষ না হওয়া অবধি স্মৃতিতে ক্রমবর্ধমান রাখে, লুপ ইন কার্যকর করার সময় সেগুলি মুক্ত হয়েছিল GetRef()
লিভেন কেরসমেকার্স

1
স্পষ্ট করার জন্য ধন্যবাদ, আমি নিশ্চিত না যে আপনি এই টিবিএইচ সম্পর্কে কী করতে সক্ষম হবেন। কল্পনা করুন যে কেউ যদি জানে তবে এটি মূলত @ এরিক-লিপার্ট হবে কারণ তারা ভিবিএস স্ক্রিপ্ট তৈরির মূল দলে কাজ করেছিল।
লঙ্কাইমার্ট

2
আপনি উইন্ডোজ on তে KB4525236 বা KB4524570 ছাড়াই বর্ণনা করেছেন (আপাতদৃষ্টিতে অন্য একটি কেবি রয়েছে যা এটি উইন্ডোজ 7 তে করে) তবুও, ভিবিএস স্ক্রিপ্টে কোনও আবর্জনা সংগ্রহ নেই, তাদের রেফারেন্স গণনা শূন্যে নেমে গেলে বস্তুগুলি অবশ্যই ধ্বংস করতে হবে। যদি এটি না ঘটে তবে এটি জিসি কার্যকারিতার ভিন্ন উপায়ের চেয়ে ইঞ্জিন বাগ।
জিসার্গ

2
এটি এমনকি সুস্পষ্ট ভেরিয়েবল ব্যতীত ক্ষেত্রে। দুটি With New IDummyInstance : End Withব্লক এখনও "ফার্স্ট ইনস্ট্যান্স ইনিশিয়াল, দ্বিতীয় ইনস্ট্যান্স ইনিশিয়েল, প্রথম ইনস্ট্যান্স টার্মিনেট, টার্মিনেট দ্বিতীয় ইনস্ট্যান্স" উত্পাদন করে। এটি খুব ভুল, এটি রিপোর্ট করা উচিত। এছাড়াও মেমরি খরচ জিনিস থেকে, এটি সম্পূর্ণরূপে ভেঙ্গে এই
জিসার্গ

1
@ জিসার্গ - এটির প্রতিবেদন করার জন্য আপনার কি কোনও চ্যানেল রয়েছে? সমস্যাগুলি কোথায় রিপোর্ট করবেন তা নির্ধারণের চেষ্টা করার চেয়ে দ্রুত আর কিছুই আমার কাছে আসে না। এই সমর্থন পাতা উদাহরণস্বরূপ বিশালাকার জন্য এই সমর্থন পৃষ্ঠা যা কার্যকরভাবে কিছুই বাড়ে।
লাইভেন কের্সেমেকার্স

উত্তর:


1

যেহেতু আমার কাছে কোনও সমাধান বা কোনও সরকারী উত্স নেই যা এই সমস্যাটি ব্যাখ্যা করছে আমি অনুগ্রহের মেয়াদ শেষ হওয়ার অপেক্ষায় ছিলাম।

আমি একটি অপ্রীতিকর কাজ নিয়ে এসেছি যা বাগ ঠিক না করা পর্যন্ত সহায়তা করতে পারে।

কর্মক্ষেত্রটি কার্যকর করা যেতে পারে এমন পদ্ধতিতে অবজেক্টের দৃষ্টান্ত ধরে রাখতে কোনও স্থানীয় ভেরিয়েবল ব্যবহার করা নয় GetRef

অন্তর্নিহিত বা সুস্পষ্ট ভেরিয়েবলের পরিবর্তে, স্থানীয় (বা গ্লোবাল না থাকলে) পুনরুত্থানের সাথে অবজেক্টের দৃষ্টান্তগুলি ধরে রাখতে এবং সেই অভিধানটির মাধ্যমে তাদের কল করে।

Sub CreateDestroyTwoInstances
  Dim Refs
  Set Refs = CreateObject("Scripting.Dictionary")
  Name = "First Instance"
  Refs.Add "DummyInstance", New IDummyInstance
  ' Call Refs("DummyInstance").DoSomething()
  Refs.Remove "DummyInstance"
  Name = "Second Instance"
  Refs.Add "DummyInstance", New IDummyInstance
  ' Call Refs("DummyInstance").DoSomething()
  Refs.Remove "DummyInstance"
End Sub

আপনার কাছে এমন কোনও স্ক্রিপ্ট রয়েছে যা খুব জটিল নয় worth


1
এটি কেবল পরীক্ষা করা হয়েছে এবং আমি নিশ্চিত করতে পারি যে এটি আমার মেশিনে কাজ করে। আমি এটি সমাধান হিসাবে চিহ্নিত করতে যাচ্ছি। মাইক্রোসফ্ট একটি সমাধান সরবরাহ না করা পর্যন্ত এটি এখনও সেরা। (ধরে নিলেন তারা এটি একটি বাগ হিসাবে স্বীকৃত)
লিভেন কেরসমেকার্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.