[Java] هل الحقول الثابتة مفتوحة لجمع القمامة؟


Answers

تتم الإشارة إلى المتغيرات الثابتة بواسطة كائنات Class التي يتم الرجوع إليها بواسطة ClassLoaders -so إلا إذا قام ClassLoader بإسقاط Class بطريقة أو بأخرى (إذا كان ذلك ممكنًا) أو ClassLoader نفسه يصبح مؤهلاً للتجميع (على الأرجح - التفكير في إلغاء تحميل webapps) المتغيرات الثابتة (أو بدلاً من ذلك ، لن يتم جمع الأشياء التي يشار إليها.

Question

إعطاء فئة فائدة افتراضية تستخدم فقط في إعداد البرنامج:

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

هل سيكون myObject عبارة عن جمع قمامة عند عدم استخدامه ، أو هل سيتم الاحتفاظ به طوال مدة البرنامج؟




المفتاح هنا هو مجموعة garbage من مثيلات Class أي كائنات. مثيل ClassLoader هو ، في جوهره ، كائن. لذلك إذا لم يكن كائن Classloader مجمّعًا لجمع البيانات ، فإن أي مراجع لها مخزنة في كومة الذاكرة المؤقتة (أي أشياء ثابتة) لن يتم تجميع البيانات المهملة أبداً. الاستثناء هو تجمع السلسلة.

قبل أن تقرر فجأة أن تفعل private static MyGiantClass myGiantObject = new MyGiantClass() فكر مرتين كما تعلمت بالطريقة الصعبة.




myObject هو مرجع وليس كائن . يتم تجميع كائن تلقائيًا عند عدم وجود مرجع يشير إليه لأنه غير قابل للوصول.

لذلك ، يمكن أيضًا أن يتم تجميع الكائن الناتج عن مرجع ثابت "myObject" إذا تم حذفه

myObject = null;

ولا توجد مراجع أخرى لهذا الكائن.

ومع ذلك تظل المراجع والمتغيرات الثابتة طوال مدة البرنامج.