জঞ্জাল সংগ্রহের জন্য জোর করা কখন ভাল ধারণা?


135

সুতরাং আমি সি # আবর্জনা সংগ্রহকারীকে দৌড়াতে বাধ্য করার বিষয়ে একটি প্রশ্ন পড়ছিলাম যেখানে প্রায় প্রতিটি একক উত্তর একই: আপনি এটি করতে পারেন, তবে আপনার করা উচিত নয় - খুব বিরল কিছু ক্ষেত্রে বাদে । দুঃখের বিষয়, সেখানে কেউই এ জাতীয় ঘটনাগুলি কী তা ব্যাখ্যা করে না।

আপনি কি বলতে পারবেন কোন ধরণের দৃশ্যে আসলে জঞ্জাল সংগ্রহের জন্য বাধ্য করা একটি ভাল বা যুক্তিসঙ্গত ধারণা?

আমি সি # সুনির্দিষ্ট কেসগুলির জন্য বলছি না, বরং সমস্ত প্রোগ্রামিং ভাষায় যেগুলি আবর্জনা সংগ্রহকারী রয়েছে। আমি জানি যে আপনি জাভার মতো সমস্ত ভাষায় জিসি জোর করতে পারবেন না, তবে ধরা যাক আপনি পারেন can


17
"তবে বরং, সমস্ত প্রোগ্রামিং ভাষায় যেগুলি আবর্জনা সংগ্রহকারী রয়েছে" আলাদা আলাদা ভাষা (বা, আরও সঠিকভাবে, বিভিন্ন বাস্তবায়ন ) আবর্জনা সংগ্রহের জন্য বিভিন্ন পদ্ধতি ব্যবহার করে, সুতরাং আপনার কোনও এক-আকারের-ফিট-রুল খুঁজে পাওয়ার সম্ভাবনা কম।
কর্নেল থার্টি টু

4
@ ডোভাল যদি আপনি বাস্তব সময়ের সীমাবদ্ধ থাকেন এবং জিসি যদি মিলের গ্যারান্টি না দেয় তবে আপনি একটি শিলা এবং একটি শক্ত জায়গার মধ্যে রয়েছেন। এটি অবাঞ্ছিত বিরতিগুলি হ্রাস করতে পারে বনাম কিছু না করা, তবে যা শুনেছি তা থেকে অপারেশনটির স্বাভাবিক কোর্সে বরাদ্দ এড়ানো সহজ "সহজ"।

3
আমি এই ধারণাটির মধ্যে ছিলাম যে আপনি যদি সত্যিকারের সময়সীমা নির্ধারণের কঠিন সময় আশা করেন, আপনি কখনই প্রথম স্থানে কোনও জিসি ভাষা ব্যবহার করবেন না।
গ্রেগরোস

4
আপনি কীভাবে একটি নন-ভিএম-নির্দিষ্ট উপায়ে উত্তর দিতে পারবেন তা আমি দেখতে পাচ্ছি না। 32-বিট প্রক্রিয়াগুলির জন্য প্রাসঙ্গিক, 64-বিট প্রক্রিয়াগুলির জন্য প্রাসঙ্গিক। । নেট জেভিএম এবং উচ্চ-প্রান্তের একের জন্য
রবিং

3
@ ডেভিডকনরড আপনি এটি সি # তে জোর করতে পারবেন। সুতরাং প্রশ্ন।
ওমেগা

উত্তর:


127

আপনি সমস্ত জিসি বাস্তবায়ন ব্যবহারের উপযুক্ত উপায় সম্পর্কে কম্বল স্টেটমেন্ট দিতে পারবেন না । তারা বন্যভাবে পরিবর্তিত হয়। সুতরাং আমি .NET এর সাথে কথা বলব যা আপনি মূলত উল্লেখ করেছেন।

কোনও যুক্তি বা যুক্তি সহ এটি করার জন্য আপনার অবশ্যই জিসির আচরণ বেশ ঘনিষ্ঠভাবে জানতে হবে।

সংগ্রহের বিষয়ে আমি কেবলমাত্র পরামর্শ দিতে পারি: এটি কখনই করবেন না।

আপনি যদি সত্যিই জিসির জটিল জটিল বিবরণ জানেন তবে আপনার আমার পরামর্শের দরকার পড়বে না তাই এটি বিবেচ্য নয়। যদি আপনি ইতিমধ্যে 100% আত্মবিশ্বাসের সাথে না জানেন তবে এটি সাহায্য করবে, এবং অনলাইনে সন্ধান করতে হবে এবং এর মতো উত্তর খুঁজে পেতে হবে: আপনাকে জিসি.কলেক্ট বা কল হিসাবে কল করা উচিত নয় : জিসি কীভাবে কাজ করে তার বিশদ শিখতে হবে আপনার ভিতরে এবং বাইরে, এবং কেবল তখনই আপনি উত্তরটি জানবেন

এখানে একটি নিরাপদ জায়গা রয়েছে যা এটি জিসি ব্যবহারের জন্য কিছুটা অর্থপূর্ণ করে তোলে sense সংগ্রহ :

জিসি.কালেক্ট একটি এমন এপিআই উপলব্ধ যা আপনি বিভিন্ন সময় প্রোফাইলের জন্য ব্যবহার করতে পারেন। আপনি এক অ্যালগরিদমকে প্রোফাইল তৈরি করতে, সংগ্রহ করতে এবং তত্ক্ষণাত্‍র পরে অন্য অ্যালগরিদমকে প্রোফাইল তৈরি করতে পারেন তারপরে প্রথম অ্যালগোয়ের জিসি আপনার দ্বিতীয়টি ফলাফলের সিকোয়িংয়ের সময় ঘটেছিল না তা জেনে।

এই ধরণের প্রোফাইলিংটি একক সময় হ'ল আমি কখনই কারও কাছে ম্যানুয়ালি সংগ্রহের পরামর্শ দিই।


যেভাবেই হোক উদাহরণস্বরূপ

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

এটি সর্বোত্তম উদাহরণ যা আমি সামনে আসতে পেরেছিলাম, এবং এটি ভাল নয় - আপনি যে এলওএইচ চাপ তৈরি করছেন তা ঘন ঘন সংগ্রহের কারণ হতে পারে, এবং সংগ্রহগুলি যেমন হয় ততই ঘন ঘন হয়ে যায় - সম্ভবত এলওএইচটিকে পরিষ্কার করার সম্ভাবনা রয়েছে chan অস্থায়ী বস্তুগুলির সাথে আপনি যখন এটি ফুটিয়েছিলেন তখনই দ্রুত। আমি নিজে থেকে খুব বেশি সংগ্রহের ফ্রিকোয়েন্সি ধরে নিতে পারি না জিসি থেকে - এটি আমার চেয়ে অনেক বেশি স্মার্ট লোকদের দ্বারা সুরযুক্ত


সুতরাং আসুন। নেট জিসি ... বা .. এর কয়েকটি শব্দার্থক এবং পদ্ধতি সম্পর্কে কথা বলি ..

আমি নেট নেট জিসি সম্পর্কে আমার যা কিছু মনে হয় তা আমি জানি

দয়া করে, এখানে যে কেউ ত্রুটি খুঁজে পান - আমাকে সংশোধন করুন। জিসির বেশিরভাগ অংশই কালো যাদু হিসাবে পরিচিত এবং আমি বিবরণ দেওয়ার চেষ্টা করার সময় আমি অনিশ্চিত ছিলাম, সম্ভবত আমি এখনও কিছু জিনিস ভুল পেয়েছি।

নীচে উদ্দেশ্যমূলকভাবে এমন অসংখ্য বিবরণ অনুপস্থিত যা আমি সম্পর্কে নিশ্চিত নই, সেই সাথে তথ্যগুলির একটি বৃহত্তর অংশ যা আমি কেবল অজানা। আপনার নিজের ঝুঁকিতে এই তথ্য ব্যবহার করুন।


জিসি ধারণা

.NET জিসি অসামঞ্জস্য সময়ে ঘটে থাকে, এ কারণেই এটিকে "অ-নিরস্তুত্ববাদী" বলা হয়, এর অর্থ আপনি নির্দিষ্ট সময়ে ঘটতে এর উপর নির্ভর করতে পারবেন না। এটি একটি প্রজন্মের আবর্জনা সংগ্রহকারীও, যার অর্থ এটি আপনার বস্তুকে ভাগ করে নিচ্ছে যে তারা কতটা জিসি পাস করেছে।

জেনারেল 0 হিপে অবজেক্টগুলি 0 সংগ্রহের মধ্য দিয়ে বেঁচে থাকে, এগুলি নতুনভাবে তৈরি করা হয়েছে তাই সম্প্রতি তাদের ইনস্ট্যান্টেশন হওয়ার পরে কোনও সংগ্রহ ঘটেনি। আপনার জেনারেল 1 হিপের অবজেক্টগুলি একটি সংগ্রহ পাসের মধ্য দিয়ে বেঁচে আছে এবং একইভাবে আপনার জেনার 2 হ্যাপের অবজেক্টগুলি 2 সংগ্রহ পাসের মধ্য দিয়ে বেঁচে থাকে।

এখন সে কারণেই এটি নির্দিষ্ট প্রজন্ম এবং পার্টিশনগুলির যোগ্যতা অর্জন করার কারণটি লক্ষ্য করার মতো। .NET জিসি কেবল এই তিনটি প্রজন্মকেই স্বীকৃতি দেয়, কারণ এই তিনটি স্তূপের ওপরে যে সংগ্রহটি পাস হয় সেগুলি কিছুটা আলাদা। কিছু বস্তু সংগ্রহ থেকে বেঁচে থাকতে পারে হাজার হাজার বার। জিসি এগুলি কেবল জেন 2 হ্যাপ পার্টিশনের অন্যদিকে রেখে দেয়, এগুলি আর কোথাও ভাগ করার কোনও অর্থ নেই কারণ তারা আসলে জেনারেল 44; তাদের উপরের সংগ্রহ পাসটি জেন ​​2 হ্যাপের সমস্ত কিছুর সমান।

এই নির্দিষ্ট প্রজন্মের অর্থগত উদ্দেশ্য রয়েছে, পাশাপাশি বাস্তবায়িত প্রক্রিয়া রয়েছে যা এগুলি সম্মান করে এবং আমি এক মুহুর্তের মধ্যে তাদের কাছে পৌঁছে দেব।


একটি সংগ্রহে কি

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

এখন এটি একগুচ্ছ বস্তু পরিষ্কার করা এবং কিছু একা রেখে দেওয়ার পরে, একটি দুর্ভাগ্যজনক পার্শ্ব প্রতিক্রিয়া দেখা দিতে পারে: মৃত ব্যক্তিদের অপসারণ করা হয়েছে এমন লাইভ অবজেক্টগুলির মধ্যে ফাঁকা জায়গার ব্যবধান। এই মেমরি বিভাজন যদি একা ছেড়ে যায় কেবল মেমোরি নষ্ট করে দেয়, সুতরাং সংগ্রহগুলি সাধারণত "কমপ্যাকশন" বলে তা করবে যেখানে তারা সমস্ত লাইভ অবজেক্টকে বামে নিয়ে যায় এবং এগুলি একসাথে গিলে ফেলবে যাতে জেনারেলের জন্য মুক্ত মেমরিটি স্তূপের একপাশে সামঞ্জস্যপূর্ণ হয় 0।

এখন 3 টি মেমরির ধারণার ধারণা দেওয়া, তারা যে সমস্ত সংগ্রহের মধ্য দিয়ে জীবনযাপন করেছে তার সংখ্যা দ্বারা বিভক্ত, এই পার্টিশনগুলি কেন বিদ্যমান তা নিয়ে আলোচনা করা যাক।


জেনারেল 0 সংগ্রহ

জেনারেল 0 সম্পূর্ণ নতুন অবজেক্টস হওয়ায় খুব ছোট হতে থাকে - যাতে আপনি এটি খুব ঘন ঘন নিরাপদে সংগ্রহ করতে পারেন । ফ্রিকোয়েন্সি নিশ্চিত করে যে গাদাটি ছোট থাকে এবং সংগ্রহগুলি খুব দ্রুত হয় কারণ তারা এ জাতীয় একটি ছোট ছোট গাদা সংগ্রহ করছে। এই বেশী বা একটি অনুসন্ধানমূলক প্রক্রিয়া দাবী করেন যে কম ভিত্তি করে: একটি বড় অংশ অস্থায়ী বস্তু যা আপনি তৈরি, হয় খুব অস্থায়ী, তাই অস্থায়ী তারা আর ব্যবহার করব করা বা ব্যবহারের পরে প্রায় সঙ্গে সঙ্গেই রেফারেন্সড, এবং এইভাবে সংগ্রহ করা যাবে।


জেনার 1 সংগ্রহ

জেনারেল 1 হ'ল বস্তু যা এই খুব অস্থায়ী বিভাগের অবজেক্টগুলির মধ্যে পড়ে না , এটি এখনও স্বল্পস্থায়ী হতে পারে, কারণ স্থির- অবজেক্টগুলির একটি বিশাল অংশ বেশি দিন ব্যবহার করা হয় না। সুতরাং জেনার 1 বরং প্রায়শই প্রায়শই সংগ্রহ করে, আবার এটি খুব কম রাখে যাতে এটির সংগ্রহগুলি দ্রুত হয়। তবে ধারণাটি এর কম বস্তুগুলি জেনারেল 0 এর চেয়ে অস্থায়ী, তাই এটি জেনার 0 এর চেয়ে কম ঘন ঘন সংগ্রহ করে

আমি বলব যে আমি জেনারেল 0 এর সংগ্রহ পাস এবং জেনার 1 এর মধ্যে পার্থক্যযুক্ত প্রযুক্তিগত পদ্ধতিগুলি জানি না, যদি তারা সংগ্রহের ফ্রিকোয়েন্সি ব্যতীত অন্য কোনও কিছু থাকে।


জেনার 2 সংগ্রহ

জেনার 2 এখন অবশ্যই সমস্ত স্তূপের মা হতে হবে? ঠিক আছে, হ্যাঁ, এটি কম-বেশি সঠিক। এটি যেখানে আপনার স্থায়ী অবজেক্টগুলি বাস করে - Main()উদাহরণস্বরূপ বস্তুটি আপনার জীবন যাপন করে এবং যা Main()উল্লেখ করা হয় সেগুলি কারণ Main()আপনার প্রক্রিয়া শেষে আপনার প্রত্যাবর্তন না হওয়া পর্যন্ত সেগুলি মূলযুক্ত হবে ।

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


বড় অবজেক্টের গাদা

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


নিকাশ

চূড়ান্তকরণকারীগুলির সাথে অন্য একটি উদাহরণ। আপনি এমন একটি সামগ্রীতে একটি চূড়ান্তকরণকারী রেখেছেন যা। নেট নেটসিসি (অপরিশোধিত সংস্থানসমূহ) এর পরিধি ছাড়িয়ে সংস্থানগুলিকে উল্লেখ করে। চূড়ান্তকরণকারী হ'ল একমাত্র উপায় নয় যে জিসি একটি অপরিকল্পিত সংস্থান সংগ্রহ করার দাবি জানায় - আপনি আপনার চূড়ান্তকরণটি পরিচালনা প্রক্রিয়াটি পরিচালনা / অপসারণ / অপসারণ পরিচালনা / রিলিজ করার জন্য আপনার প্রক্রিয়া থেকে ফাঁস না হওয়ার বিষয়টি নিশ্চিত করতে বাস্তবায়ন করেন। যখন জিসি আপনার অবজেক্টগুলি চূড়ান্তকরণের জন্য কার্যকর করবে, তখন আপনার বাস্তবায়নটি নিয়ন্ত্রণহীন সংস্থানটি সাফ করে দেবে, জিসি কোনও উত্স ফাঁসের ঝুঁকি ছাড়াই আপনার বিষয়টিকে সরিয়ে ফেলতে সক্ষম করে তুলবে।

চূড়ান্তকরণ ব্যবস্থার মাধ্যমে চূড়ান্তকরণকারীরা যে পদ্ধতিটি এটি করেন তা হ'ল সরাসরি চূড়ান্তকরণের সারিতে রেফারেন্স দেওয়া। যখন রানটাইম কোনও চূড়ান্তকরণকারীর সাথে কোনও বস্তু বরাদ্দ করে, এটি চূড়ান্তকরণের সারিতে সেই বস্তুর একটি পয়েন্টার যুক্ত করে এবং আপনার অবজেক্টটিকে জায়গায় তালাবদ্ধ করে দেয় (পিনিং বলে) সুতরাং কমপ্যাকশন এটি সরিয়ে ফেলবে না যা চূড়ান্তকরণের সারি রেফারেন্সকে ভঙ্গ করবে। সংগ্রহটি পাস হওয়ার সাথে সাথে অবশেষে আপনার অবজেক্টটির আর কোনও সিসি রুট নেই, তবে এটি সংগ্রহের আগে চূড়ান্তকরণ কার্যকর করতে হবে। সুতরাং যখন অবজেক্টটি মারা যায়, সংগ্রহটি এটির রেফারেন্সটি চূড়ান্তকরণের সারি থেকে সরিয়ে নিয়ে যায় এবং "FReachable" সারি হিসাবে পরিচিত সেই বিষয়ে একটি রেফারেন্স রাখবে। তারপরে সংগ্রহ চলতে থাকে। ভবিষ্যতে আর একটি "অ-নিরস্তুত্ববাদী" সময়ে, ফাইনালাইজার থ্রেড হিসাবে পরিচিত একটি পৃথক থ্রেড এফআরেচযোগ্য কাতারে যাবে, প্রতিটি রেফারেন্সের জন্য ফাইনালাইজারকে কার্যকর করবে uting এটি সমাপ্ত হওয়ার পরে, FReachable সারিটি খালি থাকে এবং প্রতিটি বস্তুর শিরোনামে এটি কিছুটা উল্টে যায় যা বলে যে তাদের চূড়ান্তকরণের প্রয়োজন নেই (এই বিটটি নিজে হাতে ফ্লিপ করা যেতে পারে)GC.SuppressFinalizeযা পদ্ধতিতে প্রচলিত Dispose()), আমার সন্দেহ হয় যে এটি অবজেক্টগুলি আনপিন করেছে, তবে সে সম্পর্কে আমাকে উদ্ধৃতি দেবেন না। পরের সংগ্রহটি যা এই বস্তুটিতে রয়েছে তার উপর যে পরিমাণ apੇਰ রয়েছে তার চারপাশে আসে, শেষ পর্যন্ত এটি সংগ্রহ করবে। জেনারেল 0 সংগ্রহগুলি এমনকি চূড়ান্তকরণ-প্রয়োজনীয় বিট সহ অবজেক্টগুলিতেও মনোযোগ দেয় না, এটি স্বয়ংক্রিয়ভাবে তাদের প্রচার করে, এমনকি তাদের মূলটি পরীক্ষা না করে। জেনার 1 এ চূড়ান্তকরণের প্রয়োজন হওয়া একটি অরক্ষিত বস্তু FReachableকাতারে নষ্ট হয়ে যাবে , তবে সংগ্রহটি এটির সাথে আর কিছু করে না, সুতরাং এটি জেনারেল 2 এ চলে this এইভাবে, সমস্ত অবজেক্টের একটি ফাইনালাইজার রয়েছে, এবং না GC.SuppressFinalizeজেনারেল 2 এ সংগ্রহ করা হবে।


4
@ ফ্লোরিয়ানমারগাইন হ্যাঁ ... সমস্ত বাস্তবায়ন জুড়ে "জিসি" সম্পর্কে কিছু বলা সত্যিই বোধগম্য নয় ..
জিমি হোফা

10
tl; dr: পরিবর্তে অবজেক্ট পুল ব্যবহার করুন।
রবার্ট হার্ভে

5
tl; dr: সময় / প্রোফাইলিংয়ের জন্য, এটি দরকারী হতে পারে।
কুত্স্কেম

3
@ উপরের যান্ত্রিকগুলির উপরে আমার বিবরণটি পড়ার পরে (যেমন আমি তাদের বুঝতে পারি), আপনি এটি দেখলে কী লাভ হবে? আপনি প্রচুর পরিমাণে অবজেক্টগুলি পরিষ্কার করেন - এসওএইচ (বা এলওএইচ?) এ? আপনি কি এই সংগ্রহটির জন্য কেবল অন্য থ্রেডগুলি বিরতি দিয়েছিলেন? সেই সংগ্রহটি কি জেনার 2 এর দ্বিগুণ পদার্থের প্রচারের দ্বিগুণ উত্সাহ পেয়েছে? সংগ্রহ কি LOH- তে সংযোগ সৃষ্টি করেছিল (আপনি কি এটি চালু করেছেন?)? আপনার কাছে কতটি জিসি হিপ রয়েছে এবং আপনার জিসি সার্ভার বা ডেস্কটপ মোডে রয়েছে? জিসি হ'ল ফেকিন 'আইস বার্গ, বিশ্বাসঘাতকতা পানির নীচে। শুধু পরিষ্কার চালানো। আমি আরামে সংগ্রহ করার মতো যথেষ্ট স্মার্ট নই।
জিমি হোফা

4
@ রবার্টহারভি অবজেক্ট পুলগুলি কোনও রূপালী বুলেট নয়। আবর্জনা সংগ্রাহকের 0 প্রজন্ম ইতিমধ্যে কার্যকরভাবে একটি অবজেক্ট পুল it's এটি সাধারণত আকারে ছোট আকারের ক্যাশে স্তরের আকারের হয় এবং এইভাবে নতুন বস্তু সাধারণত মেমরিতে তৈরি হয় যা ইতিমধ্যে ক্যাশে রয়েছে। আপনার অবজেক্ট পুলটি এখন ক্যাশের জন্য জিসির নার্সারির বিরুদ্ধে প্রতিযোগিতা করছে এবং যদি জিসির নার্সারি এবং আপনার পুলের যোগফল ক্যাশের চেয়ে বড় হয় তবে আপনি সম্ভবত ক্যাশে মিস করবেন না mis এবং যদি আপনি এখন সমান্তরালতা ব্যবহার করার পরিকল্পনা করে থাকেন তবে আপনাকে পুনরায় বাস্তবায়ন করতে হবে সিঙ্ক্রোনাইজেশন এবং ভুয়া ভাগাভাগি নিয়ে চিন্তা করতে।
ডোভাল

68

দুঃখের বিষয়, সেখানে কেউই এ জাতীয় ঘটনাগুলি কী তা ব্যাখ্যা করে না।

আমি কিছু উদাহরণ দেব। সব মিলিয়ে এটি বিরল যে কোনও জিসিকে বাধ্য করা একটি ভাল ধারণা তবে এটি সম্পূর্ণরূপে মূল্যবান হতে পারে। এই উত্তরটি NET এবং GC সাহিত্যের সাথে আমার অভিজ্ঞতা। এটি অন্যান্য প্ল্যাটফর্মগুলিতে (কমপক্ষে যাদের গুরুত্বপূর্ণ জিসি রয়েছে তাদের) ভাল করতে হবে।

  • বিভিন্ন ধরণের মানদণ্ড । আপনি যখন একটি বেঞ্চমার্ক শুরু করেন তখন আপনি একটি পরিচিত পরিচালিত হিপ অবস্থা চান যাতে জিসি এলোমেলোভাবে বেঞ্চমার্কের সময় ট্রিগার না করে। আপনি যখন কোনও মানদণ্ড পুনরাবৃত্তি করেন আপনি প্রতিটি পুনরাবৃত্তিতে একই নম্বর এবং পরিমাণে জিসি কাজ করতে চান।
  • হঠাৎ রিসোর্স রিলিজ। উদাহরণস্বরূপ একটি গুরুত্বপূর্ণ জিইউআই উইন্ডোটি বন্ধ করা বা একটি ক্যাশে সতেজ করা (এবং এর ফলে পুরানো সম্ভাব্য বড় ক্যাশের সামগ্রী প্রকাশ করা)। জিসি এটি সনাক্ত করতে পারে না কারণ আপনি যা করছেন তা নালার জন্য একটি রেফারেন্স সেট করছে। এই অনাথদের একটি সম্পূর্ণ বস্তুর গ্রাফটি সহজে সনাক্তযোগ্য নয়।
  • ফাঁস হওয়া অপরিকল্পিত সংস্থানসমূহ মুক্তি । অবশ্যই এটি কখনও ঘটবে না, তবে আমি তৃতীয় পক্ষের লাইব্রেরি স্টাফ ফাঁস করে এমন ঘটনা দেখেছি (যেমন COM অবজেক্ট)। বিকাশকারী কখনও কখনও একটি সংগ্রহ প্ররোচিত করতে বাধ্য হয়েছিল।
  • ইন্টারেক্টিভ অ্যাপ্লিকেশন যেমন গেমস । প্লে গেমস চলাকালীন ফ্রেম প্রতি খুব কড়া সময় বাজেট থাকে (60 ফ্রেঞ্চ প্রতি 60Hz => 16 মিমি)। হিকআপগুলি এড়াতে আপনার জিসিগুলি মোকাবেলার কৌশল প্রয়োজন। এর মধ্যে একটি কৌশল হ'ল জি 2 জিসিগুলিকে যথাসম্ভব বিলম্ব করা এবং উপযুক্ত সময়ে লোডিং স্ক্রিন বা কাটা দৃশ্যের মতো জোর করে। এ জাতীয় মুহূর্তটি কখন সেরা তা জিসি জানতে পারে না।
  • সাধারণভাবে লেটেন্সি নিয়ন্ত্রণ । কিছু ওয়েব অ্যাপ্লিকেশনগুলি জিসিগুলিকে অক্ষম করে এবং লোড ব্যালেন্সার ঘূর্ণনের বাইরে চলে যাওয়ার সময়ে পর্যায়ক্রমে একটি জি 2 সংগ্রহ চালায়। এইভাবে জি 2 লেটেন্সি কখনও ব্যবহারকারীর সামনে আসে না।

আপনার লক্ষ্য যদি থ্রুপুট হয় তবে জিসিটি বিরল। এই ক্ষেত্রে সংগ্রহে বাধ্য করার ক্ষেত্রে কোনও ইতিবাচক প্রভাব ফেলতে পারে না (বরং লাইভের মধ্যে ছেদ করা মৃত বস্তুগুলি সরিয়ে সিপিইউ ক্যাশে ব্যবহার বাড়ানোর মতো স্বতন্ত্র বিষয়গুলি বাদে)। আমার পরিচিত সমস্ত সংগ্রহকারীর জন্য ব্যাচ সংগ্রহ আরও দক্ষ। স্থিতিশীল-রাষ্ট্রীয় মেমরির উত্পাদনের জন্য অ্যাপ্লিকেশনটির জন্য জিসি প্রেরণা সাহায্য করে না।

উপরে উল্লিখিত উদাহরণগুলি লক্ষ্য স্থিরতা এবং মেমরির ব্যবহারের সীমানা। এই ক্ষেত্রে প্ররোচিত জিসিগুলি বুঝতে পারে।

একটি বিস্তৃত ধারণা রয়েছে বলে মনে হয় যে জিসি হ'ল একটি entityশ্বরিক সত্তা যখনই এটি সংগ্রহের জন্য প্ররোচিত হয় যখনই এটি করার পক্ষে সর্বোত্তম হয়। আমি জানি না এমন কোন জিসি যে পরিশীলিত এবং প্রকৃত পক্ষে এটি জিসির পক্ষে অনুকূল হওয়া খুব কঠিন। জিসি বিকাশকারীদের চেয়ে কম জানেন। এটি হিউরিস্টিকস মেমোরি কাউন্টার এবং সংগ্রহের হারের মতো জিনিসগুলির উপর ভিত্তি করে তৈরি হয়। হিউরিস্টিক্স সাধারণত ভাল তবে তারা প্রয়োগের আচরণে হঠাৎ পরিবর্তনগুলি ক্যাপচার করে না যেমন বড় পরিমাণে পরিচালিত মেমরির প্রকাশ release এটি পরিচালনাহীন সংস্থান এবং বিলম্বতার প্রয়োজনীয়তার জন্যও অন্ধ।

দ্রষ্টব্য, যে জিসি খরচ হিপ আকার এবং রেফারেন্স সংখ্যার সাথে পৃথক হয়। একটি ছোট গাদা ব্যয় খুব সামান্য হতে পারে। আমি 1 জিপি হিপ আকারের একটি প্রোডাকশন অ্যাপটিতে 1-2 জিবি / সেকেন্ডের নেট 4.5 এর সাথে জি 2 সংগ্রহের হার দেখেছি।


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

3
দ্বিতীয় থেকে শেষ অনুচ্ছেদের জন্য +1। কিছু লোকের সংকলক সম্পর্কে একই ধারণা থাকে এবং প্রায় কোনও কিছুকে "অকাল অপ্টিমাইজেশন" বলতে দ্রুত হয়। আমি সাধারণত তাদের অনুরূপ কিছু বলি।
হনজা ব্রাবেকে

2
সেই অনুচ্ছেদের জন্যও +1। আমি এটি অবাক করে দিয়েছি যে লোকেরা মনে করে যে অন্য কারও লেখা একটি কম্পিউটার প্রোগ্রাম অবশ্যই তাদের প্রোগ্রামের কর্মক্ষমতা বৈশিষ্ট্যগুলি নিজের চেয়ে আরও ভালভাবে বুঝতে হবে।
মেহরদাদ

1
@ হোনজাব্রেবেক উভয় ক্ষেত্রেই সমস্যা একই: আপনি যদি মনে করেন যে আপনি জিসি বা সংকলকটির চেয়ে ভাল জানেন তবে নিজেকে আঘাত করা খুব সহজ। আপনি যদি আসলে আরও জানেন, তবে আপনি কেবল তখনই অপ্টিমাইজ করছেন যখন আপনি জানেন যে এটি অকাল নয়।
সোভিক

27

একটি সাধারণ নীতি হিসাবে, কোনও আবর্জনা সংগ্রহকারী যখন এটি "স্মৃতিচাপ চাপ" এর দিকে চলে যায় তখন সংগ্রহ করবে এবং এটি অন্য সময়ে সংগ্রহ না করা ভাল ধারণা হিসাবে বিবেচিত হবে কারণ আপনি আপনার প্রোগ্রামের সম্পাদনায় পারফরম্যান্স সমস্যা বা এমনকি লক্ষণীয় বিরতি সৃষ্টি করতে পারেন। এবং প্রকৃতপক্ষে, প্রথম পয়েন্টটি দ্বিতীয়টির উপর নির্ভরশীল: প্রজন্মের আবর্জনা সংগ্রহকারীর জন্য, কমপক্ষে, এটি ভাল বস্তুগুলির সাথে আবর্জনার অনুপাত যত বেশি তত বেশি সঞ্চালিত হয়, তাই প্রোগ্রামটি থামিয়ে ব্যয় করা সময়ের পরিমাণ কমিয়ে আনার জন্য , এটি বিলম্ব করতে হবে এবং যতটা সম্ভব আবর্জনা ileালতে দেওয়া উচিত।

আবর্জনা সংগ্রহকারীকে ম্যানুয়ালি আহ্বান করার উপযুক্ত সময়টি হ'ল 1 আপনি প্রচুর আবর্জনা তৈরি করেছেন এবং 2) ব্যবহারকারী কিছুটা সময় নেবে এবং সিস্টেমটিকে প্রতিক্রিয়াবিহীন ছেড়ে দেবে বলে আশা করা হচ্ছে যাহাই হউক না কেন। একটি ক্লাসিক উদাহরণ বড় কিছু লোড করার শেষে (একটি দস্তাবেজ, একটি মডেল, একটি নতুন স্তর ইত্যাদি) is


12

একটি জিনিস যা কেউ উল্লেখ করেনি তা হ'ল, উইন্ডোজ জিসিটি আশ্চর্যজনকভাবে ভাল করার সময়, এক্সবক্সের জিসিটি আবর্জনা (শোধিত উদ্দেশ্য)

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


4

আবর্জনা সংগ্রহ প্রথম এবং সর্বাগ্রে একটি মেমরি পরিচালনার সরঞ্জাম। যেমন, মেমরির চাপ থাকলে আবর্জনা সংগ্রহকারীরা সংগ্রহ করবেন।

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

তবে আবর্জনা সংগ্রহকারীরা সাধারণত স্মৃতি ছাড়া অন্য সংস্থানগুলির ব্যবহারের অনুকূলকরণ করার চেষ্টা করে না। আবর্জনা সংগৃহীত পরিবেশে, সর্বাধিক মূল্যবান অ-মেমরি রিসোর্সের একটি closeপদ্ধতি বা অনুরূপ থাকে তবে এমন কিছু অনুষ্ঠান রয়েছে যেখানে কোনও কারণে এ কারণ হয় না, যেমন একটি বিদ্যমান এপিআইয়ের সাথে সামঞ্জস্যতা।

এই ক্ষেত্রে ম্যানুয়ালি আবর্জনা সংগ্রহের আহ্বান জানাতে পারে যখন আপনি জানেন যে একটি মূল্যবান অ-স্মৃতি সংস্থান ব্যবহৃত হচ্ছে।

RMI

এর একটি কংক্রিটের উদাহরণ জাভার রিমোট মেথড ইনভোকেশন। আরএমআই হ'ল একটি রিমোট পদ্ধতি কল লাইব্রেরি। আপনার সাধারণত একটি সার্ভার থাকে যা ক্লায়েন্টদের ব্যবহারের জন্য বিভিন্ন অবজেক্টকে উপলভ্য করে। যদি কোনও সার্ভার জানে যে কোনও বস্তু কোনও ক্লায়েন্ট দ্বারা ব্যবহৃত হচ্ছে না, তবে সেই বস্তুটি আবর্জনা সংগ্রহের জন্য উপযুক্ত।

তবে, ক্লায়েন্টটি এটি জানায় এবং ক্লায়েন্ট কেবলমাত্র সার্ভারকে জানার একমাত্র উপায় হ'ল ক্লায়েন্ট যখন যা ব্যবহার করছে তা আবর্জনা সংগ্রহ করার পরে তার আর কোনও প্রয়োজন হবে না।

এটি একটি সমস্যা উপস্থাপন করে, যেহেতু ক্লায়েন্টের কাছে প্রচুর ফ্রি মেমরি থাকতে পারে, তাই এটি খুব ঘন ঘন আবর্জনা সংগ্রহ না চালাতে পারে। এদিকে, সার্ভারের মেমরিতে প্রচুর অব্যবহৃত অবজেক্ট থাকতে পারে যা এটি সংগ্রহ করতে পারে না কারণ এটি জানেন না যে ক্লায়েন্ট সেগুলি ব্যবহার করছে না।

সার্ভারে অবজেক্টগুলি অবিলম্বে সংগ্রহ করা হয়েছে তা নিশ্চিত করার জন্য ক্লায়েন্টের কাছে পর্যায়ক্রমে প্রচুর মেমরি মুক্ত থাকা সত্ত্বেও ক্লায়েন্টের দ্বারা আবর্জনা সংগ্রহ চালানো আরএমআইয়ের সমাধান।


"এই ক্ষেত্রে ম্যানুয়ালি আবর্জনা সংগ্রহের আহ্বান জানাতে পারে যখন আপনি জানেন যে একটি মূল্যবান অ-মেমোরি রিসোর্স ব্যবহৃত হচ্ছে" - যদি একটি স্মৃতিবিহীন সংস্থান ব্যবহার করা হয় তবে আপনাকে একটি usingব্লক ব্যবহার করা উচিত বা অন্যথায় কোনও Closeপদ্ধতিতে কল করা উচিত যত তাড়াতাড়ি সম্ভব রিসোর্স বাতিল করা হয়েছে তা নিশ্চিত করুন। অ-মেমোরি রিসোর্সগুলি পরিষ্কার করার জন্য জিসির উপর নির্ভর করা অবিশ্বাস্য এবং এটি সমস্ত ধরণের সমস্যা সৃষ্টি করে (বিশেষত যে ফাইলগুলিতে অ্যাক্সেসের জন্য লক করা দরকার তাই কেবল একবার খোলা যেতে পারে)।
জুলাই

এবং উত্তরে বর্ণিত হিসাবে, যখন কোনও closeপদ্ধতি উপলব্ধ থাকে (বা সংস্থানটি কোনও usingব্লকের সাথে ব্যবহার করা যেতে পারে ), এগুলি সঠিক পদ্ধতির। উত্তরটি বিশেষত বিরল ক্ষেত্রে দেখা যায় যেখানে এই প্রক্রিয়াগুলি উপলভ্য নয়।
জেমস_পিক

আমার ব্যক্তিগত মতামতটি হ'ল যে কোনও ইন্টারফেস যা অ-মেমোরি রিসোর্স পরিচালনা করে তবে একটি নিকটতম পদ্ধতি সরবরাহ করে না তা একটি ইন্টারফেস যা ব্যবহার করা উচিত নয় , কারণ এটি নির্ভরযোগ্যভাবে ব্যবহার করার কোনও উপায় নেই।
জুলাই

@ জুলস আমি সম্মত, কিন্তু কখনও কখনও এটি অনিবার্য। কখনও কখনও বিমূর্ততা ফুটো হয় এবং কোনও ফাঁস বিমূর্ত ব্যবহার না করে অ্যাবস্ট্রাকশন ব্যবহার করার চেয়ে ভাল। কখনও কখনও আপনাকে লিগ্যাসি কোড দিয়ে কাজ করতে হবে যা আপনাকে প্রতিশ্রুতি দেয় যে আপনি জানেন না যে আপনি রাখতে পারবেন না। হ্যাঁ, এটি বিরল, এবং যদি সম্ভব হয় তবে এড়ানো উচিত, এবং এমন একটি কারণ রয়েছে যে জঞ্জাল সংগ্রহের জন্য এই সমস্ত সতর্কতা রয়েছে, তবে এই পরিস্থিতিগুলি সামনে আসে, এবং ওপি এই পরিস্থিতিগুলি কেমন দেখাচ্ছে - যা আমি উত্তর দিয়েছি ।
জেমস_পিক

2

সবচেয়ে ভাল অনুশীলন হ'ল বেশিরভাগ ক্ষেত্রে জঞ্জাল সংগ্রহের জন্য বাধ্য করা না। (আমি যে প্রতিটি সিস্টেমে কাজ করেছি তাতে আবর্জনা সংগ্রহ করতে বাধ্য করা হয়েছিল, সমস্যাগুলির বিষয়বস্তু ছিল যে সমাধান করা গেলে আবর্জনা সংগ্রহের বাধ্যতামূলককরণের প্রয়োজনীয়তা সরিয়ে ফেলতে এবং সিস্টেমটিকে ব্যাপকতর গতিতে এগিয়ে নিয়ে যেতে পারে।)

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

তবে কিছু ব্যাচের প্রক্রিয়াকরণে আপনি আরও বেশি জানেন তবে জিসি। যেমন একটি অ্যাপ্লিকেশন বিবেচনা করুন।

  • কমান্ড লাইনে ফাইলের নামের একটি তালিকা দেওয়া হয়
  • একটি একক ফাইল প্রক্রিয়া করে তারপরে ফলাফলের ফাইলে ফলাফল লিখুন।
  • ফাইলটি প্রক্রিয়া করার সময়, প্রচুর আন্তঃসংযোগযুক্ত বস্তু তৈরি করে যা ফাইলের প্রসেসিং শেষ না হওয়া পর্যন্ত সংগ্রহ করা যায় না (যেমন একটি পার্স ট্রি)
  • এটি প্রক্রিয়া করা ফাইলগুলির মধ্যে ম্যাচের স্থিতি রাখে না

আপনি পারে একটি মামলা করতে পরীক্ষামূলক আপনি প্রক্রিয়া প্রতিটি ফাইল হয়ে যাওয়ার পরের যে আপনি একটি সম্পূর্ণ গার্বেজ কালেকশন বাধ্য করা উচিত (সাবধান পরে) সক্ষম হবেন।

অন্য কেস হ'ল এমন একটি পরিষেবা যা প্রতি কয়েক মিনিট পরে কিছু আইটেম প্রক্রিয়া করতে জেগে থাকে এবং ঘুমন্ত অবস্থায় কোনও রাজ্য রাখে না । তারপরে ঘুমাতে যাওয়ার ঠিক আগে পুরো সংগ্রহটি জোর করা সার্থক হতে পারে।

আমি কেবল যখন সংগ্রহ করতে বাধ্য হব তখনই যখন আমি জানতাম যে সম্প্রতি প্রচুর অবজেক্ট তৈরি করা হয়েছিল এবং খুব কম বস্তু বর্তমানে রেফারেন্স করা হয়েছে।

আমি বরং কোনও জিসি আমার নিজের উপর চাপ না দিয়ে এই ধরণের জিনিস সম্পর্কে ইঙ্গিত দিতে পারলে আমি তার পরিবর্তে একটি আবর্জনা সংগ্রহের এপিআই করব।

" রিকো মারিয়ানির পারফরম্যান্স টিডবিটস " আরও দেখুন


2

এমন বেশ কয়েকটি কেস রয়েছে যেখানে আপনি নিজেরাই জিসি () কল করতে চাইতে পারেন।

  • [ কিছু লোক বলেছেন যে এটি ভাল নয় কারণ এটি পুরানো জেনারেশনের জায়গাগুলিতে বস্তুগুলির প্রচার করতে পারে যা আমি সম্মত তা কোনও ভাল জিনিস নয়। যাইহোক, এটা হয় না সবসময় সত্য যে সবসময়ই বস্তু যা প্রচার করা হতে পারে হবে। এটি অবশ্যই সম্ভব যে এই gc()কল করার পরে খুব কম কিছু অবজেক্টকে পুরানো প্রজন্মের জায়গায় স্থানান্তরিত করতে দেওয়া হবে ] যখন আপনি কোনও বড় আকারের অবজেক্ট তৈরি করতে এবং প্রচুর স্মৃতি ব্যবহার করতে চলেছেন। আপনি কেবল যতটা সম্ভব প্রস্তুতি হিসাবে পরিষ্কার করতে চান want এটি কেবল সাধারণ জ্ঞান। gc()ম্যানুয়ালি কল করে, আপনি মেমোরিতে লোড করছেন এমন বড় আকারের অবজেক্টের অংশে রিডান্ট্যান্ট রেফারেন্স গ্রাফ চেক হবে না। সংক্ষেপে, আপনি যদি gc()মেমরিতে প্রচুর পরিমাণ লোড করার আগে দৌড়েন তবে thegc() লোড চলাকালীন প্ররোচিত কমপক্ষে এক সময় দ্বারা কম ঘটে যখন লোড করা শুরু মেমরি চাপ তৈরি করে।
  • আপনি যখন একটি বড় সংগ্রহ লোড করেছেনবৃহৎঅবজেক্টস এবং আপনি সম্ভবত মেমোরিতে আরও অবজেক্ট লোড করবেন। সংক্ষেপে, আপনি পর্ব তৈরি থেকে পর্যায়টি ব্যবহারে সরান। gc()প্রয়োগের উপর নির্ভর করে কল করে, ব্যবহৃত মেমরিটি সংক্ষিপ্ত হবে যা ক্যাশে স্থানীয়ভাবে ব্যাপক উন্নতি করে। এর ফলে কর্মক্ষমতাতে ব্যাপক উন্নতি হবে যা আপনি প্রোফাইলিং থেকে পাবেন না
  • প্রথমটির মতো, তবে এই মত থেকে যে আপনি যদি করেন gc()এবং মেমরি পরিচালনা বাস্তবায়ন সমর্থন করে তবে আপনি আপনার শারীরিক স্মৃতিশক্তির জন্য আরও ভাল ধারাবাহিকতা তৈরি করবেন। এটি আবার নতুন বড় সংগ্রহগুলিকে আরও ধারাবাহিক এবং কমপ্যাক্ট করে তোলে যার ফলে কর্মক্ষমতা উন্নত হয়

1
ডাউনওয়েটের কারণটি কি কেউ চিহ্নিত করতে পারেন? আমি নিজেই উত্তরটি বিচার করার পক্ষে যথেষ্ট জানি না (প্রথম নজরে এটি আমার পক্ষে বোঝায়)
ওমেগা

1
আমি অনুমান করছি আপনি তৃতীয় পয়েন্টের জন্য একটি ডাউনভোট পেয়েছেন। "এটি কেবল সাধারণ জ্ঞান" বলার জন্যও সম্ভবত
ইমিবিস

2
আপনি যখন কোনও বৃহৎ সংগ্রহ অবজেক্ট তৈরি করেন তখন জিসি যথেষ্ট স্মার্ট হওয়া উচিত অন্য কোনও সংগ্রহের প্রয়োজন। স্মৃতি যখন কমপ্যাক্ট করা দরকার তখন একই। সম্পর্কিত জিনিসের মেমরি লোকালটি অনুকূলকরণের জন্য জিসির উপর নির্ভর করা সত্যিকারের বলে মনে হয় না। আমি মনে করি আপনি অন্যান্য সমাধান (কাঠামো, অনিরাপদ, ...) সন্ধান করতে পারেন। (আমি ডাউনভোটার নই)
Guillaume,

3
ঠিক সময় সম্পর্কে আপনার প্রথম ধারণাটি আমার মতে খারাপ পরামর্শ। সম্ভাবনা বেশি যে সম্প্রতি একটি সংগ্রহ হয়েছে তাই আপনার পুনরায় সংগ্রহ করার চেষ্টাটি পরের প্রজন্মগুলিতে নির্বিচারে পদক্ষেপগুলি প্রচার করতে চলেছে, যা প্রায়শই খারাপ। পরবর্তী প্রজন্মের কাছে সংগ্রহগুলি শুরু হয় যা শুরু হতে আরও বেশি সময় নেয়, তাদের স্তূপের আকারগুলি "যথাসম্ভব জায়গা পরিষ্কার করতে" কেবল এটিকে আরও সমস্যাযুক্ত করে তোলে। এছাড়াও আপনি যদি লোডের সাথে মেমরির চাপ বাড়িয়ে তুলতে চলেছেন তবে আপনি যেভাবেই সংগ্রহকে প্ররোচিত করতে পারেন, যা আরও ধীরে ধীরে চলবে কারণ জেন 1/2 বৃদ্ধি পেয়েছে
জিমি হোফা

2
By calling gc() depending on implementation, the memory in used will be compacted which massively improves cache locality. This will result in massive improve in performance that you will not get from profiling.আপনি যদি এক সারিতে বৈষম্যগুলিতে একটি টন অবজেক্ট বরাদ্দ করেন তবে সেগুলি ইতিমধ্যে কমপ্যাক্ট হয়েছে। যদি কিছু হয় তবে আবর্জনা সংগ্রহ এগুলি কিছুটা বদলে যেতে পারে। যে কোনও উপায়ে, ঘন এবং ডেটা স্ট্রাকচারগুলি মেমোরিতে এলোমেলোভাবে লাফিয়ে না ব্যবহার করে একটি বড় প্রভাব ফেলতে চলেছে। যদি আপনি কোনও নিষ্পাপ এক-উপাদান-প্রতি-নোড লিঙ্কযুক্ত তালিকাটি ব্যবহার করেন, তবে ম্যানুয়াল জিসি ট্রিকারিগুলির কোনও পরিমাণ এটি তৈরি করবে না।
ডোভাল

2

একটি বাস্তব বিশ্বের উদাহরণ:

আমার কাছে একটি ওয়েব অ্যাপ্লিকেশন ছিল যা খুব বড় ডেটা ব্যবহার করে যা খুব কমই পরিবর্তিত হয়েছিল এবং যা খুব দ্রুত অ্যাক্সেস করা দরকার (এজেএক্সের মাধ্যমে প্রতি-কীস্ট্রোক প্রতিক্রিয়াটির জন্য যথেষ্ট দ্রুত)।

এখানে করার সুস্পষ্ট যথেষ্ট কাজটি হ'ল প্রাসঙ্গিক গ্রাফটিকে মেমরিতে লোড করা এবং ডিবিএস পরিবর্তিত হলে গ্রাফটি আপডেট করে ডাটাবেসের পরিবর্তে সেখান থেকে অ্যাক্সেস করা।

তবে খুব বড় হওয়ার কারণে, ভবিষ্যতে বাড়ার কারণে একটি নির্লজ্জ লোড ডেটা সহ কমপক্ষে 6 গিগাবাইট মেমরি গ্রহণ করতে পারে। (আমার কাছে সঠিক পরিসংখ্যান নেই, একবার স্পষ্ট হয়ে গেল যে আমার 2 জিবি মেশিনটি কমপক্ষে 6 গিগাবাইটের সাথে লড়াই করার চেষ্টা করছে আমার কাজ করার জন্য যে পরিমাণ পরিমাপ করা দরকার তা আমার জানা ছিল)।

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

সমস্ত ভাল এবং ভাল, কিন্তু এর জন্য এখনও এই রাজ্যে পৌঁছাতে প্রায় অর্ধ মিনিটের ব্যবধানে 6 গিগাবাইটেরও বেশি অবজেক্টের মাধ্যমে মন্থন করা হচ্ছে। নিজস্ব বামে, জিসি সামলাতে পারেনি; অ্যাপ্লিকেশনটির স্বাভাবিক প্যাটার্নের উপর ক্রিয়াকলাপের স্পাইকটি (প্রতি সেকেন্ডে ডেলোকেশনে খুব কম ভারী) খুব তীক্ষ্ণ ছিল।

সুতরাং GC.Collect()এই বিল্ড প্রক্রিয়া চলাকালীন সময়ে সময়ে কল করার অর্থ পুরো জিনিসটি সুষ্ঠুভাবে কাজ করেছিল। অবশ্যই, আমি GC.Collect()অ্যাপ্লিকেশনটি চালানোর বাকি সময়টি ম্যানুয়ালি কল করিনি ।

এই রিয়েল-ওয়ার্ল্ড কেসটি কখন আমাদের ব্যবহার করা উচিত তার গাইডলাইনগুলির একটি ভাল উদাহরণ GC.Collect():

  1. সংগ্রহের জন্য প্রচুর পরিমাণে অবজেক্টের তুলনামূলকভাবে বিরল কেস ব্যবহার করা হয়েছে (মেগাবাইটের মূল্য উপলব্ধ করা হচ্ছে, এবং এই গ্রাফ-বিল্ডিংটি অ্যাপ্লিকেশনটির সময়কালে (প্রতি সপ্তাহে প্রায় এক মিনিট) খুব বিরল ঘটনা ছিল।
  2. যখন কার্য সম্পাদনের ক্ষতি তুলনামূলকভাবে সহনীয় হয় তখন এটি করুন; এটি কেবল অ্যাপ্লিকেশন স্টার্ট আপে ঘটেছিল। (এই নিয়মের আর একটি ভাল উদাহরণ গেমের সময় স্তরগুলির মধ্যে বা এমন খেলায় অন্যান্য পয়েন্টগুলির মধ্যে যেখানে খেলোয়াড়রা কিছুটা বিরতি দিয়ে বিরক্ত হবে না)।
  3. সত্যিকারের উন্নতি আছে তা নিশ্চিত হওয়ার জন্য প্রোফাইল। (খুব সহজ; "এটি কাজ করে" প্রায়শই মারধর করে "এটি কাজ করে না")।

বেশিরভাগ সময় যখন আমি ভেবেছিলাম যে আমার GC.Collect()কল করার উপযুক্ত ঘটনা ঘটতে পারে , কারণ পয়েন্ট 1 এবং 2 প্রয়োগ করা হয়েছে, পয়েন্ট 3 সুপারিশ করেছিল যে এটি জিনিসগুলিকে আরও খারাপ করেছে বা কমপক্ষে জিনিসকে আরও ভাল করে তুলবে না (এবং সামান্য বা কোনও উন্নতির সাথে আমি চাই না) কোনও আবেদনের আজীবন আরও ভাল প্রমাণ হওয়ার সম্ভাবনা যত বেশি সম্ভব বলে কলিং না করার দিকে ঝুঁকুন।


0

আমার আবর্জনা নিষ্পত্তি করার জন্য একটি ব্যবহার আছে যা কিছুটা রীতিবিরুদ্ধ নয়।

এই বিভ্রান্তিকর অনুশীলন রয়েছে যা দুর্ভাগ্যক্রমে সি # বিশ্বে প্রচলিত রয়েছে, কুৎসিত, আড়ম্বরপূর্ণ, অকার্যকর এবং ত্রুটিযুক্ত প্রবণ আইডিয়ামটি আইডিস্পোজেবল-নিষ্পত্তি হিসাবে পরিচিত ব্যবহার করে অবজেক্ট ডিসপ্লেটি প্রয়োগ করে । দুটিই MSDN দৈর্ঘ্য তা বর্ণনা , এবং মানুষ প্রচুর এটা কসম, এটা ধর্মীয়ভাবে অনুসরণ ঘণ্টা উপর ঘন্টা ব্যয় আলোচনা অবিকল কিভাবে এটি সম্পন্ন করতে হবে, ইত্যাদি

(দয়া করে নোট করুন যে আমি এখানে যা কুৎসিত বলছি তা অবলম্বন নিষ্পত্তি করার ধরণ নয়; আমি যা কুৎসিত বলছি তা হ'ল বিশেষ IDisposable.Dispose( bool disposing )প্রতিমা))

এই মূর্তিটি উদ্ভাবন করা হয়েছিল কারণ গ্যারান্টি দেওয়া অসম্ভব যে আপনার জিনিসগুলির ধ্বংসকারীকে সর্বদা আবর্জনা সংগ্রহকারী দ্বারা সম্পদ পরিষ্কার করার জন্য আহ্বান করা হবে, সুতরাং লোকেরা ভিতরে রিসোর্স ক্লিনআপ সম্পাদন করে IDisposable.Dispose()এবং যদি তারা ভুলে যায় তবে তারা এ থেকে আরও একবার চেষ্টা করে ধ্বংসকারী মধ্যে। তুমি সঠিক কারণটি জান।

তবে আপনার IDisposable.Dispose()পরিষ্কার করার জন্য উভয় পরিচালিত এবং নিয়ন্ত্রণহীন অবজেক্ট থাকতে পারে, তবে IDisposable.Dispose()ডেস্ট্রাক্টরের ভিতরে থেকে ডেকে আনা হলে পরিচালিতগুলি পরিষ্কার করা যায় না , কারণ ইতিমধ্যে সেই সময়ে আবর্জনা সংগ্রহকারী দ্বারা তাদের যত্ন নেওয়া হয়েছে, তাই সেখানে পরিচালিত এবং অপরিশোধিত ব্যবস্থা উভয়ই পরিষ্কার করা উচিত, বা কেবল পরিচালনা না করা উভয়ই পরিষ্কার করা উচিত কিনা তা জানার জন্য একটি পৃথক Dispose()পদ্ধতির প্রয়োজন কি এটি একটি bool disposingপতাকা গ্রহণ করে ?

ক্ষমা করবেন, তবে এটি কেবল উন্মাদ।

আমি আইনস্টাইনের অ্যাকিয়োম দিয়ে যাচ্ছি যা বলে যে জিনিসগুলি যতটা সম্ভব সহজ হওয়া উচিত, তবে সহজ নয়। স্পষ্টতই, আমরা সংস্থানগুলি পরিষ্কার করতে বাদ দিতে পারি না, তাই সহজতম সমাধানটিতে কমপক্ষে এটি অন্তর্ভুক্ত করতে হবে। পরবর্তী সহজ সমাধানটিতে সর্বদা সর্বদা নিখুঁত সময়ে সবকিছু নিষ্পত্তি করা জড়িত থাকে, বিকল্প হিসাবে ফিরে আসা হিসাবে ধ্বংসকারীটির উপর নির্ভর করে বিষয়গুলিকে জটিল করে না ফেলে osed

এখন, কঠোরভাবে বলতে গেলে, নিশ্চয়তা দেওয়া নিশ্চয়ই অসম্ভব যে কোনও প্রোগ্রামার কখনই অনুরোধ করতে ভুলে ভুল করবেন না IDisposable.Dispose(), তবে আমরা যা করতে পারি তা এই ভুলটি ধরায় ধ্বংসকারীকে ব্যবহার করা। এটি খুব সহজ, সত্যিই: সমস্ত ডিস্ট্রাক্টরকে লগ এন্ট্রি তৈরি করতে হয় যদি এটি সনাক্ত করে যে disposedডিসপোজেবল অবজেক্টের পতাকাটি কখনই সেট করা হয়নি true। সুতরাং, ডেস্ট্রাক্টর ব্যবহারটি আমাদের নিষ্পত্তি করার কৌশলটির অবিচ্ছেদ্য অঙ্গ নয়, তবে এটি আমাদের মানের নিশ্চয়তা প্রক্রিয়া। এবং যেহেতু এটি কেবল একটি ডিবাগ-মোড পরীক্ষা #if DEBUG, তাই আমরা আমাদের সম্পূর্ণ ডেস্ট্রাক্টরকে একটি ব্লকের ভিতরে রাখতে পারি, তাই আমরা কখনই উত্পাদন পরিবেশে কোনও ধ্বংসের শাস্তি গ্রহণ করি না। ( IDisposable.Dispose( bool disposing )মূর্খতা নির্দেশ করে যেGC.SuppressFinalize() চূড়ান্তকরণের ওভারহেডকে হ্রাস করার জন্য অবশ্যই অবিকল অনুরোধ করা উচিত, তবে আমার পদ্ধতির সাহায্যে উত্পাদন পরিবেশের উপরে ওভারহেড সম্পূর্ণরূপে এড়ানো সম্ভব))

এটিকে কী উত্সাহিত করে তা চিরন্তন হার্ড ত্রুটি বনাম নরম ত্রুটি যুক্তি: IDisposable.Dispose( bool disposing )আইডিয়মটি একটি নরম ত্রুটি পদ্ধতির, এবং এটি Dispose()যদি সম্ভব হয় তবে সিস্টেমকে ব্যর্থ না করে প্রোগ্রামারকে ভুলে যাওয়ার অনুমতি দেওয়ার প্রয়াসের প্রতিনিধিত্ব করে । হার্ড ত্রুটি পদ্ধতির বলছেন যে প্রোগ্রামার সর্বদা নিশ্চিত যে করতে হবে Dispose()প্রার্থনা করা হবে না। বেশিরভাগ ক্ষেত্রে হার্ড ত্রুটি পদ্ধতির দ্বারা সাধারণত নির্ধারিত জরিমানাটি হ'ল ব্যর্থতা, তবে এই বিশেষ ক্ষেত্রে আমরা একটি ব্যতিক্রম করি এবং ত্রুটি লগ এন্ট্রির সহজ ইস্যুতে জরিমানাটি কমিয়ে দেয়।

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


Now, strictly speaking, it is of course impossible to guarantee that no programmer will ever make the mistake of forgetting to invoke IDisposable.Dispose()আসলে, এটি নয়, যদিও আমি মনে করি না যে সি # এটি সক্ষম। সংস্থানটি উন্মোচিত করবেন না; পরিবর্তে আপনি এটি দিয়ে যাবেন তার সমস্ত কিছু বর্ণনা করার জন্য একটি ডিএসএল সরবরাহ করুন (মূলত, একটি মোনাদ), এবং এমন একটি ফাংশন যা সম্পদ অর্জন করে, জিনিসগুলি করে, মুক্ত করে এবং ফলাফলটি ফেরত দেয়। কৌশলটি হ'ল ধরণের সিস্টেমটি গ্যারান্টি হিসাবে ব্যবহার করা হয় যদি কেউ যদি উত্সটির কোনও রেফারেন্স পাচার করে তবে এটি রান ফাংশনে অন্য কলটিতে ব্যবহার করা যাবে না।
ডোভাল

2
সমস্যাটি Dispose(bool disposing)(যা সংজ্ঞায়িত করা হয়নি IDisposableতা হ'ল এটি হ'ল ক্ষেত্র হিসাবে (বা অন্যথায় দায়বদ্ধ) হিসাবে পরিচালিত এবং নিয়ন্ত্রণহীন উভয় অবজেক্ট উভয়ই পরিষ্কার করার জন্য ব্যবহৃত হয়, যা ভুল সমস্যার সমাধান করছে। অন্য কোনও Dispose()ডিসপোজযোগ্য অবজেক্টস নিয়ে চিন্তিত না হয়ে পরিচালিত অবজেক্টে পরিচালনাহীন অবজেক্টগুলি সেই পদ্ধতিগুলির মধ্যে একটি হয়ে উঠবে (চূড়ান্তকরণকারী যদি প্রয়োজন হয় তবে একই ধরণের ক্লিন-আপ করতে হবে) বা কেবল নিষ্পত্তি করার জন্য পরিচালিত বস্তুগুলি রয়েছে (চূড়ান্তকরণকারী নেই) একেবারে), এবং প্রয়োজনীয়তা bool disposingঅদৃশ্য হয়ে যায়
জন হান্না

চূড়ান্তকরণ আসলে কীভাবে কাজ করে তার কারণে -1 খারাপ পরামর্শ। dispose(disposing)মূর্খতাটি ভয়াবহ হওয়ার বিষয়ে আমি আপনার বক্তব্যের সাথে একমত আছি, তবে আমি এগুলি বলি কারণ লোকেরা প্রায়শই সেই কৌশল এবং চূড়ান্ত ব্যবহার করে যখন তারা কেবলমাত্র সংস্থানগুলি পরিচালনা করে থাকে ( DbConnectionউদাহরণস্বরূপ পরিচালিত হয় , এটি পিনভোকড বা কম মার্শাল্ল্ড নয়), এবং আপনি কেবলমাত্র এই বিষয়টি ব্যবহার করা উচিত O অনির্বাচিত, পিনভোকড, কম মার্শাল্ড, বা অনিরাপদ কোড সহ সর্বশেষ কার্যকর একটি ফাইনালিজার । আমি আমার উত্তর কিভাবে শোচনীয়ভাবে ব্যয়বহুল finalizers হয় উপরের বিস্তারিত, না তাদের ব্যবহার যদি না আপনি অপরিচালিত আপনার ক্লাসে সম্পদ।
জিমি হোফা

2
আমি আপনাকে প্রায় +1 দিতে চাই যদিও আপনি এমন কিছুকে ডিক্রি করছেন dispose(dispoing)যে কারণে অনেকে প্রচলিত আইডিয়ায় একটি গুরুত্বপূর্ণ বিষয় হিসাবে গ্রহণ করেন তবে সত্যটি কেবল এতটাই প্রচলিত যে মানুষ জিসি স্টাফকে এত ভয় পায় যে কিছু সম্পর্কহীন নয় are এটি ( disposeজিসির সাথে জিলচ হওয়া উচিত) কেবল তদন্ত ছাড়াই নির্ধারিত ওষুধ সেবন করার যোগ্যতা রয়েছে। এটি পরিদর্শন করার জন্য আপনার পক্ষে ভাল, তবে আপনি সবচেয়ে বড়টি মিস করেছেন (এটি চূড়ান্তকরণকারীদের যত বেশি বেশি বেশি সময় আগে তাদের চেয়ে বেশি উত্সাহ দেয়)
জিমি হোফা

1
@ জিমিহোফা আপনার ইনপুটটির জন্য আপনাকে ধন্যবাদ আমি সম্মত হই যে একটি চূড়ান্তরক্ষক সাধারণত নিয়ন্ত্রিত সংস্থান প্রকাশের জন্য ব্যবহার করা উচিত তবে আপনি কি সম্মত হবেন না যে ডিইবিইউজি নির্মাণের ক্ষেত্রে এই নিয়মটি প্রয়োগযোগ্য নয়, এবং ডিইবিইউজি বিল্ডে আমরা বাগগুলি ধরার জন্য চূড়ান্তর ব্যবহার করা উচিত? আমি এখানে যা পরামর্শ দিচ্ছি তা হ'ল তাই আপনি কেন এটি নিয়ে ইস্যু নিয়েছেন তা আমি দেখতে পাচ্ছি না। বিশ্বের জাভা দিকের এই পদ্ধতির দীর্ঘতর ব্যাখ্যা করার জন্য প্রোগ্রামারস.স্ট্যাকেক্সচেঞ্জ / প্রশ্নগুলি / ২৮8787১৫/২ দেখুন ।
মাইক নাকিস

0

আপনি কি বলতে পারবেন কোন ধরণের দৃশ্যে আসলে জঞ্জাল সংগ্রহের জন্য বাধ্য করা একটি ভাল বা যুক্তিসঙ্গত ধারণা? আমি সি # সুনির্দিষ্ট কেসগুলির জন্য বলছি না, বরং সমস্ত প্রোগ্রামিং ভাষায় যেগুলি আবর্জনা সংগ্রহকারী রয়েছে। আমি জানি যে আপনি জাভার মতো সমস্ত ভাষায় জিসি জোর করতে পারবেন না, তবে ধরা যাক আপনি পারেন can

কেবলমাত্র তাত্ত্বিকভাবে কথা বলা এবং কিছু সংগ্রহের মতো বিষয়গুলি উপেক্ষা করা যেমন তাদের সংগ্রহের চক্র চলাকালীন জিনিসগুলি ধীরে ধীরে কমিয়ে দেয়, আমি আবর্জনা সংগ্রহের জন্য বাধ্য করা সবচেয়ে বড় পরিস্থিতিটি একটি মিশন-সমালোচনামূলক সফটওয়্যার যেখানে লজিক্যাল ফাঁসগুলি পয়েন্টার ক্র্যাশগুলিতে ঝুঁকির চেয়ে বেশি পছন্দসই, যেমন, ক্রাশ কারণ অপ্রত্যাশিত সময়ে মানুষের জীবন বা এই জাতীয় কিছুতে ব্যয় হতে পারে।

আপনি যদি ফ্ল্যাশ গেমসের মতো জিসি ভাষা ব্যবহার করে রচিত শেডডিয়ার ইন্ডি গেমগুলির কয়েকটি দেখে থাকেন তবে সেগুলি পাগলের মতো ফাঁস হয় তবে সেগুলি ক্রাশ হয় না। তারা গেমটি খেলতে 20 মিনিটের জন্য মেমরির দশগুণ সময় নিতে পারে কারণ গেমের কোডবেসের কিছু অংশ শূন্যতার জন্য একটি রেফারেন্স সেট করতে বা এটি একটি তালিকা থেকে সরিয়ে দিতে ভুলে গিয়েছিল এবং ফ্রেমের হারগুলি ভুগতে শুরু করতে পারে তবে গেমটি এখনও কার্যকর হয়। সংশ্লেষ সি বা সি ++ কোডিং ব্যবহার করে লিখিত অনুরূপ একটি গেম একই ধরণের রিসোর্স ম্যানেজমেন্ট ভুলের ফলে ড্যাংলিং পয়েন্টারগুলি অ্যাক্সেস করার ফলে ক্র্যাশ হতে পারে, তবে এটি এতটা ফাঁস হবে না।

গেমসের জন্য ক্রাশটি দ্রুত উপলব্ধি করা এবং সংশোধন করা যেতে পারে এমন উপায়ে পছন্দনীয় হতে পারে তবে একটি মিশন-সমালোচনামূলক প্রোগ্রামের জন্য, সম্পূর্ণ অপ্রত্যাশিত সময়ে ক্র্যাশ হওয়া কারওর মৃত্যু হতে পারে। সুতরাং আমার মনে হয় যে প্রধান ঘটনাগুলি পরিস্থিতিগুলি হবে যেখানে ক্র্যাশ না ঘটে বা অন্য কিছু ফর্মগুলি সুরক্ষা একেবারে সমালোচনাযোগ্য এবং তুলনামূলকভাবে একটি লজিকাল ফুটো অপেক্ষাকৃত তুচ্ছ বিষয়।

মূল পরিস্থিতি যেখানে আমি জিসিকে জোর করা খারাপ বলে মনে করি সেই জিনিসগুলির জন্য যেখানে লজিকাল ফুটো আসলে ক্র্যাশের চেয়ে কম পছন্দযোগ্য। গেমস সহ, উদাহরণস্বরূপ, ক্রাশটি অগত্যা কাউকে মেরে ফেলবে না এবং এটি অভ্যন্তরীণ পরীক্ষার সময় সহজেই ধরা পড়তে পারে এবং ঠিক করা যেতে পারে, তবে যৌক্তিক ফাঁসটি পণ্য জাহাজগুলির পরেও নজরে না যায় যদি না এটি মারাত্মক হয় যে এটি কয়েক মিনিটের মধ্যে গেমটিকে খেলতে না পারে unless । কিছু ডোমেনে পরীক্ষায় ঘটে এমন একটি সহজে-পুনরুত্পাদনযোগ্য ক্রাশ কখনও কখনও ফাঁসের পক্ষে পছন্দ হয় যে তাৎক্ষণিকভাবে কেউ খেয়াল করে না।

আমি অন্য একটি ক্ষেত্রে ভাবতে পারি যেখানে জিসিকে কোন দলে জোর করা পছন্দনীয় হতে পারে তা খুব স্বল্প-কালীন প্রোগ্রামের জন্য, যেমন একটি কাজ করে যা কমান্ড লাইন থেকে কার্যকর করে তারপরে বন্ধ হয়ে যায় like সেক্ষেত্রে যে কোনও ধরণের লজিকাল ফাঁসকে তুচ্ছ-তুচ্ছ করতে প্রোগ্রামটির জীবনকাল খুব সংক্ষিপ্ত। লজিকাল ফুটো এমনকি বড় সংস্থানগুলির জন্য, সাধারণত সফ্টওয়্যারটি চালানোর কয়েক ঘন্টা বা কয়েক মিনিটের পরে সমস্যার সমাধান হয়ে যায়, সুতরাং যে সফ্টওয়্যারটি কেবলমাত্র 3 সেকেন্ডের জন্য কার্যকর করা হয় তা লজিকাল ফাঁস হওয়ার সমস্যা হওয়ার সম্ভাবনা খুব কমই থাকে এবং এটি জিনিসকে অনেক কিছু করতে পারে could দলটি যদি স্রেফ জিসি ব্যবহার করে তবে এই জাতীয় স্বল্পস্থায়ী প্রোগ্রামগুলি লেখার পক্ষে সহজ।

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