জাফায় সফটরিফারেন্স এবং উইক রেফারেন্সের মধ্যে পার্থক্য কী?


810

মধ্যে পার্থক্য কি java.lang.ref.WeakReferenceএবং java.lang.ref.SoftReference?


9
সফটফেরেন্সগুলি হ'ল ধরণের (সত্যিকারের নয় তবে আলোচনার জন্য) উইক রেফারেন্সগুলি সাধারণত যখন জেভিএম মনে করে যে এটি স্মৃতিশক্তি থেকে দূরে রয়েছে তখন সংগ্রহ করা হয়।
অজিত গঙ্গা

5
অজিৎগঙ্গা, জিসি চালানোর সময় সর্বদা লুজ দুর্বল রেফগুলি সংগ্রহ করা হয়। দেখুন stackoverflow.com/a/46291143/632951
Pacerier

উত্তর:


926

দুর্বল রেফারেন্সগুলি বোঝার থেকে , ইথান নিকোলাস লিখেছেন:

দুর্বল রেফারেন্স

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

WeakReference weakWidget = new WeakReference(widget);

এবং তারপরে কোডের অন্য কোথাও weakWidget.get()আসল Widgetঅবজেক্টটি পেতে আপনি ব্যবহার করতে পারেন । অবশ্যই দুর্বল রেফারেন্সটি আবর্জনা সংগ্রহ রোধ করার পক্ষে যথেষ্ট শক্তিশালী নয়, সুতরাং আপনি খুঁজে পেতে পারেন (উইজেটের কোনও শক্ত রেফারেন্স না থাকলে) যা weakWidget.get()হঠাৎ করে ফিরতে শুরু করেnull

...

নরম রেফারেন্স

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

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

এবং পিটার কেসলার একটি মন্তব্যে যুক্ত করেছেন:

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


7
আর কোনও উপলভ্য পোস্ট করুন না, আপনি এটি ওয়েবেব্যাক মেশিনে খুঁজে পেতে পারেন: web.archive.org/web/20061130103858/http://weblogs.java.net/blog/…
riccardo.tasso

এবার, সংরক্ষণাগারটি আর উপলভ্য নয়
user1506104

209

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

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

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

এখন [*] এর জন্য। একটি সফট রেফারেন্স রাখা নিজের মধ্যে কোনও OOM তৈরি করতে পারে না। অন্যদিকে আপনি যদি ভুলভাবে সফটরিফারেন্সটিকে কোনও কার্যক্রমে WeakReferences ব্যবহার করার জন্য ব্যবহার করেন (যেমন, আপনি কোনও অবজেক্টের সাথে সম্পর্কিতভাবে কোনওরকম দৃ reference়ভাবে রেফারেন্স করেন এবং রেফারেন্স অবজেক্টটি সাফ হয়ে যাওয়ার পরে এটি বাতিল করে দেন), আপনি OOM হিসাবে চালিয়ে যেতে পারেন আপনার কোড যা রেফারেন্সকুইয়েটি পোল করে এবং সম্পর্কিত বিষয়গুলিকে বাতিল করে দেয় কোনও সময়মত ফ্যাশনে না চলতে পারে।

সুতরাং, সিদ্ধান্তটি ব্যবহারের উপর নির্ভর করে - যদি আপনি এমন তথ্য তৈরি করেন যা ব্যয়বহুল, তবে অন্য ডেটা থেকে পুনর্গঠনযোগ্য, নরম রেফারেন্সগুলি ব্যবহার করুন - আপনি যদি কিছু ডেটার একটি ক্যানোনিকাল উদাহরণের জন্য একটি রেফারেন্স রাখেন, বা আপনি চান কোনও অবজেক্টের "মালিকানা" না নিয়ে রেফারেন্স রাখুন (সুতরাং এটি GC'd হওয়া থেকে রোধ করবে), একটি দুর্বল রেফারেন্স ব্যবহার করুন।


14
দুর্বল বস্তুগুলি কখন ব্যবহৃত হবে তার ব্যাখ্যার জন্য বিশেষত কার্যকর।
জ্যাক BeNimble

ক এর যথাযথ ব্যবহার সম্পর্কে একটি মূল বিষয় WeakReferenceহ'ল যে জায়গাগুলিতে এটি ব্যবহার করা উচিত সেখানে রেফারেন্সটি সুযোগের বাইরে চলে যাওয়ার পরে কিছু সময়ের জন্য কেউ বৈধ থাকতে পারে, তবে এটি কাম্য নয়।
সুপারক্যাট

আমি বুঝতে চেষ্টা করছি WeakHashMap এর ব্যবহার কী তা যদি সর্বদা এর মূল মান অবজেক্টের প্রতি দুর্বল রেফারেন্স তৈরি করে?

@ সুপের্যাট, জিসি রানগুলি পর্যবেক্ষণ করার জন্য কেবলমাত্র একটি সঠিক ব্যবহার রয়েছে WeakReference। : বিবরণাদি দেখুন stackoverflow.com/a/46291143/632951
Pacerier

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

155

জাভাতে ; শক্তিশালী থেকে দুর্বলতম স্থানে অর্ডার করুন: শক্তিশালী, নরম, দুর্বল এবং ফ্যান্টম

একটি শক্তিশালী রেফারেন্স হ'ল একটি সাধারণ রেফারেন্স যা জিসির দ্বারা সংগ্রহ করা থেকে রেফারেন্স করা বস্তুকে সুরক্ষা দেয়। অর্থাৎ কখনও আবর্জনা সংগ্রহ করে না।

একটি নরম রেফারেন্স আবর্জনা সংগ্রাহক সংগ্রহের জন্য যোগ্য, তবে সম্ভবত এটির সংগ্রহ করা হবে না যতক্ষণ না এর স্মৃতিশক্তি প্রয়োজন হয়। অর্থাৎ আবর্জনা সংগ্রহ আগে OutOfMemoryError

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

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

সূত্র

সাদৃশ্য: ধরুন একটি জেভিএম একটি কিংডম, অবজেক্ট রাজ্যের একজন রাজা এবং জিসি রাজ্যের আক্রমণকারী যিনি রাজা (বস্তু) কে হত্যা করার চেষ্টা করেন।

  • কিং যখন স্ট্রং হয় , জিসি তাকে মেরে ফেলতে পারে না।
  • কিং যখন নরম হয় , জিসি তাকে আক্রমণ করে তবে কিং উপলব্ধি না পাওয়া পর্যন্ত সুরক্ষা দিয়ে রাজ্য শাসন করে।
  • কিং যখন দুর্বল হয় , তখন জিসি তাকে আক্রমণ করে তবে সুরক্ষা ছাড়াই রাজ্য শাসন করে।
  • কিং যখন ফ্যান্টম হয় , জিসি ইতিমধ্যে তাকে হত্যা করেছিল তবে রাজা তার আত্মার মাধ্যমে উপলব্ধ।

7
নরম রেফারেন্স ... 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?
টুলমেকারস্টেভ

1
হ্যাঁ, আবর্জনা সংগ্রাহক স্মৃতি উপলব্ধ না হওয়া পর্যন্ত রেফারেন্স সংগ্রহ করবেন না।
প্রেমরাজ

2
আমার কাছ থেকে খুব বেশি ব্লেড ব্লে +1 ছাড়াই সহজ সরল স্টাফ পছন্দ হয়েছে!
আদেলিন

3
উদ্ভাবনী উদাহরণ সহ দুর্দান্ত সংক্ষিপ্তসার
রবীন্দ্র বাবু


77

দুর্বল রেফারেন্স 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 = nullMapহোল্ডিং কী-এর মত এটা কোন অর্থে এখানে তোলে 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


5
আপনি একটি পেতে পারেন NullPointerExceptionaMap.get().put(...)
xehpuk

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

@Tiago। না। সম্ভবত "প্রথম উদাহরণ" দ্বারা আপনি উদাহরণটিকে উল্লেখ করছেন 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
ToolmakerSteve

দুর্বল হ্যাশম্যাপ আকার: 0 এর দ্বিতীয় ফলাফলটির ফলাফল হিসাবে System.gc () এ 0 কল করেছেন?
আদেলিন

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

50

একটি নরম রেফারেন্স এবং একটি দুর্বল রেফারেন্সের মধ্যে একমাত্র আসল পার্থক্য

ময়লা আবর্জনা সংগ্রাহক নরমভাবে পৌঁছনীয় বস্তুটি পুনরায় দাবি করতে হবে কিনা তা নির্ধারণের জন্য অ্যালগরিদম ব্যবহার করে তবে সর্বদা একটি দুর্বলভাবে পৌঁছাতে সক্ষম অবজেক্টটিকে পুনরায় দাবি করে।


@ এ্যাটোরাস, সামির : আমি এই উত্তরে এখানে প্রসারিত stackoverflow.com/a/46291143/632951
Pacerier

25

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


9
তবে অ্যান্ড্রয়েডে এটি ক্যাশে বিকাশকারীদের
and Android.com/references/java/lang/ref/…

4
@ ডক্টরড্রাইভ টিবিএফ প্রশ্নটি জাভা সম্পর্কে ছিল, দলভিক নয়! :
পি

2
@ ইয়ারোস্লাভ মাইটকলিক, সত্যই, অ্যান্ড্রয়েড যদি কোনও শ্রেণীর আচরণের পুনর্লিখন করতে চায় তবে তার নিজের নামস্থানটি ব্যবহার করা উচিত, নয় java.lang। প্রতিশব্দ এরকম অপব্যবহার কারও ভাল করছে না।
পেসারিয়ার

9

এই নিবন্ধটি শক্তিশালী, নরম, দুর্বল এবং ভৌতিক রেফারেন্সগুলি বোঝার জন্য অত্যন্ত সহায়ক হতে পারে।


আপনাকে একটি সংক্ষিপ্ত বিবরণ দিতে,

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

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


সুতরাং আপনি এটি বলতে পারেন, শক্তিশালী উল্লেখগুলির চূড়ান্ত শক্তি রয়েছে (কখনই জিসি দ্বারা সংগ্রহ করা যায় না)

নরম উল্লেখগুলি শক্তিশালী দুর্বল রেফারেন্সগুলির চেয়ে (কারণ তারা জিসিএম মেমরিটি শেষ না হওয়া পর্যন্ত জিসি চক্র থেকে বাঁচতে পারে)

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


রেস্তোঁরা সাদৃশ্য

  • ওয়েটার - জিসি
  • আপনি - গাদা মধ্যে বস্তু
  • রেস্তোঁরা এলাকা / স্থান - গাদা জায়গা
  • নতুন গ্রাহক - নতুন বস্তু যা রেস্তোঁরায় টেবিল চায়

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

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

আপনি যদি কোনও দুর্বল গ্রাহক (দুর্বল রেফারেন্সের সাথে সাদৃশ্য) হন, তবে ওয়েটার তার ইচ্ছামতো (যে কোনও সময়) আপনাকে রেস্তোঁরা ছাড়তে চাইতে পারেন: পি


7

একমাত্র বাস্তব পার্থক্য

প্রতি ডক , আলগা WeakReferences আবশ্যক একটি চলমান জিসি দ্বারা পরিষ্কার করা।

প্রতি ডক , আলগা SoftReferences আবশ্যক হলে OOM kills সামনে সাফ করা ফেলে দেওয়া হয়।

এটাই আসল পার্থক্য। বাকি সমস্ত কিছুই চুক্তির অংশ নয়। (আমি ধরে নিলাম সর্বশেষ নথিগুলি চুক্তিবদ্ধ)

সফটরিফারেন্সগুলি দরকারী।মেমরি-সংবেদনশীল ক্যাশে উইক রেফারেন্সগুলি নয়, সফ্টরিফারেন্স ব্যবহার করে।


উইক রেফারেন্সের একমাত্র যথাযথ ব্যবহার হ'ল জিসি রান পালন করা। আপনি এটি একটি নতুন WeakReferences তৈরি করে করেন যার অবজেক্ট অবিলম্বে সুযোগের বাইরে চলে যায়, তারপরে শূন্যতার বাইরে যাওয়ার চেষ্টা করুন weak_ref.get()। এটি যখন null, আপনি জানতে পারবেন যে এই সময়ের মধ্যে, জিসি দৌড়েছিল।

WeakReferences এর ভুল ব্যবহার হিসাবে , তালিকা অন্তহীন:

  • অগ্রাধিকার -২ সফটরিফারেন্স বাস্তবায়নের জন্য একটি লাউস হ্যাক যেমন আপনাকে একটি লিখতে হবে না তবুও এটি প্রত্যাশার মতো কাজ করে না কারণ অতিরিক্ত স্মৃতিশক্তি থাকা সত্ত্বেও প্রতিটি জিসি রানে ক্যাশে সাফ হয়ে যায়। ফেইলগুলির জন্য https://stackoverflow.com/a/3243242/632951 দেখুন । (তদতিরিক্ত, যদি আপনার ক্যাশের অগ্রাধিকারের 2 স্তরের বেশি প্রয়োজন হয় তবে আপনার এখনও এটির জন্য সত্যিকারের লাইব্রেরি লাগবে না))

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

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


একটি ক্যাশে যেখানে কী টাইপগুলি equals()কেবলমাত্র অবজেক্টের পরিচয়? নরম রেফারেন্সগুলি সেখানে অপব্যয়ের মতো মনে হয়, কারণ একবার কোনও মূল বস্তু আর দৃ strongly়রূপে পৌঁছনীয় না হয়ে গেলে, আর কেউ কখনই সেই ম্যাপিংটি দেখবে না।
হাইকম্যান্ডার 4

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

উইন্ডোফের অ্যাসিঙ্কটাস্কে উইক রেফারেন্সটি কোথায় ব্যবহার করা যায় তার একটি ভাল উদাহরণ - প্রসঙ্গের উদাহরণটি রাখার জন্য। এইভাবে যদি প্রসঙ্গটি মারা যায় (যদি ক্রিয়াকলাপ - স্ক্রিন রোটেশন ইত্যাদি), অ্যাসিঙ্কটাস এর কোনও দৃ reference় উল্লেখ নেই, এবং তাই এটি আবর্জনা সংগ্রহ করা যেতে পারে। পরীক্ষা করে দেখুন youtu.be/...
ডেভিড Refaeli

3

জাভাতে ছয় প্রকারের বস্তুর পুনঃব্যবহারযোগ্যতা বলেছেন:

  1. শক্তিশালী লাই অ্যাক্সেসযোগ্য অবজেক্টস - জিসি এই ধরণের অবজেক্টটি সংগ্রহ করবে না ( অধিষ্ঠিত স্মৃতি পুনরায় দাবি করবে )) এগুলি রুট নোড বা অন্য দৃ strongly়রূপে পৌঁছনীয় বস্তুর মাধ্যমে (যেমন স্থানীয় ভেরিয়েবল, বর্গ ভেরিয়েবল, উদাহরণ ভেরিয়েবল ইত্যাদির মাধ্যমে) পৌঁছানো যায় )
  2. সফট লী অ্যাক্সেসযোগ্য অবজেক্টস - জিসি মেমরির কনটেন্টের উপর নির্ভর করে এই জাতীয় অবজেক্টটি সংগ্রহ করার চেষ্টা করতে পারে। এগুলি এক বা একাধিক নরম রেফারেন্স অবজেক্টের মাধ্যমে মূল থেকে পৌঁছনীয়
  3. দুর্বল লাই অ্যাক্সেসযোগ্য অবজেক্টস - জিসিকে অবশ্যই এই ধরণের অবজেক্ট সংগ্রহ করতে হবে । এগুলি এক বা একাধিক দুর্বল রেফারেন্স অবজেক্টের মাধ্যমে মূল থেকে পৌঁছনীয়
  4. পুনরুত্থানযোগ্য অবজেক্টস - জিসি ইতিমধ্যে এই বিষয়গুলি সংগ্রহ করার প্রক্রিয়াধীন রয়েছে। তবে তারা কোনও এক রাজ্যে ফিরে যেতে পারে - কিছু ফাইনালাইজার কার্যকর করে শক্তিশালী / সফট / দুর্বল
  5. ফ্যান্টম ল্য অ্যাক্সেসযোগ্য অবজেক্ট - জিসি ইতিমধ্যে এই বিষয়গুলি সংগ্রহ করার প্রক্রিয়াধীন রয়েছে এবং কোনও চূড়ান্তকরণকারীর দ্বারা পুনরুত্থানযোগ্য না হওয়ার দৃ .় সংকল্প করেছে (যদি এটি নিজেই একটি চূড়ান্তকরণ () পদ্ধতি ঘোষণা করে তবে তার চূড়ান্তকরণটি চালানো হবে) । এগুলি এক বা একাধিক ভৌতিক রেফারেন্স অবজেক্টের মাধ্যমে মূল থেকে পৌঁছনীয়
  6. অ্যাক্সেসযোগ্য অবজেক্ট - কোনও বস্তু দৃ ,় , মৃদু, দুর্বল, বা ভ্যান্টামের কাছে পৌঁছনীয় নয় এবং পুনরুত্থ্যযোগ্য নয়। এই বিষয়গুলি পুনঃসংশোধনের জন্য প্রস্তুত

আরও তথ্যের জন্য: https://www.artima.com/insidejvm/ed2/gc16.html «ধস


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

@ টোলমেকারস্টেভ এবং সমস্ত - দু'টি জিনিসের জন্য ক্ষমা প্রার্থনা 1. আমার উত্তরের পূর্ববর্তী সংস্করণে ফ্যান্টম রেফারেন্সগুলির ভুল ব্যাখ্যা এবং 2 এবং ত্রুটিগুলি সংশোধন করতে বিলম্ব। এখন উত্তরটি ত্রুটিগুলি সংশোধন করে উন্নত করা হয়েছে
ভি.ভিদ্যাশাগর

1

একজনকে সচেতন হওয়া উচিত যে কেবলমাত্র দুর্বল রেফারেন্স (গুলি) থাকলে দুর্বলভাবে রেফারেন্স করা বস্তুটি সংগ্রহ করা হবে। যদি এটির মতো একটি শক্তিশালী রেফারেন্স থাকে তবে এটি যতগুলি দুর্বল রেফারেন্সই থাকুক না কেন তা সংগ্রহ করা যায় না।


এটি সাধারণ জ্ঞান ... সফটরেফ এবং ভুতোমরফের ক্ষেত্রেও এটি একই রকম।
পেসারিয়ার

1

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

ভারী বোঝার অধীনে গাদা এবং জিসি আচরণ

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

আপনি এই পরীক্ষার জন্য গভীরতার গ্রাফ, পরিসংখ্যান, পর্যবেক্ষণ আরও পেতে পারেন ।


0

WeakReference : (ছোটখাট বা সম্পূর্ণ) যে বস্তু শুধুমাত্র স্বাস্থ্যহীন রেফারেন্সড হয় যে জিসি চক্র এ সংগ্রহ করা হয়।

সফট রেফারেন্স: যখন কেবলমাত্র নরমভাবে রেফারেন্সযুক্ত জিনিসগুলি সংগ্রহ করা হয় তার উপর নির্ভর করে:

  1. -এক্সএক্স: সফটআরএফএলএলআরআলপিআলসিএমএসপিএমএম = এন পতাকা (ডিফল্ট মান 1000, ওরফে 1 সেকেন্ড)

  2. স্তূপে মুক্ত মেমরির পরিমাণ।

    উদাহরণ:

    • হিপটিতে 10MB ফ্রি স্পেস থাকে (সম্পূর্ণ জিসির পরে);
    • -XX: SoftRefLRUPolicyMSPerMB = 1000

    তারপরে কেবল সফটরিফারেন্স দ্বারা রেফারেন্সযুক্ত অবজেক্টটি যদি শেষ বার অ্যাক্সেস করার পরে 10 সেকেন্ডের বেশি হয় তবে সংগ্রহ করা হবে।

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