سؤال

هذا السؤال مخصص للغة جافا على وجه الخصوص.أدرك أن هناك جزءًا ثابتًا من الذاكرة مخصصًا لجميع التعليمات البرمجية الثابتة.

سؤالي هو كيف يتم ملء هذه الذاكرة الثابتة؟هل يتم وضع كائن ثابت في الذاكرة الثابتة عند الاستيراد أم عند المرجع الأول؟وأيضًا، هل تنطبق نفس قواعد جمع البيانات المهملة على الكائنات الثابتة كما تنطبق على كافة الكائنات الأخرى؟


public class Example{
    public static SomeObject someO = new SomeObject();
}
/********************************/
// Is the static object put into static memory at this point?
import somepackage.Example;

public class MainApp{
    public static void main( Sting args[] ){
// Or is the static object put into memory at first reference?
       Example.someO.someMethod();
// Do the same garbage collection rules apply to a 
//     static object as they do all others?
       Example.someO = null;
       System.gc();
    }
}
هل كانت مفيدة؟

المحلول

والواردات لا ترتبط بأية تعليمات في التعليمات البرمجية المترجمة. أن تضع الأسماء المستعارة للاستخدام في وقت الترجمة فقط.

وهناك بعض الطرق العاكسة التي تسمح للفئة ليتم تحميل ولكن لم يتم تهيئة بعد، ولكن في معظم الحالات، يمكن أن نفترض أنه كلما المشار إليها فئة، تمت تهيئة ذلك.

ويتم تنفيذ المهيآت عضو ثابت وكتل ثابتة كما لو كانوا جميعا كتلة واحدة مهيئ ثابت من أجل شفرة المصدر.

والمشار إليها كائن المشار إليها من خلال متغير عضو ثابت بقوة حتى تفرغ الطبقة. A ClassLoader طبيعي أبدا افرغت فئة، ولكن تلك المستخدمة من قبل خوادم التطبيقات القيام به في ظل الظروف المناسبة. ومع ذلك، انها منطقة صعبة وكان مصدر العديد من الصعب إلى تشخيص الذاكرة التسريبات، سببا آخر لعدم استخدام المتغيرات العالمية.


ونتيجة ل(عرضية) مكافأة، وهنا سؤال صعب للنظر:

public class Foo {
  private static Foo instance = new Foo();
  private static final int DELTA = 6;
  private static int BASE = 7;
  private int x;
  private Foo() {
    x = BASE + DELTA;
  }
  public static void main(String... argv) {
    System.out.println(Foo.instance.x);
  }
}

وماذا سيكون هذا الرمز الطباعة؟ تحاول ذلك، وسترى أنه يطبع "6". وهناك عدد قليل من الأشياء في العمل هنا، واحد هو أمر التهيئة ثابتة. يتم تنفيذ التعليمات البرمجية كما لو أنها كانت مكتوبة مثل هذا:

public class Foo {
  private static Foo instance;
  private static final int DELTA = 6;
  private static int BASE;
  static {
    instance = null;
    BASE = 0;
    instance = new Foo(); /* BASE is 0 when instance.x is computed. */
    BASE = 7;
  }
  private int x;
  private Foo() {
    x = BASE + 6; /* "6" is inlined, because it's a constant. */
  }
}

نصائح أخرى

وعادة لا يوجد شيء مثل الذاكرة "ثابت". أكثر من VM لديك جيل الدائمين في كومة (حيث الحصول على تحميل الطبقات)، وهو عادة لا القمامة التي تم جمعها.

ويتم تخصيص الأجسام ساكنة تماما مثل أي كائن آخر. ولكن، إذا كانوا يعيشون لفترة طويلة فسوف يتم نقلها بين الأجيال المختلفة في جمع القمامة. لكنها لن ينتهي في permgenspace.

إذا تم التمسك هذا الكائن بشكل دائم، ولن يتم الإفراج صفك عندما مخارج VM.

هذا المتغير الثابت بعض0 تتم تهيئته بمجرد الإشارة إلى الفصل الدراسي الخاص بك في التعليمات البرمجية الخاصة بك.في المثال الخاص بك سيتم تنفيذ هذا في السطر الأول من طريقتك الرئيسية.

يمكنك التحقق من صحة ذلك عن طريق إنشاء كتلة مُهيئ ثابتة.ضع نقطة فاصل في كتلة المُهيئ هذه وسترى متى سيتم استدعاؤها.أو حتى أبسط..وضع نقطة توقف في منشئ SomeObject.

ويتم تغطية تهيئة المتغيرات ثابتة في القسم <لأ href = "http://java.sun.com/docs/books/jvms/second_edition/html/Concepts.doc.html#32316" يختلط = "noreferrer نوفولو "> 2.11 ثابت المعدون من المواصفات شموس JVM. مواصفات لا يعرف تنفيذ جمع القمامة ولكن حتى أستطيع أن أتخيل أن القواعد جمع القمامة للكائنات ثابتة وتختلف تبعا VM الخاص بك.

وتجدر الإشارة إلى أن يتم تخزين فقط مؤشر (أو أي نوع بدائي آخر) في في PermGenSpace (والذي يكون الاسم الصحيح للمنطقة حيث يتم تخزين الأشياء الساكنة).

وهكذا كائن المشار إليه بواسطة مؤشر يجلس في كومة العادية، مثل أي كائن آخر.

إذا تم تغيير حقل ثابت مرجع كائن آخر، أشار الكائن الأصلي إلى جانب حقل ثابت مؤهلة للحصول على GC تماما مثل أي كائن آخر.

ويمكن أيضا free'ed و(حتى لو لم أصبح بلا قيمة) إذا كانت الفئة نفسها هي تفريغ وقطع الرسم البياني الكائن بأكمله من الكومة. بطبيعة الحال، عندما يمكن تفريغها فئة هو موضوع جيد لمجموعة من أسئلة أخرى ...:)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top