। নেট এ দুর্বল রেফারেন্স কখন ব্যবহার করবেন?


56

আমি নেট থেকে রেফারেন্স টাইপটি ব্যবহার করার দরকার হয়েছি এমন ব্যক্তিগতভাবে আমি ব্যক্তিগতভাবে আসিনি, তবে জনপ্রিয় বিশ্বাস মনে হয় এটি ক্যাশে ব্যবহার করা উচিত। ড জন Harrop তার মধ্যে ক্যাশে মধ্যে WeakReferences ব্যবহার করার বিরুদ্ধে একটি খুব ভাল ক্ষেত্রে দিলেন উত্তর থেকে এই প্রশ্ন।

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

ডঃ জন হ্যারোপ তার উত্তরে আরও উল্লেখ করেছেন যে। নেট দুর্বল উল্লেখগুলি নরম নয়, এবং জেন 0 তে দুর্বল উল্লেখগুলির আগ্রাসী সংগ্রহ রয়েছে। এমএসডিএন অনুসারে , দীর্ঘ দুর্বল রেফারেন্স আপনাকে কোনও জিনিস পুনরায় তৈরি করার সম্ভাবনা দেয় but the state of the object remains unpredictable.,!

এই বৈশিষ্ট্যগুলি দেওয়া, আমি এমন পরিস্থিতিটি ভাবতে পারি না যেখানে দুর্বল উল্লেখগুলি কার্যকর হবে, সম্ভবত কেউ আমাকে আলোকিত করতে পারে?


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

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

4
আমি কিছুটা হতাশ হচ্ছি এটি বন্ধ হওয়ার জন্য কিছু বেশি ভোট পাচ্ছে। এই সম্পর্কে উত্তর বা কিছু আলোচনা দেখে আমার আপত্তি হবে না (বি 4 "স্ট্যাক ওভারফ্লো কোনও ফোরাম নয়")।
ta.speot.is

@theurnurnmonk এটি স্মৃতি লাভের বিনিময়ে অফসেট। আজকের কাঠামোয় এটি সন্দেহজনক যে বিস্তৃত ক্যাশিং ব্যবস্থা সহজেই উপলভ্য হওয়ায় কোনও ক্যাশে বাস্তবায়নের সময়ও যে কেউ সরাসরি WeakReferences সরঞ্জামের জন্য পৌঁছে যাবে।

এগুলি ব্যবহারের জন্য একটি বিব্রতকরভাবে জটিল জটিল উদাহরণ এখানে রয়েছে (দুর্বল ইভেন্ট প্যাটার্নের জন্য যা স্পেস.ও. নীচে বর্ণনা করেছেন)
বেনজল

উত্তর:


39

আমি নিম্নলিখিত তিনটি বাস্তব-দর্শনীয় স্থিতিতে দুর্বল রেফারেন্সগুলির বৈধ ব্যবহারিক প্রয়োগ পেয়েছি যা আমার ব্যক্তিগতভাবে ঘটেছিল:

অ্যাপ্লিকেশন 1: ইভেন্ট হ্যান্ডলার

আপনি একজন উদ্যোক্তা। আপনার সংস্থা ডাব্লুপিএফের জন্য একটি স্পার্ক লাইনের নিয়ন্ত্রণ বিক্রি করে । বিক্রয় দুর্দান্ত তবে সহায়তা ব্যয়গুলি আপনাকে হত্যা করছে। প্রচুর গ্রাহক স্পার্ক লাইনের পূর্ণ স্ক্রিনগুলিতে স্ক্রোল করার সময় সিপিইউ হগিং এবং মেমরি ফাঁসের অভিযোগ করছেন। সমস্যাটি হ'ল তাদের অ্যাপটি নতুন স্পার্ক লাইন তৈরি করছে যখন তারা নজরে আসে তবে ডেটা বাইন্ডিং পুরানোগুলিকে আবর্জনা সংগ্রহ করা থেকে বিরত রাখে। আপনি কি করেন?

ডেটা বাঁধাই এবং আপনার নিয়ন্ত্রণের মধ্যে একটি দুর্বল রেফারেন্স পরিচয় করিয়ে দিন যাতে একা ডেটা বাঁধাই আর আপনার নিয়ন্ত্রণকে আবর্জনা সংগ্রহ থেকে আটকাবে না। তারপরে আপনার নিয়ন্ত্রণে এমন একটি চূড়ান্তকরণ যুক্ত করুন যা তথ্য সংগ্রহের সাথে সাথে বাঁধাই করে।

অ্যাপ্লিকেশন 2: পরিবর্তনীয় গ্রাফ

আপনি পরের জন কারম্যাক আপনি হায়ারার্কিকাল মহকুমা পৃষ্ঠতলগুলির একটি ইনজিনিয়াস নতুন গ্রাফ ভিত্তিক উপস্থাপনা আবিষ্কার করেছেন যা টিম সুইনার গেমসকে নিন্টেন্ডো ওয়াইয়ের মতো দেখায়। স্পষ্টতই আমি আপনাকে এটি ঠিক কীভাবে কাজ করে তা বলার অপেক্ষা রাখে না তবে এটি এই পরিবর্তনীয় গ্রাফের সমস্ত কেন্দ্র যেখানে একটি খণ্ডের প্রতিবেশী একটিতে পাওয়া যায় Dictionary<Vertex, SortedSet<Vertex>>। খেলোয়াড়ের চারপাশে দৌড়ানোর সাথে সাথে গ্রাফের টপোলজি পরিবর্তন করতে থাকে। কেবল একটি সমস্যা আছে: আপনার ডেটা স্ট্রাকচারটি অ্যাক্সেসযোগ্য সাবগ্রাফগুলি চালিত হওয়ার সাথে সাথে তা ছড়িয়ে দিচ্ছে এবং আপনাকে সেগুলি সরিয়ে ফেলতে হবে বা আপনার স্মৃতি ফাঁস করবে। ভাগ্যক্রমে আপনি একজন প্রতিভাশালী তাই আপনি জানেন যে অ্যালগরিদমগুলির একটি শ্রেণি রয়েছে যা বিশেষভাবে অ্যাক্সেসযোগ্য উপগ্রহগুলি সনাক্ত এবং সংগ্রহ করার জন্য ডিজাইন করা হয়েছে: আবর্জনা সংগ্রহকারী! আপনি এই বিষয়ে রিচার্ড জোনসের দুর্দান্ত মনোগ্রাফটি পড়েছেনতবে এটি আপনাকে বিস্মিত এবং আপনার আসন্ন সময়সীমার বিষয়ে উদ্বিগ্ন leaves আপনি কি করেন?

কেবলমাত্র আপনার Dictionaryদুর্বল হ্যাশ টেবিলের পরিবর্তে আপনি বিদ্যমান জিসিকে পিগিব্যাক করতে পারেন এবং এটি স্বয়ংক্রিয়ভাবে আপনার অ্যাক্সেসযোগ্য উপগ্রহগুলি আপনার জন্য সংগ্রহ করতে পারেন! ফেরারি বিজ্ঞাপনগুলির মাধ্যমে পাতায় ফিরে।

অ্যাপ্লিকেশন 3: সজ্জিত গাছ

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

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

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


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

@ ড্যানিয়েল জিসি কি অ্যাক্সেসযোগ্য চক্র পরিচালনা করতে সক্ষম হওয়ার কথা নয়? কিভাবে এই হবে না সংগ্রহ করা শক্তিশালী রেফারেন্স একজন অনধিগম্য চক্র যখন হবে সংগ্রহ করা?
বিনকি

ওহ, আমি মনে করি দেখেছি। আমি কেবল ধরে নিয়েছি ConditionalWeakTableযে অ্যাপ্লিকেশনগুলি 2 এবং 3 ব্যবহার করবে তবে অন্যান্য পোস্টের কিছু লোক আসলে ব্যবহার করবে Dictionary<WeakReference, T>WeakReferenceআপনি কীভাবে তা নির্বিশেষে কোনও কী দ্বারা অ্যাক্সেস করা যায় না এমন মানগুলি সহ আপনি কেন সবসময় নালকের সাথে শেষ করতে চান তা ধারণা নেই । Ridik।
বিনকি

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

@ ড্যানিয়েল: "যদি অ্যাক্সেসযোগ্য উপচ্ছেদে চক্র থাকে তবে দুর্বল উল্লেখগুলি অ্যাপ্লিকেশন 2 এর জন্য কাজ করবে না This এটি কারণ হ'ল দুর্বল হ্যাশ টেবিলটিতে সাধারণত কীগুলির প্রতি দুর্বল উল্লেখ থাকে তবে মানগুলির শক্তিশালী উল্লেখ থাকে You আপনার একটি হ্যাশ টেবিলের দরকার হবে যা "কীটি এখনও পৌঁছনযোগ্য" তখনই মানগুলির শক্তিশালী উল্লেখগুলি বজায় রাখে। হ্যাঁ. আপনি সম্ভবত গ্রাফকে পয়েন্টার হিসাবে প্রান্তের সাথে সরাসরি এনকোডিং দিয়ে ভাল হবেন যাতে জিসি নিজেই এটি সংগ্রহ করবেন।
জন হ্যারোপ

19

এই বৈশিষ্ট্যগুলি দেওয়া, আমি এমন পরিস্থিতিটি ভাবতে পারি না যেখানে দুর্বল উল্লেখগুলি কার্যকর হবে, সম্ভবত কেউ আমাকে আলোকিত করতে পারে?

মাইক্রোসফ্ট নথি দুর্বল ইভেন্ট প্যাটার্নস

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

...

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


সেই ইউআরএল স্বয়ংক্রিয়রূপে নতুন। নেট সংস্করণ (বর্তমানে 4.5 টি) বাছাই করে যাতে 'এই বিষয়টি আর উপলভ্য নয়'। .NET 4.0 নির্বাচন পরিবর্তে কাজ করে ( msdn.microsoft.com/en-us/library/aa970850(v=vs.100).aspx )
maxp

13

আমি এটি প্রথমে রাখি এবং এটিতে ফিরে আসি:

আপনি যখন কোনও বস্তুতে ট্যাব রাখতে চান তখন একটি WeakReferences কার্যকর হয়, তবে আপনি চান না যে আপনার পর্যবেক্ষণগুলি সেই অবজেক্টটি সংগ্রহ করা থেকে আটকাবে

সুতরাং আসুন শুরু থেকে শুরু করা যাক:

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

সুতরাং যখন আপনি কোনও জিনিস পেয়েছেন X- আসুন এটির উদাহরণ হিসাবে নির্দিষ্ট করুন class Foo- এটি নিজেরাই লাইভ করতে পারে না (বেশিরভাগ সত্য); "কোনও মানুষই দ্বীপ নয়" একইভাবে, কোনও বস্তু দ্বীপপুঞ্জে উন্নীত করতে পারে এমন কয়েকটি উপায় রয়েছে - যদিও এটি সিএলআর ভাষায় জিসি রুট বলে। জিসি রুট হওয়া বা কোনও জিসি রুটের সাথে সংযোগ / রেফারেন্সের প্রতিষ্ঠিত চেইন থাকা মূলত যা নির্ধারণ করে তা Foo x = new Foo()আবর্জনা সংগ্রহ করা যায় কিনা not

আপনি যদি গিস বা স্ট্যাক হাঁটার মাধ্যমে কিছু জিসি রুটে ফিরে যেতে না পারেন তবে আপনি কার্যকরভাবে এতিম হয়েছেন এবং পরবর্তী চক্রটি সম্ভবত চিহ্নিত / সংগ্রহ করা হবে।

এই মুহুর্তে, আসুন কয়েকটি ভয়াবহ-নিয়ন্ত্রিত উদাহরণগুলি দেখুন:

প্রথম, আমাদের Foo:

public class Foo 
{
    private static volatile int _ref = 0;
    public event EventHandler FooEvent;
    public Foo()
    {
        _ref++;
        Console.WriteLine("I am #{0}", _ref);
    }
    ~Foo()
    {
        Console.WriteLine("#{0} dying!", _ref--);
    }
}

মোটামুটি সহজ - এটি থ্রেড নিরাপদ নয়, তাই চেষ্টা করে দেখুন না, তবে চূড়ান্ত হওয়ার পরে সক্রিয় উদাহরণ এবং হ্রাসের একটি মোটামুটি "রেফারেন্স গণনা" রাখুন।

এখন একটি তাকান FooConsumer:

public class NastySingleton
{
    // Static member status is one way to "get promoted" to a GC root...
    private static NastySingleton _instance = new NastySingleton();
    public static NastySingleton Instance { get { return _instance;} }

    // testing out "Hard references"
    private Dictionary<Foo, int> _counter = new Dictionary<Foo,int>();
    // testing out "Weak references"
    private Dictionary<WeakReference, int> _weakCounter = new Dictionary<WeakReference,int>();

    // Creates a strong link to Foo instance
    public void ListenToThisFoo(Foo foo)
    {
        _counter[foo] = 0;
        foo.FooEvent += (o, e) => _counter[foo]++;
    }

    // Creates a weak link to Foo instance
    public void ListenToThisFooWeakly(Foo foo)
    {
        WeakReference fooRef = new WeakReference(foo);
        _weakCounter[fooRef] = 0;
        foo.FooEvent += (o, e) => _weakCounter[fooRef]++;
    }

    private void HandleEvent(object sender, EventArgs args, Foo originalfoo)
    {
        Console.WriteLine("Derp");
    }
}

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

// Our foo
var f = new Foo();

// Create a "hard reference"
NastySingleton.Instance.ListenToThisFoo(f);

// Ok, we're done with this foo
f = null;

// Force collection of all orphaned objects
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

এখন, উপরের থেকে, আপনি কী প্রত্যাশা করবেন যে একবার f"অবলম্বনযোগ্য" হিসাবে একবার-উল্লেখ করা হয়েছিল ?

না, কারণ এখানে এখন আরও একটি অবজেক্ট রয়েছে যার একটি রেফারেন্স রয়েছে - Dictionaryসেই Singletonস্থির দৃষ্টান্তে।

ঠিক আছে, আসুন দুর্বল পদ্ধতির চেষ্টা করি:

f = new Foo();
NastySingleton.Instance.ListenToThisFooWeakly(f);

// Ok, we're done with this foo
f = null;

// Force collection of all orphaned objects
// This should collect # 2 - you'll see a "#2 dying"
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

এখন, যখন আমরা একবার-আমাদের Foo-একবার-এর সাথে আমাদের রেফারেন্সটি ফাঁকি দিয়ে fদেখি তখন অবজেক্টটির জন্য আর কোনও "শক্ত" রেফারেন্স থাকে না, সুতরাং এটি সংগ্রহযোগ্য - WeakReferenceদুর্বল শ্রোতার দ্বারা নির্মিত তা বাধা দেয় না।

ভাল ব্যবহারের ক্ষেত্রে:

  • ইভেন্ট হ্যান্ডলার (যদিও এটি প্রথম পড়ুন: সি # তে দুর্বল ইভেন্টগুলি )

  • আপনি এমন একটি পরিস্থিতি পেয়েছেন যেখানে আপনি "পুনরাবৃত্ত রেফারেন্স" তৈরি করতে পারেন (যেমন, অবজেক্ট এ অবজেক্ট বিকে বোঝায়, যা অবজেক্ট এ কে বোঝায়, এটি "মেমরি লিক" হিসাবেও পরিচিত) (সম্পাদনা: ডের্প, অবশ্যই এই আইএনএন সত্য নয়)

  • আপনি অবজেক্টের সংকলনে কিছু "সম্প্রচার" করতে চান, তবে আপনি এগুলি বাঁচিয়ে রাখার জিনিসটি হতে চান না; একটি List<WeakReference>সহজেই বজায় রাখা যায়, এবং যেখানে সরিয়ে দিয়ে ছাঁটাই করা যায়ref.Target == null


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

@ জোড্যালে আমি সম্মত .NET জিসি একটি চিহ্ন এবং সুইপ অ্যালগরিদম ব্যবহার করে যা (আমি বিশ্বাস করি আমি এটি সঠিকভাবে স্মরণ করছি) সংগ্রহের জন্য সমস্ত বস্তু চিহ্নিত করে এবং তারপরে "শিকড়" থেকে রেফারেন্স অনুসরণ করে (স্ট্যাকের উপর বস্তুর রেফারেন্স, স্ট্যাটিক অবজেক্টস) সংগ্রহের জন্য অচিহ্নিত চিহ্নগুলি । যদি একটি বিজ্ঞপ্তি রেফারেন্স উপস্থিত থাকে তবে কোনও বস্তু রুট থেকে অ্যাক্সেসযোগ্য না হয় তবে অবজেক্টগুলি সংগ্রহের জন্য অচিহ্নিত নয় এবং এইভাবে সংগ্রহের জন্য যোগ্য।
ta.speot.is

1
@ জোড্যালি - আপনি দুজনই, অবশ্যই, সঠিক - এটি শেষের দিকে ছুটে যাচ্ছিলেন ... আমি এটি সম্পাদনা করব।
জেরকিমবল

4

এখানে চিত্র বর্ণনা লিখুন

লজিক্যাল ফাঁসের মতো যা ট্র্যাক ডাউন করা সত্যিই শক্ত যখন ব্যবহারকারীরা কেবলমাত্র খেয়াল রাখেন যে আপনার সফ্টওয়্যারটি দীর্ঘ সময়ের জন্য চালানো আরও বেশি মেমরি নিয়েছে এবং তারা পুনরায় চালু না হওয়া পর্যন্ত ধীর এবং ধীর হয়ে যায়? আমি না।

যদি ব্যবহারকারী উপরের অ্যাপ্লিকেশন রিসোর্সগুলি সরানোর জন্য অনুরোধ করে, তখন কী ঘটে তা বিবেচনা করুন Thing2:

  1. পয়েন্টার
  2. শক্তিশালী তথ্যসূত্র
  3. দুর্বল রেফারেন্স

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


1

ভাল প্রভাবের জন্য ব্যবহৃত দুর্বল রেফারেন্সগুলির একটি খুব উদাহরণস্বরূপ উদাহরণটি হ'ল কন্ডিশনাল উইক টেবিল , যা ডিএলআর দ্বারা ব্যবহৃত হয় (অন্যান্য জায়গাগুলির মধ্যে) অতিরিক্ত "সদস্য" অবজেক্টগুলিতে সংযুক্ত করতে।

আপনি টেবিলটি অবজেক্টটিকে বাঁচিয়ে রাখতে চান না। এই ধারণাটি কেবল দুর্বল উল্লেখ ছাড়াই কাজ করতে পারে না।

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


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

-2

আপনার যদি ক্যাশের স্তরটি সি # দিয়ে প্রয়োগ করা থাকে তবে এটি আপনার ডেটাটিকে দুর্বল উল্লেখ হিসাবে ক্যাশে রেখে দেয়, এটি আপনার ক্যাশে স্তরের কর্মক্ষমতা উন্নত করতে সহায়তা করতে পারে।

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

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


5
তবে দুর্বল রেফারেন্সগুলির সাথে সমস্যা (আমি উল্লেখ করা উত্তরটি দেখুন) হ'ল এগুলি খুব আগ্রহের সাথে সংগ্রহ করা হয়েছে এবং সংগ্রহটি মেমরির জায়গার প্রাপ্যতার সাথে যুক্ত নয়। সুতরাং মেমরির কোনও চাপ না থাকলে আপনি আরও ক্যাশে মিস করবেন।

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

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