জাভা আবর্জনা সংগ্রহে বাতিল করার জন্য কী জিনিসকে বরাদ্দ করা হয়?


85

nullজাভাতে কোনও অব্যবহৃত অবজেক্টের রেফারেন্স নির্ধারণ করা কি কোনও পরিমাপযোগ্য উপায়ে আবর্জনা সংগ্রহের প্রক্রিয়াটিকে উন্নত করে?

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

উত্তর:


66

সাধারণত, না।

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

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

উদাহরণস্বরূপ, অ্যারেলিস্ট থেকে এই কোড:

public E remove(int index) {
    RangeCheck(index);

    modCount++;
    E oldValue = (E) elementData[index];

    int numMoved = size - index - 1;
    if (numMoved > 0)
         System.arraycopy(elementData, index+1, elementData, index,
             numMoved);
    elementData[--size] = null; // Let gc do its work

    return oldValue;
}

এছাড়াও, স্পষ্টভাবে কোনও বস্তুকে নালার কারণে কোনও বিষয়বস্তু যতক্ষণ না রেফারেন্স হিসাবে অবধি স্বাভাবিকভাবেই সুযোগের বাইরে চলে যায় তার চেয়ে আর কোনও বস্তু যত তাড়াতাড়ি সংগ্রহ করা যায় না।

উভয়:

void foo() {
   Object o = new Object();
   /// do stuff with o
}

এবং:

void foo() {
   Object o = new Object();
   /// do stuff with o
   o = null;
}

কার্যত সমতুল্য।


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

4
তাহলে কি এটা ঠিক, যখন আমরা কোনও বস্তু বাতিল করি তখন আবর্জনা সংগ্রাহক তত্ক্ষণাত সেই বস্তুটি সংগ্রহ করেন ??
মুহাম্মদ বাবর

4
নং আবর্জনা সংগ্রহকারী পর্যায়ক্রমে এমন কোনও বস্তু ছিল যা কিনা কোনও রেফারেন্স ভেরিয়েবলগুলি নির্দেশ করছে না তা দেখার জন্য নির্বাহ করা হয়। যখন আপনি এগুলি স্থির করে রাখুন এবং তারপরে কল করুন System.gc()তখন তা সরিয়ে ফেলা হবে (প্রদত্ত সেই বস্তুর দিকে নির্দেশিত অন্য কোনও উল্লেখ নেই) are
জাভাটেকনিক্যাল

4
@ জাভাটেকনিক্যাল যেমন আমি জানি এটির নিশ্চয়তা নেই যে সিস্টেম.gc () কল করে আবর্জনা সংগ্রহ শুরু হয়।
জ্যাক

12

আমার অভিজ্ঞতা হিসাবে, প্রায়শই না করা বেশি, লোকেদের প্রয়োজনের বাইরে নমনীয়তার কারণে রেফারেন্সগুলি বাতিল করে দেয়। এখানে একটি দ্রুত গাইডলাইন রয়েছে:

  1. যদি অবজেক্ট এ রেফারেন্স অবজেক্ট বি এবং আপনার আর এই রেফারেন্সের প্রয়োজন নেই এবং অবজেক্ট এ আবর্জনা সংগ্রহের জন্য যোগ্য নন তবে আপনার স্পষ্টভাবে ক্ষেত্রটি বাতিল করতে হবে। যদি ঘেরযুক্ত বস্তু যে কোনওভাবে আবর্জনা সংগ্রহ করছে তবে কোনও ক্ষেত্র নষ্ট করার দরকার নেই। নিষ্পত্তি () পদ্ধতিতে ক্ষেত্রগুলি সরিয়ে ফেলা প্রায় সর্বদা অকেজো।

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

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


11

ভাল নিবন্ধটি আজকের কোডিং হরর

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

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

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

সুতরাং সংক্ষেপে, হ্যাঁ এটি সহায়তা করতে পারে তবে এটি নির্বিচারক হবে না



নিরাপদ অপ্টিমাইজেশনের উত্তম পয়েন্ট যা রেফারিটটি বাতিল করে রেখাকে সরিয়ে দেয়।
জিজ্ঞাসা করুন

8

অন্তত জাভাতে, এটি মোটেও ভুডো প্রোগ্রামিং নয়। আপনি যখন জাভাতে কোনও বস্তু তৈরি করেন তখন এর মতো কিছু ব্যবহার করে

Foo bar = new Foo();

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

bar = null ;

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


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

4
ভাল. এখন, একটি পপ কুইজের জন্য কোডের একটি উদাহরণ তৈরি করুন যা এটি পর্যাপ্ত নয়। ইঙ্গিত: তারা বিদ্যমান।
চার্লি মার্টিন

7

এটা নির্ভর করে.

সাধারণত সংক্ষিপ্তভাবে বললে আপনি আপনার অবজেক্টের জন্য রেফারেন্স রাখেন, দ্রুত সেগুলি সংগ্রহ করা হবে।

যদি আপনার পদ্ধতিটি কার্যকর করতে 2 সেকেন্ড সময় নেয় এবং আপনার পদ্ধতি প্রয়োগের এক সেকেন্ডের পরে আর কোনও জিনিসের প্রয়োজন হয় না, তবে এটির কোনও রেফারেন্স সাফ করার জন্য এটি বোধগম্য। যদি জিসি এটি দেখতে পান যে এক সেকেন্ড পরে, আপনার অবজেক্টটি এখনও রেফারেন্স করা হয়েছে, পরের বার এটি এটি এক মিনিট বা আরও কিছুক্ষণের মধ্যে পরীক্ষা করতে পারে।

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


6

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

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

অতিরিক্ত ধনুর্বন্ধনী ব্রেস রেখে সংকীর্ণ সুযোগটি প্রবর্তন করে অনুরূপ প্রভাব অর্জন করা যেতে পারে

{
  int l;
  {  // <- here
    String bigThing = ....;
    l = bigThing.length();
  }  // <- and here
}

এটি নেস্টেড ব্রেসগুলি ছেড়ে যাওয়ার পরে ঠিক বিগটিহিংকে আবর্জনা সংগ্রহ করতে দেয়।


ভাল বিকল্প। এটি স্পষ্টরূপে চলকটি নালতে সেট করা এড়িয়ে যায় এবং কিছু আইডিই সেই নাল অ্যাসাইনমেন্টটি ব্যবহার না করা সম্পর্কে প্রদর্শন করে warning
jk7

5
public class JavaMemory {
    private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);

    public void f() {
        {
            byte[] data = new byte[dataSize];
            //data = null;
        }

        byte[] data2 = new byte[dataSize];
    }

    public static void main(String[] args) {

        JavaMemory jmp = new JavaMemory();
        jmp.f();

    }

}

উপরে প্রোগ্রাম নিক্ষেপ OutOfMemoryError। আপনি যদি data = null;কোনও অসুবিধা না করেন OutOfMemoryErrorতবে সমাধান করা হবে। অব্যবহৃত ভেরিয়েবলটি নালায় সেট করা সর্বদা ভাল অনুশীলন


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

চলক ডেটার সুযোগ ছাড়ার মুহূর্তে কেন বাইট [] অ্যারে আবর্জনা সংগ্রহ করা হচ্ছে না?
গ্রাভ

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


4

আমি একসময় একটি ভিডিও কনফারেন্সিং অ্যাপ্লিকেশনটিতে কাজ করছি এবং আমি যখন কাজের আর দরকার নেই তত তাড়াতাড়ি রেফারেন্সগুলিতে সময় নেওয়ার সময় পারফরম্যান্সে বিশাল বিশাল বিশাল পার্থক্য লক্ষ্য করেছি। এটি ২০০৩-২০০৪ সালে হয়েছিল এবং আমি কেবলমাত্র কল্পনা করতে পারি যে জিসি তখন থেকে আরও স্মার্ট হয়ে উঠেছে। আমার ক্ষেত্রে আমার প্রতি কয়েক সেকেন্ডে কয়েকশ বস্তু উপস্থিত এবং সুযোগের বাইরে চলে যাচ্ছিল, তাই আমি জিসিকে লক্ষ্য করেছিলাম যখন এটি পর্যায়ক্রমে লাথি দেয়। যাইহোক আমি এটিকে শূন্য বস্তুগুলিতে বিন্দু করার পরে জিসি আমার অ্যাপ্লিকেশনটি থামিয়ে দিয়েছিল।

সুতরাং এটি আপনার করায় ...


2

হ্যাঁ.

"দি প্র্যাকমেটিক প্রোগ্রামার" থেকে পি ২৯২:

NULL- তে একটি রেফারেন্স সেট করে আপনি বস্তুর প্রতি পয়েন্টার সংখ্যা একে একে হ্রাস করুন ... (যা আবর্জনা সংগ্রহকারীকে এটিকে সরাতে দেবে)


আমি অনুমান করি যে এটি কেবল তখনই প্রযোজ্য যখন রেফারেন্স গণনাটি পূর্বে থাকে। ব্যবহার হয় না অন্যথায়ও?
এনআরজে

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

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

1

আমি ধরে নিই যে ওপি এই জাতীয় জিনিসগুলিকে উল্লেখ করছে:

private void Blah()
{
    MyObj a;
    MyObj b;

    try {
        a = new MyObj();
        b = new MyObj;

        // do real work
    } finally {
        a = null;
        b = null;
    }
}

এই ক্ষেত্রে, ভিএম যেভাবেই স্কোপ ছেড়ে যাওয়ার সাথে সাথে তাদেরকে জিসির জন্য চিহ্নিত করবে না?

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


জিসি যে সময় চালায় তা হ'ল নির্দোষ minist আমি বিশ্বাস করি না যে কোনও বিষয় নির্ধারণ করা মোটেই nullজিসির আচরণকে প্রভাবিত করে।
হার্টো

0

" এটি নির্ভর করে "

আমি জাভা সম্পর্কে জানি না তবে। নেট (সি #, ভিবি নেটনে ...) এ যখন আপনার আর কোনও বস্তুর প্রয়োজন হয় না তখন সাধারণত নাল বরাদ্দ করার প্রয়োজন হয় না।

তবে নোট করুন যে এটি "সাধারণত প্রয়োজন হয় না"।

আপনার কোডটি বিশ্লেষণ করে। নেট সংকলকটি চলকটির জীবনকালকে ভাল মূল্যায়ণ করে ... সঠিকভাবে বলতে যখন কখন বস্তুটি আর ব্যবহার হচ্ছে না। সুতরাং আপনি যদি আপত্তি = নাল লিখেন তবে এটি দেখতে আসলে দেখতে পারা যায় যা আপত্তিটি এখনও ব্যবহৃত হচ্ছে ... এই ক্ষেত্রে এটি একটি নাল বরাদ্দ করা পাল্টা ফলদায়ক।

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

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

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

বিষয়টিতে কিছু উল্লেখ:

http://blogs.msdn.com/csharpfaq/archive/2004/03/26/97229.aspx

http://weblogs.asp.net/pwilson/archive/2004/02/20/77422.aspx


0

এমনকি যদি রেফারেন্সটি বাতিল করে দেওয়া হয় তবে প্রান্তিকভাবে আরও দক্ষ হয়ে ওঠে, এই কুৎসিত শূন্যতার সাথে আপনার কোডটি মরিচ দেওয়ার কদর্যতা কি উপযুক্ত হবে? তারা কেবল বিশৃঙ্খলা হবে এবং এগুলিকে ধারণ করে এমন অভিপ্রায় কোডটি অস্পষ্ট করবে।

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


0

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

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


0

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

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

এটি 'প্যাথোলজিকাল' কারণ কোনও জিসি সমস্যা সমাধান না করা পর্যন্ত যে কোনও প্রচারিত নোডের ফলে নিম্নলিখিত সমস্ত নোডের প্রচার হবে।

নেপোটিজম এড়ানোর জন্য এটি এমন একটি বিষয় থেকে রেফারেন্স বাতিল করে দেওয়া ভাল ধারণা যা মুছে ফেলা উচিত। : আপনি এই কৌশল JDK শ্রেণীর প্রয়োগ দেখতে পারেন LinkedList এবং LinkedHashMap

private E unlinkFirst(Node<E> f) {
    final E element = f.item;
    final Node<E> next = f.next;
    f.item = null;
    f.next = null; // help GC
    // ...
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.