দুর্বল রেফারেন্সগুলির ব্যবহার এমন কিছু যা আমি কখনই বাস্তবায়ন করতে দেখিনি তাই আমি তাদের ব্যবহারের ক্ষেত্রে কী আছে এবং বাস্তবায়ন কীভাবে কাজ করবে তা নির্ধারণ করার চেষ্টা করছি। আপনার কখন WeakHashMap
বা কোনটি ব্যবহার করার দরকার WeakReference
ছিল?
দুর্বল রেফারেন্সগুলির ব্যবহার এমন কিছু যা আমি কখনই বাস্তবায়ন করতে দেখিনি তাই আমি তাদের ব্যবহারের ক্ষেত্রে কী আছে এবং বাস্তবায়ন কীভাবে কাজ করবে তা নির্ধারণ করার চেষ্টা করছি। আপনার কখন WeakHashMap
বা কোনটি ব্যবহার করার দরকার WeakReference
ছিল?
উত্তর:
শক্তিশালী তথ্যসূত্রগুলির সাথে একটি সমস্যা ক্যাশিং, বিশেষত চিত্রগুলির মতো খুব বড় কাঠামো সহ। ধরুন আপনার কাছে এমন একটি অ্যাপ্লিকেশন রয়েছে যা ব্যবহারকারীর সরবরাহকৃত চিত্রগুলির সাথে কাজ করতে হবে, যেমন আমি কাজ করি এমন ওয়েব সাইট ডিজাইন সরঞ্জাম। স্বাভাবিকভাবেই আপনি এই চিত্রগুলি ক্যাশে করতে চান, কারণ এগুলি ডিস্ক থেকে লোড করা খুব ব্যয়বহুল এবং আপনি একবারে স্মৃতিতে দুটি সম্ভাব্য (সম্ভাব্য বিশাল) চিত্রের সম্ভাবনা এড়াতে চান।
যেহেতু যখন আমাদের একেবারেই প্রয়োজন হয় না তখন কোনও চিত্র ক্যাশে আমাদের পুনরায় লোড করা থেকে বিরত রাখে বলে মনে করা হয়, আপনি দ্রুত বুঝতে পারবেন ক্যাশে সর্বদা স্মৃতিতে থাকা কোনও চিত্রের একটি রেফারেন্স থাকা উচিত। সাধারণ শক্তিশালী রেফারেন্স সহ, যদিও, সেই রেফারেন্সটি নিজেই চিত্রটিকে স্মৃতিতে রাখতে বাধ্য করবে, যার জন্য আপনাকে কোনওরকমভাবে নির্ধারণ করতে হবে যে কখন মেমরির প্রয়োজন হবে না এবং তা ক্যাশে থেকে সরিয়ে ফেলুন, যাতে এটি আবর্জনা সংগ্রহের জন্য যোগ্য হয়ে ওঠে। আপনি আবর্জনা সংগ্রহকারীর আচরণের নকল করতে বাধ্য হন এবং কোনও জিনিস স্মৃতিতে থাকা উচিত কিনা তা ম্যানুয়ালি নির্ধারণ করতে বাধ্য হন।
দুর্বল রেফারেন্সগুলি বোঝা , ইথান নিকোলাস
WeakHashMap
।
WeakReference
বনাম SoftReference
একটি পার্থক্য স্পষ্ট করা হ'ল a WeakReference
এবং a এর মধ্যে পার্থক্য SoftReference
।
মূলত একটি WeakReference
হতে হবে জিসি-D দ্বারা জেভিএম সাগ্রহে, একবার রেফারেন্সড বস্তুর কোন হয়েছে হার্ড এটা রেফারেন্স। SoftReference
অন্যদিকে একটি ডি অবজেক্ট, আবর্জনা সংগ্রাহক যতক্ষণ না সত্যই এটির স্মৃতি পুনরায় দাবি করা দরকার ততক্ষণ এগুলি ফেলে রাখা হবে।
একটি ক্যাশে যেখানে মানগুলির ভিতরে রাখা হয় WeakReference
তা খুব অকেজো ( WeakHashMap
একটিতে এটি কীগুলি দুর্বলভাবে উল্লেখ করা হয়)। SoftReferences
যখন আপনি একটি ক্যাশে প্রয়োগ করতে চান যা উপলব্ধ মেমরির সাথে বৃদ্ধি এবং সঙ্কুচিত হতে পারে তখন চারপাশের মানগুলিকে মোড়ানোর জন্য দরকারী।
বিশেষত WeakReference
s এবং WeakHashMap
s এর একটি সাধারণ ব্যবহার হ'ল বস্তুগুলিতে বৈশিষ্ট্য যুক্ত করা। মাঝে মাঝে আপনি কোনও বস্তুতে কিছু কার্যকারিতা বা ডেটা যুক্ত করতে চান তবে সাবক্লাসিং এবং / অথবা রচনাটি কোনও বিকল্প নয় সেই ক্ষেত্রে স্পষ্টত করণীয় হ'ল হ্যাশম্যাপ তৈরি করা যা আপনি যে সম্পত্তিতে যুক্ত করতে চান সেই অবজেক্টের সাথে সংযোগ স্থাপন করতে হবে to । তারপরে যখনই আপনার সম্পত্তির প্রয়োজন হবে তখনই আপনি এটি মানচিত্রে সন্ধান করতে পারেন। তবে, আপনি যে জিনিসগুলিতে বৈশিষ্ট্য যুক্ত করছেন তা যদি ধ্বংস হয়ে যায় এবং প্রচুর পরিমাণে তৈরি হয় তবে আপনি আপনার মানচিত্রে প্রচুর পুরানো অবজেক্ট দিয়ে প্রচুর স্মৃতি গ্রহণ করতে পারেন।
আপনি যদি এর WeakHashMap
পরিবর্তে ব্যবহার করেন তবে অবজেক্টগুলি আপনার মানচিত্রটি যত তাড়াতাড়ি আপনার বাকি প্রোগ্রামের দ্বারা আর ব্যবহার করা হবে না তা ত্যাগ করবে, যা পছন্দসই আচরণ।
আমি কিছু ডেটা যোগ করার জন্য এই কি ছিল java.awt.Component
1.4.2 এবং 1.5 মধ্যে JRE পরিবর্তন কাছাকাছি পেতে, আমি এটা প্রত্যেক উপাদান আমি আগ্রহী INT (ছিল subclassing দ্বারা নির্ধারিত হতে পারে JButton
, JFrame
, JPanel
....) কিন্তু এই অনেক ছিল অনেক কম কোড সহ সহজ।
আরেকটি দরকারী ক্ষেত্রে WeakHashMap
এবং WeakReference
একটি হয় শ্রোতা রেজিস্ট্রি বাস্তবায়ন ।
যখন আপনি এমন কিছু তৈরি করেন যা কিছু নির্দিষ্ট ইভেন্ট শুনতে চায়, সাধারণত আপনি শ্রোতাদের নিবন্ধন করেন, যেমন
manager.registerListener(myListenerImpl);
যদি manager
আপনার শ্রোতাকে একটি দিয়ে সঞ্চয় করে রাখে তবে এর WeakReference
অর্থ আপনার নিবন্ধকটিকে সরিয়ে ফেলতে manager.removeListener(myListenerImpl)
হবে না কারণ এটি আপনার শ্রোতা বা শ্রোতার ধারক আপনার উপাদান অনুপলব্ধ হয়ে গেলে এটি স্বয়ংক্রিয়ভাবে সরানো হবে।
অবশ্যই আপনি এখনও নিজের শ্রোতাকে ম্যানুয়ালি মুছে ফেলতে পারেন, তবে আপনি যদি তা ভুলে যান বা আপনি এটি ভুলে যান তবে এটি কোনও স্মৃতি ফাঁস হবে না এবং এটি আপনার শ্রোতাদের আবর্জনা সংগ্রহ করা আটকাবে না।
কোথায় আছে WeakHashMap
ছবিতে আসে ?
শ্রোতার রেজিস্ট্রি যা রেজিস্টার্ড শ্রোতাদের WeakReference
সংরক্ষণ করতে পছন্দ করে এই রেফারেন্সগুলি সঞ্চয় করার জন্য একটি সংগ্রহ প্রয়োজন। WeakHashSet
স্ট্যান্ডার্ড জাভা লাইব্রেরিতে কেবলমাত্র কোনও প্রয়োগ নেই WeakHashMap
তবে আমরা প্রথমটির কার্যকারিতাটি "প্রয়োগ" করতে খুব সহজেই পরবর্তীটি ব্যবহার করতে পারি:
Set<ListenerType> listenerSet =
Collections.newSetFromMap(new WeakHashMap<ListenerType, Boolean>());
সঙ্গে এই listenerSet
একটি নতুন শ্রোতা রেজিস্টার আপনি শুধু সেট এটি যোগ করতে আছে, এবং যদিও তা স্পষ্টভাবে মুছে ফেলা না হয়, শ্রোতা আর রেফারেন্সড হয়, তাহলে এটি স্বয়ংক্রিয়ভাবে JVM দ্বারা সরানো হবে।
WeakHashMap
যখন অন্য কোনও HashMap
জিনিস প্রয়োজন তখনই আপনি অন্য দরকারী কেসটি বলতে পারেন। তাই ঘেউ আপনি নিজে কি করতে হবে না hashmap.remove কি কখনো কারণ আইটেম স্বয়ংক্রিয়ভাবেই আপনার সরিয়ে ফেলা হয় একবার obj পরিধি হয়! আক্ষরিক যাদু! এই ধরনের একটি কুশ্রী জাদু হ্যাক একটি হল সম্পূর্ণ facepalm ।
WeakReference
কোড বেসকে সহজতর করে এবং সাবস্ক্রাইব করতে ব্যর্থ সম্পর্কিত অযথা বাগগুলি এড়িয়ে চলে। কি খারাপ?
এই ব্লগ পোস্টটি উভয় শ্রেণির ব্যবহার দেখায়: জাভা: একটি আইডিতে সিঙ্ক্রোনাইজ করা । ব্যবহারটি এরকম কিছু হয়:
private static IdMutexProvider MUTEX_PROVIDER = new IdMutexProvider();
public void performTask(String resourceId) {
IdMutexProvider.Mutex mutext = MUTEX_PROVIDER.getMutex(resourceId);
synchronized (mutext) {
// look up the resource and do something with it
}
}
আইডমিউটেক্সটপ্রভাইডার সিঙ্ক্রোনাইজ করতে আইডি-ভিত্তিক অবজেক্টগুলি সরবরাহ করে। প্রয়োজনীয়তাগুলি হ'ল:
এটি ধরণের অভ্যন্তরীণ স্টোরেজ মানচিত্র ব্যবহার করে অর্জন করা হয়েছে:
WeakHashMap<Mutex, WeakReference<Mutex>>
অবজেক্টটি কী এবং মান উভয়ই। যখন মানচিত্রের বাহ্যিক কোনও কিছুর কাছে বস্তুর কঠোর উল্লেখ নেই, তখন এটি আবর্জনা সংগ্রহ করা যেতে পারে। মানচিত্রে মানগুলি কঠোর রেফারেন্স সহ সঞ্চিত থাকে, সুতরাং মেমরির ফাঁস রোধ করতে মানটি অবশ্যই WeakReferences এ মোড়ানো উচিত । এই শেষ পয়েন্টটি জাভাদোকের আচ্ছাদিত ।
আপনি উদাহরণস্বরূপ যদি একটি নির্দিষ্ট শ্রেণীর তৈরি সমস্ত বস্তুর উপর নজর রাখতে চান। এখনও এই জিনিসগুলি আবর্জনা সংগ্রহ করার অনুমতি দিতে, আপনি নিজেরাই বস্তুর পরিবর্তে বস্তুর প্রতি দুর্বল উল্লেখগুলির একটি তালিকা / মানচিত্র রাখেন।
এখন যদি কেউ আমার কাছে ফ্যান্টম-রেফারেন্স ব্যাখ্যা করতে পারে তবে আমি খুশি হব ...
উপরে উল্লিখিত হিসাবে, দুর্বল রেফারেন্স যতক্ষণ দৃ strong় রেফারেন্স বিদ্যমান থাকে ততক্ষণ ধরে রাখা হয়।
শ্রোতার অভ্যন্তরে WeakReferences ব্যবহার করার একটি উদাহরণ ব্যবহার হ'ল যাতে শ্রোতা তাদের টার্গেট অবজেক্টের মূল উল্লেখটি শেষ হয়ে গেলে আর সক্রিয় হয় না। মনে রাখবেন এর অর্থ এই নয় যে শ্রোতার তালিকা থেকে WeakReferences সরিয়ে দেওয়া হয়েছে, পরিষ্কার করা এখনও প্রয়োজন তবে এটি করা যেতে পারে উদাহরণস্বরূপ, নির্ধারিত সময়ে। এটি দৃ strong় রেফারেন্স রাখা থেকে অবজেক্টকে শোনার প্রতিরোধের প্রভাবও ফেলেছে এবং অবশেষে স্মৃতি ফোলে যাওয়ার উত্স হয়ে উঠবে। উদাহরণ: সুইং জিইউআই উপাদানগুলি উইন্ডোর চেয়ে দীর্ঘতর লাইফসাইকেলযুক্ত একটি মডেলকে রেফার করে।
উপরে বর্ণিত শ্রোতাদের সাথে খেলতে গিয়ে আমরা দ্রুত বুঝতে পারি যে ব্যবহারকারীর দৃষ্টিভঙ্গি থেকে অবজেক্টগুলি "তাত্ক্ষণিকভাবে" সংগ্রহ করা হয়।
উইকার রেফারেন্সগুলির জন্য আমার কাছে একটি বাস্তব বিশ্বের ব্যবহার হ'ল যদি আপনার কাছে একটি একক, খুব বড় অবজেক্ট থাকে যা খুব কমই ব্যবহৃত হয়। যখন এটির প্রয়োজন হয় না তখন আপনি এটিকে স্মৃতিতে রাখতে চান না; তবে, যদি অন্য থ্রেডের একই অবজেক্টের প্রয়োজন হয় তবে আপনি সেগুলির মধ্যে দুটি স্মৃতিতেও চাইবেন না। আপনি কোথাও অবজেক্টের একটি দুর্বল রেফারেন্স এবং এটি ব্যবহার করার পদ্ধতিগুলিতে শক্ত রেফারেন্স রাখতে পারেন; যখন পদ্ধতিগুলি উভয় সমাপ্ত হয়, অবজেক্টটি সংগ্রহ করা হবে।
আমি "নতুন WeakHashMap ()" এর জন্য একটি গুগল কোড অনুসন্ধান করেছি।
আমি জিএনইউ ক্লাসপথ প্রকল্প থেকে একগুচ্ছ ম্যাচ পেয়েছি এবং
আপনি বিস্তৃত অবজেক্ট তৈরির জন্য রিসোর্স-ফ্রি ক্যাচিং প্রয়োগ করতে দুর্বলতাশ্যাপ ব্যবহার করতে পারেন।
তবে মনে রাখবেন যে পারস্পরিক পরিবর্তনযোগ্য বস্তু থাকা বাঞ্ছনীয় নয়। আমি এটি কোনও পাঠ্য-অনুসন্ধান ইঞ্জিনে ক্যোয়ারী ফলাফলগুলি (যা প্রায় 400 এমএস কার্যকর করতে) ক্যাশে করতে ব্যবহার করেছি, যা খুব কমই আপডেট হয়।