مفاهيم الاقتباس القوي ، والاستشهاد الناعم ، والاستشهاد الضعيف ، والاستشهاد الافتراضي
قوي
اقتباسات قوية تشير إلى الاقتباسات المشتركة في رمز البرنامج. على سبيل المثال ، الكائن و STR في الكود التالي هما اقتباسات قوية:
كائن كائن = كائن جديد () ؛ String str = "Hello" ؛
طالما أن الكائن لديه مرجع قوي مرتبط به ، فإن JVM بالتأكيد لن يعيد تدوير هذا الكائن. حتى في غياب الذاكرة ، يفضل JVM إلقاء خطأ OutofMemory من إعادة تدوير مثل هذا الكائن.
على سبيل المثال ، الكود التالي:
الفئة العامة الرئيسية {public static void main (string [] args) {new main (). fun1 () ؛ } public void fun1 () {object = new Object () ؛ كائن [] objarr = كائن جديد [1000] ؛ }}عند التشغيل إلى كائن [] objarr = كائن جديد [1000] ؛ عند التشغيل إلى هذه الجملة ، إذا لم تكن هناك ذاكرة كافية ، فسوف يرمي JVM خطأ OOM ولن يعيد تدوير الكائن الذي أشار إليه الكائن. ومع ذلك ، تجدر الإشارة إلى أنه بعد تشغيل المرح 1 ، لم يعد كل من الكائن و Objarr موجودًا ، وبالتالي فإن الكائنات التي يشيرون إليها سيتم إعادة تدويرها بواسطة JVM.
إذا كنت ترغب في مقاطعة الارتباط بين مرجع قوي وكائن ما ، فيمكنك عرض الإشارة إلى NULL ، بحيث يقوم JVM بإعادة تدوير الكائن في الوقت المناسب.
softreference
تُستخدم المراجع اللينة لوصف بعض الكائنات المفيدة ولكن غير المطلوبة ، ويتم تمثيلها في Java باستخدام فئة Java.lang.ref.softreference. بالنسبة للمراجع الناعمة ، فإن JVM سوف يعيد تدوير الكائن فقط عندما لا تكون هناك ذاكرة كافية. لذلك ، يمكن استخدام هذا جيدًا لحل مشكلة OOM ، وهذه الميزة مناسبة جدًا لتنفيذ التخزين المؤقت: مثل التخزين المؤقت لصفحة الويب ، وتخزين الصور ، إلخ.
يمكن استخدام مرجع ناعم بالاقتران مع قائمة انتظار مرجعية (مرجعية). إذا تم إعادة تدوير الكائن المشار إليه بواسطة المرجع الناعم بواسطة JVM ، فسيتم إضافة المرجع الناعم إلى قائمة الانتظار المرجعية المرتبطة. فيما يلي مثال على الاستخدام:
استيراد java.lang.ref.weakReference ؛ الفئة العامة الرئيسية {public static void main (string [] args) {preferReference <string> sr = new Defentference <string> (سلسلة جديدة ("Hello")) ؛ System.out.println (sr.get ()) ؛ System.gc () ؛ // إخطار GC من JVM لأداء System.out.println (sr.get ()) ؛ }}ضعف
تستخدم المراجع الضعيفة أيضًا لوصف الأشياء غير الضرورية. عندما تقوم JVM بإجراء جمع القمامة ، سيتم إعادة تدوير الكائنات المرتبطة بالمراجع الضعيفة بغض النظر عما إذا كانت الذاكرة كافية. في جافا ، استخدم فئة java.lang.ref.weakreference لتمثيلها. فيما يلي مثال على الاستخدام:
استيراد java.lang.ref.weakReference ؛ الفئة العامة الرئيسية {public static void main (string [] args) {preferReference <string> sr = new Defentference <string> (سلسلة جديدة ("Hello")) ؛ System.out.println (sr.get ()) ؛ System.gc () ؛ // إخطار GC من JVM لأداء System.out.println (sr.get ()) ؛ }}الوهمية
تختلف المراجع الافتراضية عن المراجع الناعمة السابقة والمراجع الضعيفة ، ولا تؤثر على دورة حياة الكائن. في Java ، استخدم فئة Java.Lang.Ref.PhantomReference لتمثيلها. إذا كان الكائن مرتبطًا بمرجع افتراضي ، فقد يتم إعادة تدويره بواسطة جامع القمامة في أي وقت ، تمامًا كما لا يرتبط أي مرجع به.
تجدر الإشارة إلى أنه يجب استخدام المراجع الافتراضية بالاشتراك مع قائمة الانتظار المرجعية. عندما يستعد جامع القمامة لإعادة تدوير كائن ، إذا وجد أنه يحتوي على مرجع افتراضي ، فسيضيف هذا المرجع الظاهري إلى قائمة الانتظار المرجعية المرتبطة. يمكن للبرنامج أن يفهم ما إذا كان الكائن المشار إليه سيتم جمعه عن طريق الحكم على ما إذا كان قد تمت إضافة مرجع افتراضي إلى قائمة الانتظار المرجعية. إذا وجد البرنامج أنه تمت إضافة مرجع افتراضي إلى قائمة الانتظار المرجعية ، فقد يتخذ الأمر الإجراءات اللازمة قبل إعادة تدوير ذاكرة الكائن المشار إليه.
مزيد من الفهم للاستشهادات الناعمة والضعيفة
غالبًا ما نستخدم الاستشهادات القوية عند كتابة التعليمات البرمجية. بالنسبة للأنواع الثلاثة الأخرى من الاستشهادات ، فإن الأكثر استخدامًا هي الاستشهادات الناعمة والاستشهادات الضعيفة. هذين لهما أوجه التشابه والاختلاف. يتم استخدامها جميعها لوصف الكائنات غير الضرورية ، ولكن سيتم إعادة تدوير الكائنات المرتبطة بالمراجع اللينة فقط عندما تكون هناك ذاكرة غير كافية ، بينما سيتم دائمًا إعادة تدوير الكائنات المرتبطة بالمراجع الضعيفة عند جمع JVM. في ضوء الميزات المذكورة أعلاه ، فإن المراجع الناعمة مناسبة للتخزين المؤقت. عندما تكون الذاكرة غير كافية ، يمكن لـ JVM إعادة تدوير الذاكرة. يمكن استخدام المراجع الضعيفة لمنع تسرب الذاكرة في وظيفة رد الاتصال. نظرًا لأن وظائف رد الاتصال غالبًا ما تكون فئات داخلية مجهولة المصدر وحفظ المراجع ضمنيًا إلى الفئات الخارجية ، إذا تم استدعاء وظيفة رد الاتصال في سلسلة رسائل أخرى ، وإذا كانت الفئة الخارجية تحتاج إلى إعادة تدويرها في هذا الوقت ، فإن تسرب الذاكرة ، لأن الفئات الداخلية المجهولة تخزن إشارات قوية إلى الفئات الخارجية.
تتحدث المقالة أعلاه لفترة وجيزة عن الفرق بين أساليب الاستشهاد الأربعة في Java هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.