কীভাবে জঞ্জাল সংগ্রহকারীকে চালাতে বাধ্য করবেন?


147

সাক্ষাত্কারকারী আজ আমাকে এই সম্পর্কে জিজ্ঞাসা করলেন ... কোন উত্তর আছে?


3
আপনি কেন এটি করবেন না সে সম্পর্কে এই প্রশ্নের ভাল তথ্য রয়েছে: স্ট্যাকওভারফ্লো
হান্স ওলসন

1
আপনি কেন এমনটি বলছেন
অ্যান্ড্রু কলিন্স

1
@ জেসন - হয়ত সাক্ষাত্কারটি সমাধানটি শুনতে চাননি, বরং এন্ড্রুয়ের জ্ঞান এবং এটি করার বিরুদ্ধে যুক্তি অর্জন করতে চাইলে এই প্রশ্নটি কার্যকরভাবে বোধগম্য হতে পারে।
মার্টিনস্টোকেলি

2
@ মার্টিনস্টোকেলি এটি এখনও একটি ভয়াবহ প্রশ্ন। একটি চাপযুক্ত সাক্ষাত্কারে জ্ঞান থাকা কেউ বুঝতে পারবেন না যে এটি একটি কৌশল প্রশ্ন, বা অতিরিক্ত তথ্য সরবরাহ করার কথা চিন্তা করে। তারপরে প্রশ্নটি সাক্ষাত্কারকারকে জ্ঞানের সাথে বা এটি ছাড়া কারও মধ্যে পার্থক্য করতে সহায়তা করে না। সুতরাং প্রশ্নটি এখনও ভয়াবহ।
জেমস

2
"কখন আপনি জঞ্জাল সংগ্রহের জন্য বাধ্য করেন?" আমার কাছে একটি ভাল সাক্ষাত্কার প্রশ্নের মতো শোনায় ("কীভাবে": এতটা নয়)। শিক্ষানবিস: আমি দুনো। মধ্যবর্তী: কখনই নয়। বিশেষজ্ঞ: আপনি যখন মেমরি ফাঁস জন্য একটি পরীক্ষা লিখুন।
মাইকব্রিজ

উত্তর:


188

System.GC.Collect()জঞ্জাল সংগ্রহকারীকে চালাতে বাধ্য করে forces এটি প্রস্তাবিত নয় তবে পরিস্থিতি দেখা দিলে এটি ব্যবহার করা যেতে পারে।


17
কেন এটি সুপারিশ করা হয় না?
লুক টি ওব্রায়েন

5
জিসি.কলেক্ট () চালানো ব্যয়বহুল। এটি প্রয়োজনের চেয়ে বেশি করা অনাকাঙ্ক্ষিত। কখন ফোন করা উচিত তার কোডটি ভালভাবে লেখা আছে। বিশেষায়িত প্রান্তের ক্ষেত্রে সাধারণত আপনার নিজের সংগ্রহ করা উচিত। stackoverflow.com/a/21961777/2710988
ব্র্যান্ডন বার্কলে

186

এটি স্পষ্টভাবে জিসি কল করার পরামর্শ দেওয়া হয় না, তবে যদি আপনি কল করেন

GC.Collect();
GC.WaitForPendingFinalizers();

এটি আপনার কোড জুড়ে জিসিকে স্পষ্টভাবে কল করবে, GC.WaitForPendingFinalizers();পরে কল করতে ভুলবেন না GC.Collect()


14
WaitForPendingFinalizersঅগত্যা "আরও ভাল পারফরম্যান্স" দেয় না: চূড়ান্তকরণের সারিতে সমস্ত বস্তু চূড়ান্ত না হওয়া পর্যন্ত এটি কেবল অবরুদ্ধ হয় (যে জিনিসগুলিতে আপনার পূর্ববর্তী কল দ্বারা সেখানে রাখা হয়েছিল Collect)। আপনি যদি চান তাদের জন্য একটি সুযোগ তারপর সংগ্রহ করা আপনার যা দরকার বস্তু অন্য থেকে কল Collect পর কলিং WaitForPendingFinalizers
লুক এইচ

2
যেহেতু gc. কলেক্ট কল করার কয়েকটি ভাল কারণগুলির মধ্যে একটি হ'ল যথাযথভাবে নিষ্পত্তি করা হয়নি এমন সম্পদগুলি মুক্ত করার জন্য সর্বশেষ চেষ্টা হিসাবে, ওয়েটফরপেন্ডিংফিনালাইজারগুলি একটি প্রয়োজনীয় পদক্ষেপ বলে মনে হবে। সেক্ষেত্রে খুব বেশি অনুশীলন হ'ল জিসি কল করা এড়াতে হবে। তবে এই জাতীয় ক্ষেত্রে অতিরিক্তভাবে সংগ্রহ করুন। বিটিডাব্লু, আমি অবাক হয়ে বলি যে প্রজন্মের প্রচারের জন্য কোনও প্রযুক্তিগত কারণেই জিসি.ক্ল্যাক্ট 'রয়েছে'? প্রজন্মকে রেখে দেওয়া আরও কার্যকর বলে মনে হয় যদি না অগ্রসর হওয়ার পক্ষে ন্যায়সঙ্গত করার জন্য পর্যাপ্ত জিনিস বরাদ্দ না দেওয়া হয়।
সুপারক্যাট

2
সি # তে (আমার মতো) নতুনদের জন্য নোট : জিসি ফোর্স কল গ্যারান্টি দেয় না, কিছু কংক্রিট অব্যবহৃত বস্তু মেমরি থেকে সরানো হবে। (এক পথ এই কাজ করতে ", বিবৃতি ব্যবহার" (এর ব্যবহার করছে msdn.microsoft.com/ru-ru/library/yh598w02(v=vs.80).aspx ))
user1234567

কেন ফোন করা গুরুত্বপূর্ণ বলে মনে করা হচ্ছে WaitForPendingFinalizers?
খ্রিস্টান

19
GC.Collect() 

এমডিএসএন থেকে ,

অ্যাক্সেসযোগ্য সমস্ত স্মৃতি পুনরায় দাবি করার চেষ্টা করার জন্য এই পদ্ধতিটি ব্যবহার করুন।

সমস্ত বস্তু, তারা স্মৃতিতে দীর্ঘকাল নির্বিশেষে সংগ্রহের জন্য বিবেচিত হয়; তবে পরিচালিত কোডে রেফারেন্সযুক্ত অবজেক্টগুলি সংগ্রহ করা হয় না। সিস্টেমে উপলব্ধ মেমরির সর্বাধিক পরিমাণ দাবি করতে চেষ্টা করতে এই পদ্ধতিটি ব্যবহার করুন।



12

GC.Collect();

তবে মনে রাখবেন যে আবর্জনা সংগ্রাহক আপনার প্রত্যাশাটি সবসময় পরিষ্কার না করে ...


5
এর মানে কি বোঝাতে চাচ্ছো? এটি অপ্রত্যাশিতভাবে কী পরিষ্কার করতে পারে?
ভলডেমর্ট

5
@ ভলডেমর্ট - এটি অপ্রত্যাশিতভাবে কোনও কিছুই পরিষ্কার করবে না। তবে এটি আপনি যা আশা করেন তা পুরোপুরি পরিষ্কার না করে।
জাস্টিন নিসনার 23

6

আপনি জঞ্জাল সংগ্রহকারীকে চালাতে বাধ্য করতে চান না।

তবে, যদি আপনি কখনও করেন (অবশ্যই একটি খাঁটি একাডেমিক অনুশীলন হিসাবে):

GC.Collect()

4
আমি @ কার্তিকের উত্তরটিকে প্রাধান্য দিচ্ছি, এমন পরিস্থিতি থাকতে পারে যেখানে কোনও অ্যাপ্লিকেশন বৈধভাবে জিসি.কলেক্ট () কল করতে পারে। খুব কম হলেও।
হেন্ক হোল্টারম্যান

2
বলুন আপনার কাছে দুর্বল রেফারেন্স রয়েছে এবং কোনও 'লাইভ' রেফারেন্স রয়েছে কিনা তা পরীক্ষা করে দেখতে চেয়েছিলেন। চেক করার আগে জিসি.কলেক্ট () কল করা অর্থহীন হবে। কথা মাত্র.
ধনী এহমার

1
ডাউনভোটেড কারণ উদ্বোধনী বিবৃতিটি সত্যই ভুল; হ্যাঁ, আমি আবর্জনা সংগ্রহকারীকে চালাতে বাধ্য করতে চাই না।
সিন্ডোগ

5

আমার মনে হয়। নেট ফ্রেমওয়ার্কটি এটি স্বয়ংক্রিয়ভাবে করে তবে কেবল ক্ষেত্রে। প্রথমে আপনি কী মুছতে চান তা নির্বাচন করুন এবং তারপরে আবর্জনা সংগ্রহকারীকে কল করুন:

randomClass object1 = new randomClass
...
...
// Give a null value to the code you want to delete
object1 = null;
// Then call the garbage collector to erase what you gave the null value
GC.Collect();

আমি মনে করি এটিই .. আশা করি আমি কাউকে সাহায্য করব।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.