تختلف معرفة مفاهيم المراجع الضعيفة والناعمة عن كيفية استخدامها. نعلم جميعًا أن جامع القمامة يستعيد الذاكرة للكائنات التي تلبي معايير إعادة التدوير ، ولكن لا يعرف جميع المبرمجين أن معايير إعادة التدوير تعتمد على نوع المرجع الذي يشير إلى الكائن. هذا هو الفرق الرئيسي بين المراجع الضعيفة والمراجع الناعمة في Java. إذا كان للكائن مرجعًا ضعيفًا فقط يشير إليه ، فإن جامع القمامة يعيد تدوير الكائن على الفور ، وهو وسيلة عاجلة لإعادة تدويره. نسبيًا ، إذا كانت هناك مراجع ناعمة تشير إلى هذه الكائنات ، فسيتم إعادة تدويرها فقط إذا كانت JVM تتطلب الذاكرة. السلوك الخاص للاستشهادات الضعيفة والناعمة يجعلها مفيدة للغاية في بعض الحالات. على سبيل المثال: يمكن استخدام المراجع الناعمة بشكل جيد لتنفيذ ذاكرة التخزين المؤقت. المراجع الضعيفة مناسبة للغاية لتخزين البيانات الوصفية ، مثل تخزين مراجع charloader. إذا لم يتم تحميل أي فصل ، فلا يوجد إشارة إلى ClassLoader أيضًا. بمجرد إزالة آخر مرجع قوي ، سيتم إعادة تدوير محمل الطبقة المرجعية الضعيفة فقط. في هذه المقالة ، سوف نتحدث عن أنواع مختلفة من مراجع Java ، مثل: مرجع قوي و phantomreference.
المراجع الضعيفة مقابل المراجع الناعمة في جافا
هناك أربعة أنواع من المراجع في جافا:
1. مرجع قوي
2. ضعيفة
3
4
المراجع القوية هي أبسط المراجع التي نستخدمها في البرمجة ، مثل المتغير S في سلسلة الكود S = "ABC" هو مرجع قوي لكائن السلسلة "ABC". لا يمكن إعادة تدوير أي كائن يشير إليه مرجع قوي بواسطة جامع القمامة ، وهذه الكائنات مطلوبة في البرنامج. يتم تمثيل المراجع الضعيفة بواسطة فئة فئة فئة Java.Lang.Ref.WeakReference ، ويمكنك إنشاء مراجع ضعيفة باستخدام الرمز التالي:
نسخة الكود كما يلي:
عداد العداد = عداد جديد () ؛
PreferReference <Counter> PeactCounter = New Preferference <Counter> (Counter) ؛
عداد = خالية
الآن طالما قمت بتعيين قيمة خالية إلى عداد الكائن المرجعي القوي ، يمكن إعادة تدوير الكائن بواسطة جامع القمامة. نظرًا لأن الكائن لم يعد يحتوي على مراجع قوية أخرى في هذا الوقت ، فإن حتى الضعيف يشير إلى الكائن لا يمكن أن يمنع جامع القمامة من إعادة تدوير الكائن. على العكس من ذلك ، إذا كان الكائن يحتوي على مرجع ناعم ، فإن الكائن المضاد لا يتم إعادة تدويره على الفور ما لم يتطلب JVM الذاكرة. يتم تمثيل المراجع الناعمة في Java من خلال فئة Java.lang.ref.softreference.
نسخة الكود كما يلي:
Counter Prime = New Counter () ؛
Softreference Soft = softreference جديد (Prime) ؛
Prime = NULL ؛
بعد الإشارة القوية ، لا يمكن للسلوك الثاني للرمز ، أن ينشئ مرجعًا ناعمًا. بالنظر إلى هذا الاختلاف بين المراجع الناعمة والمراجع الضعيفة ، تكون المراجع الناعمة أكثر ملاءمة لآليات التخزين المؤقت ، في حين أن المراجع الضعيفة أكثر ملاءمة لتخزين البيانات الوصفية. مثال آخر على استخدام المراجع الضعيفة هو DefehashMap ، وهو تطبيق آخر لواجهة الخريطة إلى جانب HashMap و Treemap. يحتوي PrefiHashMap على ميزة: يتم تغليف المفاتيح الموجودة في الخريطة كمراجع ضعيفة ، مما يعني أنه بمجرد حذف المرجع القوي ، لا يمكن للمراجع الضعيفة داخل الضعيف أن تمنع الكائن من جمعها بواسطة جامع القمامة.
المرجع الظاهري هو المرجع الثالث المتاح في حزمة java.lang.ref ، ممثلة بفئة java.lang.ref.phantomreference. يمكن إعادة تدوير الكائنات ذات المراجع الافتراضية بواسطة جامع القمامة في أي وقت. على غرار المراجع الضعيفة والمراجع الناعمة ، يمكنك إنشاء مراجع افتراضية من خلال الكود التالي:
نسخة الكود كما يلي:
DigitalCounter Digit = New DigitalCounter () ؛
PhantomReference Phantom = New PhantomReference (Digit) ؛
رقم = فارغ ؛
بمجرد إزالة المرجع القوي ، يمكن إعادة تدوير كائن DigitalCounter في الصف الثالث بواسطة جامع القمامة في أي وقت. نظرًا لوجود مرجع افتراضي واحد فقط يشير إلى الكائن ، لا يمكن للمرجع الظاهري منع جامع القمامة من استعادة الكائن.
بالإضافة إلى فهم المراجع الضعيفة ، والمراجع الناعمة ، والمراجع الافتراضية ، والضعف ، تحتاج أيضًا إلى فهم المرجع. في عملية إنشاء أي مراجع ضعيفة ، مراجع ناعمة ، والمراجع الافتراضية ، يمكنك توفير مرجع قائمة انتظار المرجع من خلال الكود التالي:
نسخة الكود كما يلي:
refqueue المرجعية = مرجع جديد
DigitalCounter Digit = new DigitalCounter () ؛
phantomReference <DigitalCounter> phantom = new phantomReference <DigitalCounter> (Digit ، refqueue) ؛
تتم إضافة الحالات المرجعية إلى قائمة الانتظار المرجعية ، ويمكنك إعادة تدوير الكائنات عن طريق الاستعلام عن قائمة انتظار المرجع في أي وقت. يمكن وصف دورة حياة الكائن في الشكل أدناه: