মধ্যে পার্থক্য কি java.lang.ref.WeakReference
এবং java.lang.ref.SoftReference
?
মধ্যে পার্থক্য কি java.lang.ref.WeakReference
এবং java.lang.ref.SoftReference
?
উত্তর:
দুর্বল রেফারেন্সগুলি বোঝার থেকে , ইথান নিকোলাস লিখেছেন:
দুর্বল রেফারেন্স
একটি দুর্বল রেফারেন্স , সহজ কথায় বলতে গেলে, এমন একটি রেফারেন্স যা কোনও বস্তুকে স্মৃতিতে রাখতে বাধ্য করার মতো শক্তিশালী নয়। দুর্বল রেফারেন্সগুলি আপনাকে আবর্জনা সংগ্রহকারী আপনার পক্ষে পুনরায় ব্যবহারযোগ্যতা নির্ধারণের দক্ষতা লাভ করার অনুমতি দেয়, তাই আপনাকে এটি নিজেই করতে হবে না। আপনি এর মতো দুর্বল রেফারেন্স তৈরি করেন:
WeakReference weakWidget = new WeakReference(widget);
এবং তারপরে কোডের অন্য কোথাও
weakWidget.get()
আসলWidget
অবজেক্টটি পেতে আপনি ব্যবহার করতে পারেন । অবশ্যই দুর্বল রেফারেন্সটি আবর্জনা সংগ্রহ রোধ করার পক্ষে যথেষ্ট শক্তিশালী নয়, সুতরাং আপনি খুঁজে পেতে পারেন (উইজেটের কোনও শক্ত রেফারেন্স না থাকলে) যাweakWidget.get()
হঠাৎ করে ফিরতে শুরু করেnull
।...
নরম রেফারেন্স
একটি সফট রেফারেন্স হুবহু দুর্বল রেফারেন্সের মতো, এটি বাদ দিয়ে যে বস্তুটিকে বোঝায় তা ফেলে দিতে কম আগ্রহী না। কেবলমাত্র দূর্বলভাবে পৌঁছনীয় এমন কোনও বস্তু (এর সবচেয়ে শক্তিশালী উল্লেখগুলি
WeakReferences
) পরবর্তী আবর্জনা সংগ্রহের চক্রের মধ্যে ফেলে দেওয়া হবে, তবে যে বস্তুটি নরমভাবে পৌঁছতে পারে তা সাধারণত কিছুক্ষণের জন্য স্থির থাকবে।
SoftReferences
এর চেয়ে আলাদাভাবে কোনও আচরণ করার প্রয়োজন হয় নাWeakReferences
, তবে অনুশীলনে নরমভাবে পৌঁছতে সক্ষম অবজেক্টগুলি সাধারণত দীর্ঘক্ষণ ধরে রাখা হয় যতক্ষণ স্মৃতি প্রচুর সরবরাহে থাকে। এটি তাদের ক্যাশের জন্য একটি দুর্দান্ত ভিত্তি তৈরি করে, যেমন উপরে বর্ণিত চিত্রের ক্যাশে, যেহেতু আপনি আবর্জনা সংগ্রাহককে উভয়ই উদ্বিগ্ন করতে পারবেন যে কীভাবে বস্তুগুলি পৌঁছনীয় (কোনও দৃ reac়রূপে পৌঁছনীয় বস্তু কখনই ক্যাশে থেকে সরানো যাবে না ) এবং এটি কতটা খারাপ it তারা গ্রাস করছে এমন স্মৃতি দরকার।
এবং পিটার কেসলার একটি মন্তব্যে যুক্ত করেছেন:
সান জেআরই সফটরিফারেন্সগুলিকে ওয়েক রেফারেন্স থেকে আলাদাভাবে আচরণ করে। যদি উপলব্ধ মেমোরিতে চাপ না থাকে তবে আমরা একটি সফট রেফারেন্স দ্বারা রেফারেন্স করা বস্তু ধরে রাখার চেষ্টা করি। একটি বিশদ: "-গ্রাহী" এবং "-রক্ষক" জেআরই'র জন্য নীতিটি আলাদা: -ক্লিয়েন্ট জেআরই গাদা সম্প্রসারণের পরিবর্তে সফ্টরফারেন্সগুলি সাফ করার পছন্দ করে আপনার পদচিহ্নকে ছোট রাখার চেষ্টা করে, যখন-সার্ভার জেআরই আপনার রাখার চেষ্টা করে সাফ সফ্টরাইফারেন্সের চেয়ে হ্যাপ (সম্ভব হলে) প্রসারিত করতে অগ্রাধিকার দিয়ে পারফরম্যান্স উচ্চ। সবার জন্য একই মাপ হবে না.
দুর্বল রেফারেন্সগুলি অধীর আগ্রহে সংগ্রহ করা হয়। যদি জিসি আবিষ্কার করে যে কোনও বস্তু দুর্বলভাবে পৌঁছতে পারে (কেবলমাত্র দুর্বল রেফারেন্সের মাধ্যমে পৌঁছতে পারে) তবে তা অবিলম্বে that বস্তুর দুর্বল উল্লেখগুলি সাফ করে দেবে। যেমন, তারা এমন কোনও সামগ্রীর জন্য একটি রেফারেন্স রাখার জন্য ভাল যার জন্য আপনার প্রোগ্রামটি "সম্পর্কিত তথ্য" কিছু রাখে (যেমন কোনও শ্রেণীর সম্পর্কে ক্যাশেড প্রতিবিম্বের তথ্য, বা কোনও সামগ্রীর জন্য একটি মোড়ক ইত্যাদি) রাখে ইত্যাদি makes বস্তুর সাথে এটি সম্পর্কিত হওয়ার পরে কোনও বুদ্ধি নেই এটি হ'ল জিসি-এড। দুর্বল রেফারেন্সটি সাফ হয়ে গেলে, এটি আপনার রেফারেন্সের কাতারে সজ্জিত হয়ে যায় যে আপনার কোডটি কোথাও পোল করে, এবং এটি সম্পর্কিত বিষয়গুলিও বাদ দেয়। এটি হ'ল আপনি কোনও অবজেক্ট সম্পর্কে অতিরিক্ত তথ্য রাখেন, তবে একবারে সেই বস্তুটি নির্দেশিত বস্তুটি চলে গেলে সেই তথ্যটির প্রয়োজন হয় না। আসলে, নির্দিষ্ট পরিস্থিতিতে আপনি WeakReferences সাবক্লাস করতে পারেন এবং WeakReferences সাবক্লাসের ক্ষেত্রগুলিতে অবজেক্ট সম্পর্কিত সম্পর্কিত অতিরিক্ত তথ্য রাখতে পারেন। ক্যানোনিকাল দৃষ্টান্তগুলি রাখার জন্য উইক রেফারেন্সের আর একটি সাধারণ ব্যবহার মানচিত্রের সাথে একত্রে।
অন্যদিকে সফটরিফারেন্সগুলি বাহ্যিক, পুনরুদ্ধারযোগ্য সংস্থানগুলি ক্যাশে করার জন্য ভাল কারণ জিসি সাধারণত সেগুলি সাফ করতে বিলম্ব করে। এটি গ্যারান্টিযুক্ত যদিও আউটঅফমিউরিরির ছোঁড়ার আগে সমস্ত সফ্টরাইফারেন্সগুলি সাফ হয়ে যায়, তাই তারা তাত্ত্বিকভাবে কোনও ওমকে [*] তৈরি করতে পারে না।
সাধারণ ব্যবহারের কেস উদাহরণটি কোনও ফাইল থেকে কোনও সামগ্রীর বিশদ ফর্ম রাখা। আপনি এমন একটি সিস্টেম বাস্তবায়ন করবেন যেখানে আপনি কোনও ফাইল লোড করবেন, এটি বিশ্লেষণ করবেন এবং বিশ্লেষণ উপস্থাপনের মূল অবজেক্টের জন্য একটি সফ্টরাইফারেন্স রাখবেন। পরের বার আপনার ফাইলের দরকার পড়ার পরে, আপনি এটি সফ্টরাইফারেন্সের মাধ্যমে পুনরুদ্ধার করার চেষ্টা করবেন। আপনি যদি এটি পুনরুদ্ধার করতে পারেন তবে আপনি নিজেকে অন্য লোড / পার্স এড়িয়ে গিয়েছিলেন এবং এর মধ্যে যদি জিসি এটি সাফ করে, আপনি এটি পুনরায় লোড করুন। এইভাবে, আপনি পারফরম্যান্স অপ্টিমাইজেশনের জন্য ফ্রি মেমরিটি ব্যবহার করেন তবে কোনও ওওমের ঝুঁকি নেবেন না।
এখন [*] এর জন্য। একটি সফট রেফারেন্স রাখা নিজের মধ্যে কোনও OOM তৈরি করতে পারে না। অন্যদিকে আপনি যদি ভুলভাবে সফটরিফারেন্সটিকে কোনও কার্যক্রমে WeakReferences ব্যবহার করার জন্য ব্যবহার করেন (যেমন, আপনি কোনও অবজেক্টের সাথে সম্পর্কিতভাবে কোনওরকম দৃ reference়ভাবে রেফারেন্স করেন এবং রেফারেন্স অবজেক্টটি সাফ হয়ে যাওয়ার পরে এটি বাতিল করে দেন), আপনি OOM হিসাবে চালিয়ে যেতে পারেন আপনার কোড যা রেফারেন্সকুইয়েটি পোল করে এবং সম্পর্কিত বিষয়গুলিকে বাতিল করে দেয় কোনও সময়মত ফ্যাশনে না চলতে পারে।
সুতরাং, সিদ্ধান্তটি ব্যবহারের উপর নির্ভর করে - যদি আপনি এমন তথ্য তৈরি করেন যা ব্যয়বহুল, তবে অন্য ডেটা থেকে পুনর্গঠনযোগ্য, নরম রেফারেন্সগুলি ব্যবহার করুন - আপনি যদি কিছু ডেটার একটি ক্যানোনিকাল উদাহরণের জন্য একটি রেফারেন্স রাখেন, বা আপনি চান কোনও অবজেক্টের "মালিকানা" না নিয়ে রেফারেন্স রাখুন (সুতরাং এটি GC'd হওয়া থেকে রোধ করবে), একটি দুর্বল রেফারেন্স ব্যবহার করুন।
WeakReference
হ'ল যে জায়গাগুলিতে এটি ব্যবহার করা উচিত সেখানে রেফারেন্সটি সুযোগের বাইরে চলে যাওয়ার পরে কিছু সময়ের জন্য কেউ বৈধ থাকতে পারে, তবে এটি কাম্য নয়।
WeakReference
। : বিবরণাদি দেখুন stackoverflow.com/a/46291143/632951
জাভাতে ; শক্তিশালী থেকে দুর্বলতম স্থানে অর্ডার করুন: শক্তিশালী, নরম, দুর্বল এবং ফ্যান্টম
একটি শক্তিশালী রেফারেন্স হ'ল একটি সাধারণ রেফারেন্স যা জিসির দ্বারা সংগ্রহ করা থেকে রেফারেন্স করা বস্তুকে সুরক্ষা দেয়। অর্থাৎ কখনও আবর্জনা সংগ্রহ করে না।
একটি নরম রেফারেন্স আবর্জনা সংগ্রাহক সংগ্রহের জন্য যোগ্য, তবে সম্ভবত এটির সংগ্রহ করা হবে না যতক্ষণ না এর স্মৃতিশক্তি প্রয়োজন হয়। অর্থাৎ আবর্জনা সংগ্রহ আগে OutOfMemoryError
।
একটি দুর্বল রেফারেন্স এমন একটি রেফারেন্স যা জিসির দ্বারা সংগ্রহ থেকে কোনও রেফারেন্স করা অবজেক্টকে রক্ষা করে না। অর্থাত্ কোনও মজবুত বা সফট রেফারেন্স যখন আবর্জনা সংগ্রহ করে না।
একটি ফ্যানটম রেফারেন্স হ'ল কোনও অবজেক্টের রেফারেন্সটি চূড়ান্ত হওয়ার পরে ভ্যান্টেমালি রেফারেন্স করা হয় তবে এর বরাদ্দ হওয়া মেমোরি পুনরুদ্ধার করার আগে।
সাদৃশ্য: ধরুন একটি জেভিএম একটি কিংডম, অবজেক্ট রাজ্যের একজন রাজা এবং জিসি রাজ্যের আক্রমণকারী যিনি রাজা (বস্তু) কে হত্যা করার চেষ্টা করেন।
until memory is available
মানে হয় না। মানে is eligible for collection by garbage collector, but probably won't be collected until its memory is needed for another use
?
দুর্বল রেফারেন্স http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ref/WeakReferences.html
মূলনীতি: weak reference
আবর্জনা সংগ্রহের সাথে সম্পর্কিত। সাধারণত, এক বা একাধিক বস্তু reference
আবর্জনা সংগ্রহের জন্য যোগ্য হবে না।
উপরোক্ত নীতিটি প্রযোজ্য নয় যখন তা হয় weak reference
। যদি কোনও বস্তুর অন্য অবজেক্টগুলির সাথে কেবল দুর্বল রেফারেন্স থাকে তবে তার আবর্জনা সংগ্রহের জন্য এটি প্রস্তুত।
আসুন নীচের উদাহরণটি দেখুন: আমাদের Map
অবজেক্টগুলির সাথে একটি রয়েছে যেখানে কী কোনও বস্তুর রেফারেন্স হয়।
import java.util.HashMap;
public class Test {
public static void main(String args[]) {
HashMap<Employee, EmployeeVal> aMap = new
HashMap<Employee, EmployeeVal>();
Employee emp = new Employee("Vinoth");
EmployeeVal val = new EmployeeVal("Programmer");
aMap.put(emp, val);
emp = null;
System.gc();
System.out.println("Size of Map" + aMap.size());
}
}
এখন, প্রোগ্রামটি কার্যকর করার সময় আমরা তৈরি করেছি emp = null
। Map
হোল্ডিং কী-এর মত এটা কোন অর্থে এখানে তোলে null
। উপরের পরিস্থিতিতে বস্তুটি আবর্জনা সংগ্রহ করা নয়।
WeakHashMap
WeakHashMap
প্রবেশের একটি যেখানেkey-to-value mappings
) অপসারণ করা হবে যখন এগুলি থেকে আর পুনরুদ্ধার করা আর সম্ভব হয় নাMap
।
উপরের উদাহরণটি উইকহ্যাশম্যাপের সাথে একইভাবে দেখানো যাক
import java.util.WeakHashMap;
public class Test {
public static void main(String args[]) {
WeakHashMap<Employee, EmployeeVal> aMap =
new WeakHashMap<Employee, EmployeeVal>();
Employee emp = new Employee("Vinoth");
EmployeeVal val = new EmployeeVal("Programmer");
aMap.put(emp, val);
emp = null;
System.gc();
int count = 0;
while (0 != aMap.size()) {
++count;
System.gc();
}
System.out.println("Took " + count
+ " calls to System.gc() to result in weakHashMap size of : "
+ aMap.size());
}
}
আউটপুট: টুক 20 calls to System.gc()
ফলেaMap size
0: এর ।
WeakHashMap
অন্যান্য Map
ক্লাসের মতো শক্তিশালী রেফারেন্স নয়, কীগুলিতে কেবল দুর্বল রেফারেন্স রয়েছে । আপনি যখন ব্যবহার করেছেন তবে মান বা কীটি দৃ strongly়ভাবে উল্লেখ করা হচ্ছে এমন পরিস্থিতিতে রয়েছে WeakHashMap
। এটি WeakReferences এ বস্তু মোড়ানো দ্বারা এড়ানো যেতে পারে ।
import java.lang.ref.WeakReference;
import java.util.HashMap;
public class Test {
public static void main(String args[]) {
HashMap<Employee, EmployeeVal> map =
new HashMap<Employee, EmployeeVal>();
WeakReference<HashMap<Employee, EmployeeVal>> aMap =
new WeakReference<HashMap<Employee, EmployeeVal>>(
map);
map = null;
while (null != aMap.get()) {
aMap.get().put(new Employee("Vinoth"),
new EmployeeVal("Programmer"));
System.out.println("Size of aMap " + aMap.get().size());
System.gc();
}
System.out.println("Its garbage collected");
}
}
নরম রেফারেন্স।
Soft Reference
কিছুটা শক্তিশালী যে দুর্বল রেফারেন্স। নরম রেফারেন্স ময়লা আবর্জনা সংগ্রহের অনুমতি দেয়, তবে আবর্জনা সংগ্রহকারীকে কেবলমাত্র অন্য কোনও বিকল্প না থাকলে তা সাফ করার জন্য অনুরোধ করেন।
আবর্জনা সংগ্রাহক দুর্বলভাবে পৌঁছনীয় জিনিসগুলির সাথে আক্রমণাত্মকভাবে নরমভাবে পৌঁছনীয় জিনিসগুলি সংগ্রহ করে না - পরিবর্তে এটি কেবল নরমভাবে পৌঁছনীয় বস্তুগুলি সংগ্রহ করে যদি সত্যিকারের স্মৃতিটির "প্রয়োজন" হয়। নরম রেফারেন্সগুলি আবর্জনা সংগ্রহকারীকে বলার একটি উপায়, "যতক্ষণ স্মৃতি খুব বেশি আঁকড়ে না থাকে ততক্ষণ আমি এই বিষয়টিকে চারপাশে রাখতে চাই But তবে স্মৃতি যদি সত্যিই আঁটসাঁট হয়ে যায়, তবে এগিয়ে যান এবং সংগ্রহ করুন এবং আমি চুক্তি করব সাথে। " আবর্জনা সংগ্রহকারীকে নিক্ষেপ করার আগে সমস্ত নরম রেফারেন্স পরিষ্কার করতে হবে OutOfMemoryError
।
NullPointerException
এ aMap.get().put(...)
।
WeakHashMap
(যেহেতু এটিই প্রথমটি যা দুর্বল আচরণ প্রদর্শন করছে)। "WeakHashMap" এর জন্য ডকটির দিকে তাকান: "An entry in a WeakHashMap will automatically be removed when its key is no longer in ordinary use. "
WeakHashMap ব্যবহারের সম্পূর্ণ পয়েন্টটি হ'ল আপনাকে WeakReferences ঘোষণা / পাস-ইন করতে হবে না; WeakHashMap অভ্যন্তরীণভাবে এটি আপনার জন্য করে। docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html
WeakHashMap
ক্রিয়াকলাপের আরেকটি উদাহরণের সাথে, উদাহরণস্বরূপ অ্যাপটি দেখায় যে কেবল আবর্জনা-সংগ্রহের সম্পাদনের পরে কীভাবে এন্ট্রিগুলি সরানো হয়, প্রশ্নের উত্তরটি আমার উত্তর দেখুন , WeakHashMap কি ক্রমবর্ধমান, বা এটি আবর্জনা কীগুলি পরিষ্কার করে দেয়? ।
একটি নরম রেফারেন্স এবং একটি দুর্বল রেফারেন্সের মধ্যে একমাত্র আসল পার্থক্য
ময়লা আবর্জনা সংগ্রাহক নরমভাবে পৌঁছনীয় বস্তুটি পুনরায় দাবি করতে হবে কিনা তা নির্ধারণের জন্য অ্যালগরিদম ব্যবহার করে তবে সর্বদা একটি দুর্বলভাবে পৌঁছাতে সক্ষম অবজেক্টটিকে পুনরায় দাবি করে।
SoftReference
ক্যাশে জন্য ডিজাইন করা হয়েছে। যখন এটি খুঁজে পাওয়া যায় যে WeakReference
কোনও অন্যথায় পৌঁছনীয় না এমন কোনও বস্তুর উল্লেখ করা হয়, তবে তা অবিলম্বে সাফ হয়ে যাবে। SoftReference
যেমন আছে তেমন রেখে দেওয়া যেতে পারে। সাধারণত মুক্ত মেমরির পরিমাণ এবং এটি সাফ হওয়া উচিত কিনা তা নির্ধারণের জন্য সর্বশেষ ব্যবহৃত সময় সম্পর্কিত কিছু অ্যালগরিদম রয়েছে। বর্তমান সান অ্যালগরিদমটি রেফারেন্সটি সাফ করতে হয় যদি এটি জাভা হিপটিতে মেগাবাইট মেমরি ফ্রি হিসাবে সেকেন্ডে ব্যবহার না করা হয় (কনফিগারযোগ্য, সার্ভার হটস্পট চেক সর্বাধিক সম্ভব হ্যাপের বিপরীতে সেট করা আছে -Xmx
)। SoftReference
গুলি OutOfMemoryError
নিক্ষেপ করার আগে সাফ হয়ে যাবে , অন্যথায় যদি না পারা যায় unless
java.lang
। প্রতিশব্দ এরকম অপব্যবহার কারও ভাল করছে না।
এই নিবন্ধটি শক্তিশালী, নরম, দুর্বল এবং ভৌতিক রেফারেন্সগুলি বোঝার জন্য অত্যন্ত সহায়ক হতে পারে।
আপনাকে একটি সংক্ষিপ্ত বিবরণ দিতে,
আপনার যদি কেবল দুর্বল রেফারেন্স থাকে কোনও অবজেক্টের প্রতি থাকে (কোনও শক্তিশালী রেফারেন্স ছাড়াই), তবে অবজেক্টটি GC দ্বারা পরের জিসি চক্রটিতে পুনরুদ্ধার করা হবে।
আপনার যদি কেবল কোনও জিনিসের নরম রেফারেন্স থাকে (কোনও শক্তিশালী রেফারেন্স ছাড়াই), তবে জেভি দ্বারা স্মৃতিশক্তি শেষ হয়ে গেলে কেবল এই বিষয়টিকে জিসি দ্বারা পুনরুদ্ধার করা হবে।
সুতরাং আপনি এটি বলতে পারেন, শক্তিশালী উল্লেখগুলির চূড়ান্ত শক্তি রয়েছে (কখনই জিসি দ্বারা সংগ্রহ করা যায় না)
নরম উল্লেখগুলি শক্তিশালী দুর্বল রেফারেন্সগুলির চেয়ে (কারণ তারা জিসিএম মেমরিটি শেষ না হওয়া পর্যন্ত জিসি চক্র থেকে বাঁচতে পারে)
দুর্বল রেফারেন্সগুলি নরম রেফারেন্সগুলির তুলনায় আরও কম শক্তিশালী (কারণ তারা কোনও জিসি চক্রকে ছাড় দিতে পারে না এবং বস্তুর অন্য কোনও শক্ত রেফারেন্স না থাকলে পুনরুদ্ধার করা হবে)।
রেস্তোঁরা সাদৃশ্য
এখন আপনি যদি একজন শক্তিশালী গ্রাহক (দৃ strong় রেফারেন্সের সাথে সমান) হন তবে এমনকি যদি কোনও নতুন গ্রাহক রেস্তোরাঁয় আসে বা যা এখনও সুখী হয় তবে আপনি কখনই আপনার টেবিলটি ছাড়বেন না (গাদা স্মৃতির অঞ্চল)। ওয়েটারের রেস্তোঁরা ছেড়ে যাওয়ার জন্য আপনাকে বলার (বা এমনকি আপনাকে অনুরোধ করার) অধিকার নেই।
আপনি যদি কোনও নরম গ্রাহক হন (নরম রেফারেন্সের সাথে সাদৃশ্যপূর্ণ), তবে যদি নতুন কোনও গ্রাহক রেস্তোঁরায় আসে তবে ওয়েটার আপনাকে নতুন গ্রাহককে থাকার জন্য অন্য কোনও খালি টেবিল না রেখে টেবিলে ছেড়ে যেতে বলবে না। (অন্য কথায় ওয়েটার আপনাকে কেবল টেবিলটি ছেড়ে যেতে বলবে যদি কোনও নতুন গ্রাহক প্রবেশ করেন এবং এই নতুন গ্রাহকের জন্য অন্য কোনও টেবিল অবশিষ্ট নেই)
আপনি যদি কোনও দুর্বল গ্রাহক (দুর্বল রেফারেন্সের সাথে সাদৃশ্য) হন, তবে ওয়েটার তার ইচ্ছামতো (যে কোনও সময়) আপনাকে রেস্তোঁরা ছাড়তে চাইতে পারেন: পি
প্রতি ডক , আলগা WeakReferences আবশ্যক একটি চলমান জিসি দ্বারা পরিষ্কার করা।
প্রতি ডক , আলগা SoftReferences আবশ্যক হলে OOM kills সামনে সাফ করা ফেলে দেওয়া হয়।
এটাই আসল পার্থক্য। বাকি সমস্ত কিছুই চুক্তির অংশ নয়। (আমি ধরে নিলাম সর্বশেষ নথিগুলি চুক্তিবদ্ধ)
সফটরিফারেন্সগুলি দরকারী।মেমরি-সংবেদনশীল ক্যাশে উইক রেফারেন্সগুলি নয়, সফ্টরিফারেন্স ব্যবহার করে।
weak_ref.get()
। এটি যখন null
, আপনি জানতে পারবেন যে এই সময়ের মধ্যে, জিসি দৌড়েছিল।
WeakReferences এর ভুল ব্যবহার হিসাবে , তালিকা অন্তহীন:
অগ্রাধিকার -২ সফটরিফারেন্স বাস্তবায়নের জন্য একটি লাউস হ্যাক যেমন আপনাকে একটি লিখতে হবে না তবুও এটি প্রত্যাশার মতো কাজ করে না কারণ অতিরিক্ত স্মৃতিশক্তি থাকা সত্ত্বেও প্রতিটি জিসি রানে ক্যাশে সাফ হয়ে যায়। ফেইলগুলির জন্য https://stackoverflow.com/a/3243242/632951 দেখুন । (তদতিরিক্ত, যদি আপনার ক্যাশের অগ্রাধিকারের 2 স্তরের বেশি প্রয়োজন হয় তবে আপনার এখনও এটির জন্য সত্যিকারের লাইব্রেরি লাগবে না))
একটি বিদ্যমান শ্রেণীর কোনও অবজেক্টের সাথে ডেটা সংযুক্ত করার জন্য একটি লাউস হ্যাক, তবুও যখন আপনার জিসি আপনার দুর্বলতাগুলি তৈরি করার পরে বিরতি নেওয়ার সিদ্ধান্ত নেয় তখন এটি একটি মেমরি ফাঁস (আউটআফমিউরিওর) তৈরি করে। তদুপরি, এটি কুৎসিতের বাইরেও রয়েছে: টিউপলস ব্যবহার করা আরও ভাল উপায়।
একটি বিদ্যমান শ্রেণীর কোনও অবজেক্টের সাথে ডেটা সংযুক্ত করার জন্য একটি লাউস হ্যাক, যেখানে শ্রেণিটিতে নিজেকে অ সাব-ক্লাসেবলযোগ্য করে তুলতে স্নায়ু রয়েছে এবং এটি আপনাকে কল করতে হবে এমন একটি বিদ্যমান ফাংশন কোডে ব্যবহৃত হয় । এই জাতীয় ক্ষেত্রে, সঠিক সমাধানটি হয় হয় ক্লাসটি সম্পাদনা করে এটিকে সাবক্লাসেবল করে তোলা, বা ফাংশনটি সম্পাদনা করে ক্লাসের পরিবর্তে ইন্টারফেস নেওয়া, বা বিকল্প ফাংশন ব্যবহার করা।
equals()
কেবলমাত্র অবজেক্টের পরিচয়? নরম রেফারেন্সগুলি সেখানে অপব্যয়ের মতো মনে হয়, কারণ একবার কোনও মূল বস্তু আর দৃ strongly়রূপে পৌঁছনীয় না হয়ে গেলে, আর কেউ কখনই সেই ম্যাপিংটি দেখবে না।
জাভাতে ছয় প্রকারের বস্তুর পুনঃব্যবহারযোগ্যতা বলেছেন:
আরও তথ্যের জন্য: https://www.artima.com/insidejvm/ed2/gc16.html «ধস
একজনকে সচেতন হওয়া উচিত যে কেবলমাত্র দুর্বল রেফারেন্স (গুলি) থাকলে দুর্বলভাবে রেফারেন্স করা বস্তুটি সংগ্রহ করা হবে। যদি এটির মতো একটি শক্তিশালী রেফারেন্স থাকে তবে এটি যতগুলি দুর্বল রেফারেন্সই থাকুক না কেন তা সংগ্রহ করা যায় না।
একটি অ-অ্যাকশন মেমরি ব্যবহারের দিকটি জানাতে, আমি প্রোগ্রামের শেষ অবধি ধরে রেখে ভারী জিনিসগুলির সাথে ভারী লোডের অধীনে স্ট্রং, সফট, দুর্বল এবং ফ্যান্টম রেফারেন্সগুলির সাথে একটি পরীক্ষা করেছিলাম। তারপরে হিপ ব্যবহার এবং জিসি আচরণ পর্যবেক্ষণ করা হয় । এই মেট্রিকগুলি কেস ভিত্তিতে কেস পরিবর্তিত হতে পারে তবে অবশ্যই উচ্চ স্তরের বোঝা দেয়। নীচে অনুসন্ধান রয়েছে।
ভারী বোঝার অধীনে গাদা এবং জিসি আচরণ
আপনি এই পরীক্ষার জন্য গভীরতার গ্রাফ, পরিসংখ্যান, পর্যবেক্ষণ আরও পেতে পারেন ।
WeakReference : (ছোটখাট বা সম্পূর্ণ) যে বস্তু শুধুমাত্র স্বাস্থ্যহীন রেফারেন্সড হয় যে জিসি চক্র এ সংগ্রহ করা হয়।
সফট রেফারেন্স: যখন কেবলমাত্র নরমভাবে রেফারেন্সযুক্ত জিনিসগুলি সংগ্রহ করা হয় তার উপর নির্ভর করে:
-এক্সএক্স: সফটআরএফএলএলআরআলপিআলসিএমএসপিএমএম = এন পতাকা (ডিফল্ট মান 1000, ওরফে 1 সেকেন্ড)
স্তূপে মুক্ত মেমরির পরিমাণ।
উদাহরণ:
তারপরে কেবল সফটরিফারেন্স দ্বারা রেফারেন্সযুক্ত অবজেক্টটি যদি শেষ বার অ্যাক্সেস করার পরে 10 সেকেন্ডের বেশি হয় তবে সংগ্রহ করা হবে।