সি # তে জঞ্জাল সংগ্রহের জন্য সেরা অনুশীলন


118

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

উত্তর:


112

সর্বোত্তম অনুশীলন হ'ল জঞ্জাল সংগ্রহের জোর না করা।

এমএসডিএন অনুসারে:

"সংগ্রহকে কল করে জঞ্জাল সংগ্রহের জোর করা সম্ভব, তবে বেশিরভাগ সময় এটি এড়ানো উচিত কারণ এটি পারফরম্যান্সের সমস্যা তৈরি করতে পারে।"

যাইহোক, আপনি যদি সংগ্রহের () কলিংয়ের কোনও নেতিবাচক প্রভাব ফেলবে না তা নিশ্চিত করার জন্য যদি আপনি নির্ভরযোগ্যভাবে আপনার কোডটি পরীক্ষা করতে পারেন তবে এগিয়ে যান ...

যখন আপনার আর প্রয়োজন নেই তখন অবজেক্টগুলি পরিষ্কার হয়ে যায় তা নিশ্চিত করার চেষ্টা করুন। আপনার যদি কাস্টম অবজেক্ট থাকে তবে "ইউজিং স্টেটমেন্ট" এবং আইডিস্পোজেবল ইন্টারফেস ব্যবহার করে দেখুন।

এই লিঙ্কটিতে মেমরি / আবর্জনা সংগ্রহ মুক্ত করার ক্ষেত্রে কিছু ভাল ব্যবহারিক পরামর্শ রয়েছে:

http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx


3
এছাড়াও, আপনি বিভিন্ন LatencyMode এর সেট করতে পারেন msdn.microsoft.com/en-us/library/bb384202.aspx
ডেভিড ঘ সি ই Freitas,

4
যদি আপনার অবজেক্টগুলি নিয়ন্ত্রণহীন মেমোরিটির দিকে নির্দেশ করে, তবে আপনি আবর্জনা সংগ্রহকারীকে GC.AddMemoryPressure Api ( msdn.microsoft.com/en-us/library/… ) এর মাধ্যমে জানাতে পারেন । এটি আবর্জনা সংগ্রহকারীকে সংগ্রহের অ্যালগরিদমে হস্তক্ষেপ না করে আপনার সিস্টেম সম্পর্কে আরও তথ্য দেয়।
Govert

+1: * "স্টেটমেন্ট ব্যবহার করে" এবং আইডিজিপোজেবল ইন্টারফেস ব্যবহার করে দেখুন * আমি সর্বশেষ উপায় হিসাবে ভাল জোর করে বিবেচনা করব না - ভাল পরামর্শ ('অস্বীকৃতি হিসাবে পড়ুন')। আমি যাইহোক, ব্যাক-এন্ড অপারেশনে একটি সক্রিয় রেফারেন্স হারাতে অনুকরণ করতে ইউনিট পরীক্ষায় সংগ্রহ করতে বাধ্য করছি - শেষ পর্যন্ত একটি নিক্ষেপ করা TargetOfInvocationNullException
আইএবস্ট্রাক্ট

33

এটি এইভাবে দেখুন - আবর্জনা 10% এ থাকতে পারে রান্নাঘরের আবর্জনা ফেলে দেওয়া কি আরও দক্ষ বা এটি বাইরে নেওয়ার আগে পূরণ করতে দেওয়া হয়?

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

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

এই মুহুর্তে একবার হতে পারে যে কোনও জিসি জোর করে সহায়তা করতে পারে - যদি আপনার প্রোগ্রামটি নিষ্ক্রিয় হয়, তবে ব্যবহারের মেমরিটি আবর্জনা-সংগ্রহ নয় কারণ কোনও বরাদ্দ নেই।


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

1
আমার ক্ষেত্রে আমি পারফরম্যান্সের সাথে পুনরায় সতর্কতার সাথে একটি * (সংক্ষিপ্ততম পথ) অ্যালগরিদ চালাচ্ছি ... যা উত্পাদনে কেবল একবার চালানো হবে (প্রতিটি "মানচিত্রে")। সুতরাং আমি আমার "পারফরম্যান্স পরিমাপক ব্লক" এর বাইরে প্রতিটি পুনরাবৃত্তির আগে জিসি সম্পন্ন করতে চাই, কারণ আমি অনুভব করি যে উত্পাদনের পরিস্থিতিটি আরও ঘনিষ্ঠভাবে মডেল করে, যেখানে প্রতিটি "মানচিত্র" নেভিগেট করার পরে জিসিকে বাধ্য করা উচিত / করা উচিত।
Corlettk

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

32

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

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

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

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

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

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

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

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

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


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

1
@ অ্যালঙ্ক, আমি এটি পছন্দ করি, যখন বাচ্চারা দিনের বেলা ঘরে যায়, শিক্ষক সহায়তার পক্ষে বাচ্চারা যাতে পথে না যায় সেজন্য একটি ভাল পরিশ্রম করার খুব ভাল সময়। (সাম্প্রতিক সিস্টেমগুলিতে আমি কাজ করেছি এমন সময়ে জিসিকে বাধ্য করার নির্দেশ দিয়ে পরিষেবা প্রক্রিয়াটি পুনরায় শুরু করেছে))
ইয়ান

21

আমি মনে করি রিকো মারিয়ানির দেওয়া উদাহরণটি ভাল ছিল: যদি আবেদনের রাজ্যে উল্লেখযোগ্য পরিবর্তন ঘটে তবে একটি জিসি ট্রিগার করা উপযুক্ত হতে পারে। উদাহরণস্বরূপ, কোনও দস্তাবেজ সম্পাদকটিতে কোনও নথি বন্ধ থাকলে জিসি ট্রিগার করা ঠিক হবে।


2
বা একটি বৃহত সংলগ্ন বস্তু খোলার ঠিক আগে যা ব্যর্থতার ইতিহাস দেখিয়েছে এবং এর গ্রানুলারিটি বাড়ানোর জন্য কোনও কার্যকর রেজোলিউশন উপস্থাপন করে না।
ক্রোকুসেক

17

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

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

প্রোগ্রামিং সমস্যাগুলি বিভিন্ন ধরণের এবং নমনীয় পদ্ধতির প্রয়োজন। আমি এমন কেসগুলি দেখেছি যেখানে জঞ্জাল সংগ্রহ করা ভাষাগুলি এবং এমন জায়গাগুলি যেখানে এটি প্রাকৃতিকভাবে ঘটেছিল তার অপেক্ষা না করে এটি ট্রিগার করা বুদ্ধিমান বোধ করে sense 95% সময়, এর মধ্যে দুটিই সঠিকভাবে সমস্যাটির কাছে না যাওয়ার সাইনপোস্ট হবে। তবে 20-এ 1 বার, সম্ভবত এটির জন্য একটি বৈধ কেস তৈরি করতে হবে।


12

আমি আবর্জনা সংগ্রহ আউটস্মার্ট না চেষ্টা শিখেছি। এই বলে যে, আমি usingফাইল বা I / O বা ডাটাবেস সংযোগের মতো পরিচালনা না করা রিসোর্সগুলির সাথে ডিল করার সময় আমি কীওয়ার্ডটি ব্যবহার করতে আছি।


27
কম্পাইলার? সংকলকটির জিসির সাথে কী করার আছে? :)
ক্রিস্টোফেরআ

1
কিছুই নয়, এটি কেবল কোডটি সংকলন করে এবং অনুকূলিত করে। এবং এটি অবশ্যই সিএলআর ... বা। নেট এমনকি এর সাথে কিছুই করার নেই।
কন

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

1
এটি ব্যবহার করে মোড়ানোর বিষয়টি নিশ্চিত করবে যে এটি একবার ব্যবহারের সুযোগ ছাড়াই জিসির জন্য নির্ধারিত। কম্পিউটারটি বিস্ফোরিত না হলে সেই মেমরিটি সম্ভবত পরিষ্কার হয়ে যাবে।
কন

9

এটি সর্বোত্তম অনুশীলন কিনা তা নিশ্চিত নয় তবে লুপে প্রচুর পরিমাণে চিত্রের সাথে কাজ করার সময় (যেমন প্রচুর গ্রাফিকস / চিত্র / বিটম্যাপ অবজেক্টগুলি তৈরি এবং নিষ্পত্তি করে), আমি নিয়মিতভাবে জিসি.কলেক্ট করতে দেই।

আমার মনে হয় আমি কোথাও পড়েছি যে প্রোগ্রামটি বেশিরভাগ ক্ষেত্রে নিষ্ক্রিয় থাকে এবং কেবল নিবিড় লুপের মাঝখানে থাকে না, তখন ম্যানুয়াল জিসি বোঝাতে পারে এমন কোনও জায়গার মতো দেখতে এটি দেখতে পারে runs


আপনি কি নিশ্চিত যে আপনার এটি প্রয়োজন? আপনার কোডটি নিষ্ক্রিয় না হলেও, মেমরির প্রয়োজন হলে জিসি সংগ্রহ করবে
কনরাড রুডল্ফ

এটি এখন নেট নেট এসপি ৩-এ কীভাবে রয়েছে তা নিশ্চিত নয়, তবে এর আগে (১.১ এবং আমি বিশ্বাস করি যে আমি ২.০ এর বিপরীতে পরীক্ষা করেছি) এটি মেমরির ব্যবহারের ক্ষেত্রে কোনও পার্থক্য করেছিল। জিসি অবশ্যই সবসময় সংগ্রহ করি প্রয়োজনীয় হবে, কিন্তু আপনি এখনও র্যাম 100 Megs নষ্ট যখন আপনি শুধুমাত্র 20 হায় যদিও একটি few'more পরীক্ষার প্রয়োজন প্রয়োজন শেষ পর্যন্ত হতে পারে
মাইকেল Stum

2
জিসি মেমরি বরাদ্দকরণে ট্রিগার করা হয় যখন প্রজন্ম 0 নির্দিষ্ট থ্রেশহোল্ডে পৌঁছায় (উদাহরণস্বরূপ 1MB), যখন "কিছু নিষ্ক্রিয় থাকে" না। অন্যথায় আপনি কেবলমাত্র বরাদ্দ এবং অবিলম্বে অবজেক্টগুলি বঞ্চিত করে একটি লুপে আউটআফমিউরিএক্সসেপশনটি শেষ করতে পারেন।
liggett78

5
যদি অন্য কোনও প্রক্রিয়াগুলির প্রয়োজন না হয় তবে 100 মিমি র‌্যাম নষ্ট হয় না। এটি আপনাকে একটি দুর্দান্ত পারফরম্যান্স উত্সাহ দিচ্ছে :
অরিয়ান এডওয়ার্ডস

9

একটি ক্ষেত্রে আমি সম্প্রতি মুখোমুখি হয়েছি যে ম্যানুয়াল কলগুলির জন্য GC.Collect()যখন প্রয়োজনীয় ছোট সি ++ অবজেক্টগুলিতে ক্ষুদ্র পরিচালিত সি ++ অবজেক্টগুলিতে আবৃত ছিল, যার পরিবর্তে সি # থেকে অ্যাক্সেস করা হয়েছিল তার সাথে কাজ করা হয়েছিল to

আবর্জনা সংগ্রাহককে কখনই ফোন করা যায়নি কারণ ব্যবহৃত পরিচালিত মেমোরির পরিমাণ নগণ্য ছিল, তবে ব্যবহৃত পরিচালনা করা মেমরির পরিমাণটি বিশাল of Dispose()বস্তুগুলিতে ম্যানুয়ালি কল করার জন্য আমার প্রয়োজন হবে যে কখন আমার নিজের প্রয়োজন হবে না সেদিকে নজর রাখা উচিত, অন্যদিকে কলিং GC.Collect()এমন কোনও বস্তু পরিষ্কার করে দেবে যা আর উল্লেখ করা হয়নি .....


6
এটির সমাধানের আরও ভাল উপায় হ'ল GC.AddMemoryPressure (ApproximateSizeOfUnmanagedResource)কনস্ট্রাক্টরকে কল করা এবং পরে GC.RemoveMemoryPressure(addedSize)ফাইনালাইজারে। এইভাবে আবর্জনা সংগ্রহকারী পরিচালনা করা কাঠামোর আকার বিবেচনা করে স্বয়ংক্রিয়ভাবে চালিত হবে। stackoverflow.com/questions/1149181/...
HugoRune

এবং সমস্যাটি সমাধান করার আরও একটি ভাল উপায় হ'ল বাস্তবে ডিসপোজ () কল করুন যা আপনার যাহাই হউক না কেন।
ফাবস্প্রো

2
সর্বোত্তম উপায় হ'ল ব্যবহার কাঠামোটি ব্যবহার করা। চেষ্টা করুন / শেষ অবধি। ডিসপোজ একটি ঝামেলা
TamusJRoyce

7

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

  1. আপনার কোডে এমন কিছু আছে যা প্রয়োজনের তুলনায় বৃহত্তর স্কোপে আইটেমগুলি ঘোষণা করছে
  2. স্মৃতি ব্যবহার সত্যিই খুব বেশি?
  3. এটি প্রকৃতপক্ষে সহায়তা করে কিনা তা দেখার জন্য GC. Collect () ব্যবহার করার আগে ও পরে কার্যকারিতার তুলনা করুন।

5

ধরুন আপনার প্রোগ্রামটিতে মেমরি ফুটো নেই, জিনিসগুলি জমে এবং জেনার 0 তে জিসি-এড হতে পারে না কারণ: 1) এগুলি দীর্ঘ সময়ের জন্য রেফারেন্স করা হয় তাই জেন 1 এবং জেন 2 তে প্রবেশ করুন; 2) এগুলি বৃহত বস্তু (> 80 কে) তাই LOH (বড় অবজেক্ট হিপ) এ প্রবেশ করুন। এবং এলওএইচ জেন 0, জেন 1 এবং জেন 2 এর মতো কমপ্যাক্টিং করে না।

".NET মেমোরি" এর পারফরম্যান্স কাউন্টারটি পরীক্ষা করে দেখতে পারেন যে 1) সমস্যাটি আসলেই কোনও সমস্যা নয়। সাধারণত, প্রতি 10 জেন 0 জিসি 1 জেন 1 জিসি ট্রিগার করবে এবং প্রতি 10 জেন 1 জিসি 1 জেন 2 জিসি ট্রিগার করবে। তাত্ত্বিকভাবে, GC0- তে কোনও চাপ না থাকলে GC1 এবং GC2 কখনই GC-ed হতে পারে না (যদি প্রোগ্রামটির মেমরির ব্যবহারটি সত্যই ওয়্যার্ড থাকে)। এটা আমার সাথে কখনও হয় না।

সমস্যা 2) এর জন্য, আপনি ".NET মেমরি" পারফরম্যান্স কাউন্টারটি যাচাই করতে পারেন যা LOH ফুলে যাচ্ছে verify যদি এটি আপনার সমস্যাটির পক্ষে সত্যিই একটি সমস্যা হয় তবে সম্ভবত এই ব্লগটি http://blogs.msdn.com/yunjin/archive/2004/01/27/63642.aspx এর পরামর্শ অনুসারে একটি বৃহত-অবজেক্ট-পুল তৈরি করতে পারে ।


4

বড় বস্তুগুলি এলএনএইচ-তে বরাদ্দ করা হয় (বড় অবজেক্ট হিপ), জেনারেল ০ তে নয় 0. আমি বিশ্বাস করি যখন কেবল সম্পূর্ণ জিসি চক্র (প্রজন্ম 0, 1 এবং 2) ঘটে তখনই এগুলি সংগ্রহ করা হয়।

বলা হচ্ছে, আমি বিশ্বাস করি যে অন্যদিকে জিসি যখন আপনি বড় আকারের জিনিসগুলির সাথে কাজ করেন এবং মেমরির চাপ বাড়তে থাকে তখন আরও আক্রমণাত্মকভাবে মেমরি সামঞ্জস্য করে এবং সংগ্রহ করবেন will

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


4

আমি এটি যুক্ত করতে চাই: জিসি.কলেক্ট () (+ ওয়েটফরপেন্ডিংফিনালাইজারস ()) কল করা গল্পটির একটি অংশ। যেমনটি অন্যদের দ্বারা যথাযথভাবে উল্লেখ করা হয়েছে, জিসি.কোলোচার () অ-সংজ্ঞাবহ সংগ্রহ এবং এটি নিজেই জিসি (সিএলআর) এর বিবেচনার ভিত্তিতে ছেড়ে যায়। এমনকি যদি আপনি ওয়েটফরপেন্ডিংফাইনালাইজারগুলিতে একটি কল যুক্ত করেন তবে এটি নির্দোষ হতে পারে না। এই এমএসডিএন লিঙ্কটি থেকে কোডটি নিন এবং 1 বা 2 হিসাবে অবজেক্ট লুপ পুনরাবৃত্তির সাহায্যে কোডটি চালান You অবশ্যই, অপেক্ষা করুন .. () দ্বারা সবেমাত্র 1 (বা 2) দীর্ঘতর অবজেক্ট থাকা অবস্থায় ধ্বংসকারীকে ডাকা হয় না [[উদ্ধৃতি রেকর্ড।]

যদি আপনার কোডটি পরিচালনা না করা সংস্থাগুলির সাথে আচরণ করে (উদা: বাহ্যিক ফাইল হ্যান্ডলগুলি), আপনাকে অবশ্যই ডেস্ট্রাক্টর (বা চূড়ান্তকরণকারী) প্রয়োগ করতে হবে।

এখানে একটি আকর্ষণীয় উদাহরণ:

দ্রষ্টব্য : আপনি এমএসডিএন থেকে উপরের উদাহরণটি ইতিমধ্যে চেষ্টা করে থাকলে, নিম্নলিখিত কোডটি বাতাসকে সাফ করতে চলেছে।

class Program
{    
    static void Main(string[] args)
        {
            SomePublisher publisher = new SomePublisher();

            for (int i = 0; i < 10; i++)
            {
                SomeSubscriber subscriber = new SomeSubscriber(publisher);
                subscriber = null;
            }

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

            Console.WriteLine(SomeSubscriber.Count.ToString());


            Console.ReadLine();
        }
    }

    public class SomePublisher
    {
        public event EventHandler SomeEvent;
    }

    public class SomeSubscriber
    {
        public static int Count;

        public SomeSubscriber(SomePublisher publisher)
        {
            publisher.SomeEvent += new EventHandler(publisher_SomeEvent);
        }

        ~SomeSubscriber()
        {
            SomeSubscriber.Count++;
        }

        private void publisher_SomeEvent(object sender, EventArgs e)
        {
            // TODO: something
            string stub = "";
        }
    }

আমি পরামর্শ দিই, প্রথমে আউটপুটটি কী হতে পারে তা বিশ্লেষণ করুন এবং তারপরে চালানো এবং তারপরে নীচের কারণটি পড়ুন:

Program প্রোগ্রামটি শেষ হওয়ার পরে ডেস্ট্রাক্টরকে কেবল অন্তর্নিহিত বলা হয়। Deter অবজেক্টটিকে নির্বিচারে পরিষ্কার করার জন্য, অবশ্যই আইডিস্পোজেবল বাস্তবায়ন করতে হবে এবং ডিসপোজ () এ একটি স্পষ্ট কল করা উচিত। এটাই সারমর্ম! :)


2

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

.NET জিসি ভালভাবে নকশা করা এবং অভিযোজিত হওয়ার জন্য সুরযুক্ত, যার অর্থ এটি আপনার প্রোগ্রামের মেমরির ব্যবহারের "অভ্যাস" অনুসারে GC0 / 1/2 থ্রেশহোল্ডকে সামঞ্জস্য করতে পারে। সুতরাং, কিছু সময় চলার পরে এটি আপনার প্রোগ্রামের সাথে মানিয়ে নেওয়া হবে। আপনি একবার জিসি.ক্লোকটকে স্পষ্টভাবে আবেদন করলে, থ্রেশহোল্ডগুলি পুনরায় সেট হয়ে যাবে! এবং .NET কে আপনার প্রোগ্রামের "অভ্যাস" সাথে আবার খাপ খাইয়ে নিতে সময় ব্যয় করতে হবে।

আমার পরামর্শ সর্বদা বিশ্বাস। নেট জিসি। কোনও স্মৃতি সমস্যার উপরিভাগে, ".NET মেমোরি" পারফরম্যান্স কাউন্টারটি পরীক্ষা করে নিজের কোডটি নির্ধারণ করুন।


6
আমার মনে হয় আপনি এই উত্তরটি আপনার আগের উত্তরের সাথে একীভূত করাই ভাল।
সালামান্ডের

1

এটি সর্বোত্তম অনুশীলন কিনা তা নিশ্চিত নন ...

পরামর্শ: যখন অনিশ্চিত হয় তখন এটি বা কোনও কিছুই প্রয়োগ করবেন না। তথ্যগুলি জানা গেলে পুনরায় মূল্যায়ন করুন, তারপরে যাচাই করার জন্য পারফরম্যান্স পরীক্ষার আগে / পরে সম্পাদন করুন।


0

যাইহোক, আপনি যদি সংগ্রহের () কলিংয়ের কোনও নেতিবাচক প্রভাব ফেলবে না তা নিশ্চিত করার জন্য যদি আপনি নির্ভরযোগ্যভাবে আপনার কোডটি পরীক্ষা করতে পারেন তবে এগিয়ে যান ...

আইএমএইচও, এটি বলার মতো "যদি আপনি প্রমাণ করতে পারেন যে আপনার প্রোগ্রামে ভবিষ্যতে কখনও কোনও বাগ থাকবে না, তবে এগিয়ে যান ..."

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


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