JavaRush /مدونة جافا /Random-AR /الاختلافات بين المراجع الضعيفة والناعمة والوهمية والعادية...
theGrass
مستوى
Саратов

الاختلافات بين المراجع الضعيفة والناعمة والوهمية والعادية في Java

نشرت في المجموعة
تمت إضافة المراجع "الضعيفة" والمراجع "الناعمة" (WeakReference، SoftReference) إلى Java API منذ وقت طويل، ولكن ليس كل مبرمج على دراية بها. ويشير هذا إلى وجود فجوة في فهم مكان وكيفية استخدامها. تعتبر الفئات المرجعية ذات أهمية خاصة في سياق جمع البيانات المهملة . كما نعلم جميعًا، يقوم مجمع البيانات المهملة نفسه بتحرير الذاكرة التي تشغلها الكائنات، ولكن لا يعلم جميع المبرمجين أنه يتخذ قرار تحرير الذاكرة بناءً على نوع المراجع المتاحة للكائن. الاختلافات بين الروابط الضعيفة والناعمة والوهمية والعادية في Java - 1الفرق الرئيسي بين SoftReference و WeakReference هو كيفية عمل المجمع معهم. يمكنه حذف كائن في أي وقت إذا كانت الروابط الضعيفة تشير إليه فقط، ومن ناحية أخرى، لن يتم جمع الكائنات ذات الارتباط الناعم إلا عندما يحتاج JVM حقًا إلى الذاكرة. ونظرًا لهذه الميزات الخاصة بالفئات المرجعية، فإن لكل منها استخدامًا خاصًا بها. يمكن استخدام SoftReference لتنفيذ ذاكرة التخزين المؤقت وعندما يحتاج JVM إلى ذاكرة، فإنه سيحررها عن طريق حذف هذه الكائنات. وتعد WeakReferences رائعة لتخزين البيانات الوصفية، على سبيل المثال، تخزين رابط إلى ClassLoader. إذا لم تكن هناك فئات لتحميلها، فلا فائدة من تخزين مرجع إلى ClassLoader ، فالمرجع الضعيف يجعل ClassLoader متاحًا للإزالة بمجرد تعيينه بدلاً من مرجع قوي. في هذه المقالة سننظر في الاختلافات بين أنواع الروابط، بما في ذلك المرجع القوي والمرجع الوهمي .

WeakReference مقابل SoftReference في جافا

لمن لا يعرف، هناك 4 أنواع من الروابط:
  1. مرجع قوي
  2. مرجع ضعيف
  3. مرجع ناعم
  4. المرجع الوهمي
الرابط القوي هو الأبسط، حيث أننا نستخدمه في البرمجة كل يوم، على سبيل المثال في الكود مثل String s = “abc” المتغير s هو الرابط القوي. يُحظر على جامع البيانات المهملة إزالة أي كائن له مرجع قوي. بالطبع، هذه هي الكائنات التي يحتاجها برنامج جافا . يتم تمثيل المراجع الضعيفة بواسطة فئة java.lang.ref.WeakReference ، يمكنك تعريف مرجع ضعيف مثل هذا:
Counter counter = new Counter(); // strong reference
WeakReference weakCounter = new WeakReference(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection
الآن، بمجرد تعيين العداد المرجعي القوي على قيمة خالية (counter = null)، يصبح الكائن الذي تم إنشاؤه في السطر الأول متاحًا لجمع البيانات المهملة لأنه لم يعد يحتوي على مرجع قوي. لا يمكن لمرجع WeakCounter الذي تم إنشاؤه بواسطة Weak أن يمنع المجمع من حذف كائن العداد. من ناحية أخرى، إذا كان مرجعًا ناعمًا، فلن يتم حذف كائن العداد حتى يحتاج JVM بشكل خاص إلى الذاكرة. يتم تمثيل المراجع الإلكترونية في Java بواسطة فئة java.lang.ref.SoftReference . مثال على إنشاء SoftReference في Java
Counter prime = new Counter();  // prime holds a strong reference
SoftReference soft = new SoftReference(prime) ; //soft reference variable has SoftReference to Counter Object
prime = null;  // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory
بعد مسح المرجع القوي (في السطر الثالث)، لن يكون هناك سوى مرجع بسيط واحد متبقي في كائن العداد، والذي لن يتمكن من منع جامع البيانات المهملة من حذف هذا الكائن، ولكن على عكس المرجع الضعيف، سيكون قادرًا على ذلك لتأجيل هذه العملية حتى يحدث نقص حاد في الذاكرة. نظرًا لهذا الاختلاف بين الروابط الناعمة والروابط الضعيفة، فإن الأول أكثر ملاءمة لذاكرة التخزين المؤقت، وضعيف للبيانات الوصفية. وخير مثال على ذلك هو فئة WeakHashMap، وهي سليل واجهة Map مثل فئات HashMap أو TreeMap ، ولكن مع ميزة واحدة مميزة. يقوم WeakHashMap بتغليف المفاتيح كمراجع ضعيفة، مما يعني أنه بمجرد عدم وجود مراجع قوية لكائن ما، فإن المراجع الضعيفة الموجودة داخل WeakHashMap لن تنقذك من أداة تجميع البيانات المهملة. الروابط الوهمية هي النوع الثالث من الروابط المتوفرة في الحزمة java.lang.ref. يتم تمثيل المراجع الوهمية بواسطة فئة java.lang.ref.PhantomReference . يمكن للمجمع حذف الكائن المشار إليه فقط من خلال الروابط الوهمية في أي وقت. يتم إنشاء الرابط الوهمي بنفس طريقة إنشاء الرابط الضعيف أو الناعم.
DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference
PhantomReference phantom = new PhantomReference(digit); // phantom reference
digit = null;
بمجرد مسح المراجع القوية لكائن DigitalCounter، سيقوم جامع البيانات المهملة بحذفه في أي وقت، حيث إن المراجع الوهمية فقط هي التي تشير إليه الآن. بالإضافة إلى فئات WeakReference وSoftReference وPhantomReference وWeakHashMap، من المفيد التعرف على فئة ReferenceQueue . يمكنك استخدام هذه الفئة عند إنشاء كائن WeakReference، أو SoftReference، أو PhantomReference:
ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter digit = new DigitalCounter();
PhantomReference phantom = new PhantomReference(digit, refQueue);
ستتم إضافة مرجع الكائن إلى قائمة الانتظار ويمكنك مراقبة حالة المراجع عن طريق استقصاء قائمة الانتظار. يتم تمثيل دورة حياة الكائن بشكل جيد في هذا الرسم البياني: الاختلافات بين المراجع الضعيفة واللينة والوهمية والعادية في Java - 2هذا هو كل الاختلافات بين المراجع الضعيفة والضعيفة في Java . تعرفنا أيضًا على الروابط الوهمية وفئة WeakHashMap و ReferenceQueue . إن استخدام المراجع بشكل صحيح سيساعد في جمع البيانات المهملة وسيؤدي إلى إدارة أكثر مرونة للذاكرة في Java . المقالة الأصلية
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION