স্থির ক্ষেত্রগুলি আবর্জনা সংগ্রহের জন্য উন্মুক্ত?


96

অনুমানমূলক ইউটিলিটি শ্রেণি দেওয়া হয়েছে যা কেবলমাত্র প্রোগ্রাম সেটআপে ব্যবহৃত হয়:

class MyUtils {
   private static MyObject myObject = new MyObject();
   /*package*/static boolean doStuff(Params... params) {
       // do stuff with myObject and params...
   }
}

মাইঅবজেক্টটি কী আর আবর্জনা সংগ্রহ করা হবে যখন এটি আর ব্যবহার করা হবে না, বা এটি প্রোগ্রামটির জীবন জুড়ে থাকবে?

উত্তর:


113

ক্লাস লোড থাকা অবস্থায় স্ট্যাটিক ভেরিয়েবলগুলি আবর্জনা সংগ্রহের জন্য নির্বাচন করা যাবে না। এগুলি সংগ্রহ করা যেতে পারে যখন संबंधित শ্রেণীর লোডার (যা এই শ্রেণীর লোড করার জন্য দায়বদ্ধ ছিল) নিজেই আবর্জনার জন্য সংগ্রহ করা হয়।

পরীক্ষা করে দেখুন ক্লাস ও ইন্টারফেস JLS অনুচ্ছেদ 12.7 খালাস

কোনও শ্রেণি বা ইন্টারফেসটি লোড করা যেতে পারে এবং কেবল যদি তার সংজ্ঞায়িত শ্রেণীর লোডারটি আবর্জনা সংগ্রহকারী দ্বারা পুনরায় দাবি করা যেতে পারে [...] বুটস্ট্র্যাপ লোডার দ্বারা লোড হওয়া ক্লাস এবং ইন্টারফেসগুলি লোড না করা যেতে পারে।


@ ব্রুনো, আপনার লিঙ্কটি অনুসারে, এর অর্থ কি এই বোঝা যাচ্ছে যে কোনও শ্রেণি লোডার প্রতিটি শ্রেণি বোঝায় যে এটি লোড হয়, এমনকি শ্রেণিবদ্ধ লোডের স্থায়ী সদস্য না থাকলেও?
পেসারিয়ার

@ ব্রুনোকনডে, আমি আসলে এটি সত্য বলে মনে করি না। ঠিক কোন অনুচ্ছেদে বলা হয়েছে? (আলোচনা দয়া করে চালিয়ে যান stackoverflow.com/questions/405364/... )
Pacerier

যখন শ্রেণি লোডার আবর্জনা সংগ্রহের জন্য যোগ্য হবে। ?
রোহিত বান্দিল

@ রোহিতবান্দিল - যখন এটি অ্যাক্সেসযোগ্য হয়।
স্টিফেন সি

55

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


4
না Classযে বস্তু কোন স্ট্যাটিক ভেরিয়েবল অনুযায়ী তাদের বর্গ লোডার দ্বারা সমর্থিত না?
পেসারিয়ার

14

আপনি যদি স্থির সূচনা করার জন্য কোনও অস্থায়ী অবজেক্টটি ব্যবহার করতে চান তবে এর নিষ্পত্তি হলে আপনি একটি স্ট্যাটিক ইনিশিয়ালাইজার ব্লক ব্যবহার করতে পারেন, যেমন

class MyUtils {
   static
   {
      MyObject myObject = new MyObject();
      doStuff(myObject, params);
   }

   static boolean doStuff(MyObject myObject, Params... params) {
       // do stuff with myObject and params...
   }
}

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


13

মায়োবজেক্ট একটি রেফারেন্স এবং কোনও অবজেক্ট নয় । কোনও বস্তু স্বয়ংক্রিয়ভাবে আবর্জনা সংগ্রহ করা হয় যখন কোনও রেফারেন্স এতে নির্দেশ করে না কারণ এটি অ্যাক্সেসযোগ্য।

একইভাবে স্থিতিশীল রেফারেন্স "মাইবজেক্ট" এর পিছনের অবজেক্টটি যদি আপনি এর সাথে অবজ্ঞা করেন তবে আবর্জনা সংগ্রহ করা যেতে পারে

myObject = null;

এবং এই অবজেক্টের সাথে অন্য কোনও উল্লেখ নেই।

তবে স্থির রেফারেন্স এবং ভেরিয়েবলগুলি আপনার প্রোগ্রামের আজীবন থাকবে for


স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম! অবজেক্টটির nullশেষে সেট static blockকরা একটি কার্যকর বিকল্প। আমার ক্ষেত্রে, যদিও, অবজেক্টের জীবনকাল স্থিতিশীল ব্লকের চেয়ে দীর্ঘ হওয়া দরকার। অবজেক্টটির শেষ-উপযোগিতা খুব কংক্রিট ছিল না; এইভাবে আবর্জনা সংগ্রহকারীকে কাজে লাগানোর বিষয়ে আমার জিজ্ঞাসা।
মাইকেল ডিকারিফ

7

আমি মনে করি এটি আপনার প্রশ্নের জবাব দেয় - মূলত ক্লাসটি কোনও বিশেষ শ্রেণীর লোডার থেকে আসে না এবং এটি ক্লাসটি আনলোড না করে না।


0

এখানে কীটি ক্লাস ইনস্ট্যান্সের আবর্জনা সংগ্রহ অর্থাৎ বিষয়গুলি is ClassLoader উদাহরণটি হ'ল সংক্ষেপে an সুতরাং ক্লাসলোডার অবজেক্টটি যদি আবর্জনা সংগ্রহ না করা হয় তবে সেগুলির কোনও রেফারেন্স হিপ (যেমন স্ট্যাটিক স্টাফ) এ সঞ্চিত থাকে তা প্রায় কখনই আবর্জনা সংগ্রহ করা যাবে না। ব্যতিক্রম স্ট্রিং পুল।

সুতরাং আপনি হঠাৎ করেই private static MyGiantClass myGiantObject = new MyGiantClass() দু'বার চিন্তা করার সিদ্ধান্ত নেওয়ার আগে আমি শক্ত উপায়টি শিখেছি।

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