[Java] هل يعين تخصيص الكائنات إلى فارغة في جافا تأثير جمع القمامة؟


Answers

في تجربتي، في كثير من الأحيان لا يلغي الناس مراجع من جنون العظمة ليس من الضرورة. هنا هو التوجيهي السريع:

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

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

أود أن أقول أن الغالبية العظمى من الوقت لن تحتاج إلى إلغاء المراجع. محاولة اغلب جامع القمامة لا طائل منه. سوف ينتهي بك الأمر مع رمز غير فعال وغير قابل للقراءة.

Question

هل يؤدي تخصيص إشارة غير مستخدمة إلى كائن null في جافا إلى تحسين عملية جمع القمامة بأي طريقة يمكن قياسها؟

وقد علمتني تجربتي مع جافا (و C #) التي غالبا ما تكون بديهية في محاولة لإغراق الجهاز الظاهري أو جيت مترجم، ولكن رأيت زملاء العمل استخدام هذه الطريقة وأنا غريبة إذا كان هذا هو ممارسة جيدة لاختيار متابعة أو واحدة من تلك الفودو البرمجة الخرافات؟




أفترض أن أوب تشير إلى أشياء من هذا القبيل:

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

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

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

في هذه الحالة، لن علامة فم لهم ل غ بمجرد ترك المجال على أي حال؟

أو، من وجهة نظر أخرى، من شأنه أن يحدد بشكل صريح العناصر إلى نول تسبب لهم للحصول على GC'd قبل أن لو أنها خرجت للتو من النطاق؟ إذا كان الأمر كذلك، فإن فم قد تنفق الوقت GC'ing الكائن عندما لا تكون هناك حاجة الذاكرة على أي حال، الأمر الذي من شأنه أن يؤدي في الواقع سوءا أداء وحدة المعالجة المركزية الأداء الحكمة لأنه سيكون GC'ing أكثر في وقت سابق.




كنت أعمل على تطبيق الفيديو كونفرنس مرة واحدة ولاحظت ضخمة ضخمة ضخمة الفرق في الأداء عندما أخذت الوقت لمراجع فارغة بمجرد أنني لم تحتاج الكائن بعد الآن. كان هذا في 2003-2004، وأستطيع أن أتخيل فقط حصلت غ حتى أكثر ذكاء منذ ذلك الحين. في حالتي كان لي مئات من الأجسام القادمة والخروج من نطاق كل ثانية، لذلك لاحظت غ عندما ركل في دوري. ومع ذلك بعد أن جعلته نقطة إلى كائنات فارغة توقفت غ توقف مؤقت طلبي.

لذلك يعتمد على ما تفعله ...




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

عموما وضع مراجع ل نول، يعني إلى ريدر من رمز أن هذا الكائن يتم تماما مع ولا ينبغي أن تكون قلقة بشأن أي أكثر من ذلك.

ويمكن تحقيق تأثير مماثل من خلال وضع في مجموعة إضافية من الأقواس

{
  int l;
  {
    String bigThing = ....;
    l = bigThing.length();
  }
  ---
}

وهذا يسمح بيغثينغ أن تكون القمامة التي تم جمعها الحق بعد ترك الأقواس المتداخلة.




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

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




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 . ومن الممارسة السليمة دائما تعيين المتغير غير المستخدم إلى نول