إذا لم يكن للكائن الموجود في الذاكرة أي مرجع ، فهذا يعني أن الكائن لم يعد يستخدم ، ويمكن أن يصبح مرشحًا لجمع القمامة. ومع ذلك ، نظرًا لأن وقت تشغيل جامع القمامة غير مؤكد ، فإن وقت إعادة التدوير الفعلي للكائنات التي يمكن جمعها غير مؤكد. بالنسبة لكائن ما ، طالما كان هناك مرجع ، فسيكون موجودًا دائمًا في الذاكرة. إذا كان هناك المزيد والمزيد من الكائنات مثل هذا ، فتجاوز إجمالي الذاكرة في JVM ، سيلقي JVM خطأ OutofMemory. على الرغم من أن JVM يتم التحكم في التشغيل المحدد لجمع القمامة ، إلا أنه لا يزال بإمكان المطورين التفاعل مع جامع القمامة إلى حد ما ، والغرض من ذلك هو مساعدة جامع القمامة بشكل أفضل في إدارة ذاكرة التطبيق. طريقة التفاعل هذه هي استخدام حزمة java.lang.ref التي أدخلتها JDK 1.2.
1 اقتباس قوي
الاستشهادات القوية هي الاستشهادات الأكثر شيوعا المستخدمة. إذا كان للكائن مرجعًا قويًا ، فلن يقوم جامع القمامة بإعادة تدويره أبدًا. عندما تكون مساحة الذاكرة غير كافية ، تفضل الجهاز الظاهري Java إلقاء خطأ OutofMemoryError للتسبب في إنهاء البرنامج بشكل غير طبيعي ، ولن يتم إعادة تدوير الكائنات مع إشارات قوية لحل مشكلة الذاكرة غير الكافية.
على سبيل المثال ، تاريخ تاريخ = تاريخ جديد () ، التاريخ هو إشارة قوية إلى كائن. يمكن تمرير إشارات قوية إلى الكائنات في كل مكان في البرنامج. في كثير من الحالات ، ستشير مراجع متعددة إلى نفس الكائن في نفس الوقت. إن وجود مراجع قوية يحد من وقت بقاء كائن ما في الذاكرة. إذا كان الكائن A يحتوي على مرجع قوي للكائن B ، فعند عام ، فلن يكون وقت بقاء الكائن B أقصر من الكائن A. إذا لم يكن الكائن A لا يعين بشكل صريح مرجع الكائن B إلى NULL ، فقط بعد أن يتم جمع القمامة A الكائن B لم يعد لديه مرجع يشير إليه ، وسيكون من الممكن الحصول على فرصة تجميع الملابس.
رمز المثال:
package com.skywang.java ؛ public class StrongReferencetest {public static void main (string [] args) {myDate date = new myDate () ؛ System.gc () ؛ }} نتائج التشغيل:
<لا إخراج>
توضح النتيجة أنه على الرغم من أن جمع القمامة يسمى صراحة ، إلا أنه مرجع قوي للتاريخ ، ولا يتم إعادة تدوير التاريخ.
بالإضافة إلى المراجع القوية ، توفر حزمة java.lang.ref طرق مرجعية مختلفة لكائن. يتمتع جامع القمامة في JVM طرق مختلفة للتعامل مع أنواع مختلفة من المراجع.
2 اقتباسات ناعمة
إذا كان للكائن مراجع ناعمة فقط ، فإن مساحة الذاكرة كافية ولن يقوم جامع القمامة بإعادة تدويره ؛ إذا كانت مساحة الذاكرة غير كافية ، فسيتم إعادة تدوير ذاكرة هذه الكائنات. طالما أن جامع القمامة لا يعيد تدويره ، يمكن استخدام الكائن من قبل البرنامج. يمكن استخدام المراجع الناعمة لتنفيذ ذاكرة التخزين المؤقت الحساسة للذاكرة.
يمكن استخدام مرجع ناعم بالاقتران مع قائمة انتظار مرجعية (مرجعية). إذا تم إعادة تدوير الكائن المشار إليه بواسطة المرجع الناعم بواسطة جامع القمامة ، فسيضيف جهاز Java Virtual مرجعًا ناعمًا إلى قائمة الانتظار المرجعية المرتبطة به.
المراجع الناعمة أضعف من المراجع القوية في القوة ويتم تمثيلها من خلال الإحسان. تتمثل وظيفتها في إخبار جامع القمامة أي الكائنات في البرنامج أقل أهمية ويمكن إعادة تدويرها مؤقتًا عندما لا تكون هناك ذاكرة كافية. عندما لا تكون هناك ذاكرة كافية في JVM ، فإن جامع القمامة سيحرر الكائنات التي تتم الإشارة إليها فقط من خلال المراجع الناعمة. إذا تم إصدار كل هذه الكائنات ولم تكن الذاكرة غير كافية ، فسيتم طرح خطأ OutofMemory. المراجع الناعمة مثالية لإنشاء ذاكرة التخزين المؤقت. عندما يكون النظام غير كافٍ ، يمكن إصدار محتويات ذاكرة التخزين المؤقت. على سبيل المثال ، فكر في برنامج محرر الصور. سيقوم البرنامج بقراءة جميع محتويات ملف الصورة في الذاكرة لسهولة المعالجة. يمكن للمستخدمين أيضًا فتح ملفات متعددة في نفس الوقت. عندما يكون هناك الكثير من الملفات التي تم فتحها في نفس الوقت ، فقد يتسبب ذلك في عدم كفاية ذاكرة. إذا تم استخدام المراجع اللينة للإشارة إلى محتويات ملف الصورة ، فيمكن لمجمع القمامة استعادة هذه الذاكرة عند الضرورة.
رمز المثال:
package com.skywang.java ؛ import java.lang.ref.softreference ؛ فئة عامة softreferencetest {public static void main (string [] args) {softreference ref = new softreference (new mydate ()) ؛ المرجعية. drainmemory () ؛ }} نتائج التشغيل:
<لا إخراج>
النتائج: عندما تكون الذاكرة غير كافية ، يتم إنهاء المرجع الناعم. عندما تحظر المراجع اللينة ،
المرجع softreference = softreference جديد (myDate جديد ()) ؛ ReferenCetest.drainMemory () ؛
أي ما يعادل
MyDate Date = new MyDate () ؛ // الأمر متروك لـ JVM لتشغيله إذا (jvM.Insufficaw Memory ()) {date = null ؛ System.gc () ؛} 3 اقتباسات ضعيفة
المرجع الضعيف أضعف من المرجع الناعم في القوة ويتم التعبير عنه بواسطة فئة الضعف. الغرض منه هو الرجوع إلى كائن ، لكنه لا يمنع إعادة تدوير الكائن. إذا تم استخدام مرجع قوي ، طالما وجود المرجع ، لا يمكن إعادة تدوير الكائن المشار إليه. الاستشهادات الضعيفة ليس لديها هذه المشكلة. عند تشغيل جامع القمامة ، إذا كانت جميع الإشارات إلى كائن ما هي مراجع ضعيفة ، فسيتم إعادة تدوير الكائن. تتمثل وظيفة المراجع الضعيفة في حل علاقة الاقتران بين الكائنات في وقت البقاء على قيد الحياة التي جلبتها المراجع القوية. الاستخدام الأكثر شيوعًا للمراجع الضعيفة هو في فصول التجميع ، وخاصة في جداول التجزئة. تتيح واجهة جدول التجزئة استخدام أي كائن Java كمفتاح. عندما يتم وضع زوج القيمة الرئيسية في جدول التجزئة ، فإن كائن جدول التجزئة نفسه لديه إشارة إلى كائنات المفتاح والقيمة هذه. إذا كانت هذه المرجع مرجعًا قويًا ، فما طالما أن كائن جدول التجزئة نفسه لا يزال حياً ، فلن يتم إعادة تدوير كائنات المفتاح والقيمة الموجودة فيه. إذا كان جدول التجزئة مع وقت بقاء طويل يحتوي على العديد من أزواج القيمة الرئيسية ، فقد يستهلك في النهاية كل الذاكرة في JVM.
يتمثل حل هذا الموقف في استخدام المراجع الضعيفة للإشارة إلى هذه الكائنات بحيث يمكن جمع كل من المفتاح والقيمة في جدول التجزئة. يتم توفير DephashMap في Java لتلبية هذه الحاجة المشتركة.
نموذج الرمز:
package com.skywang.java ؛ import java.lang.ref.weakReference ؛ public class preferreferencetest {public static void main (string [] args) {defentReferenference ref = new preferference (new mydate ()) ؛ System.gc () ؛ }} نتائج التشغيل:
OBJ [التاريخ: 1372142034360] هو GC
النتائج: عندما يتم تشغيل جمع القمامة JVM ، يتم إنهاء المراجع الضعيفة.
DepReference Ref = New Deperference (new myDate ()) ؛ system.gc () ؛
أي ما يعادل:
MyDate Date = New MyDate () ؛ // Garbage Collection if (jvM.Insufficaw Memory ()) {date = null ؛ System.gc () ؛} الفرق بين المراجع الضعيفة والمراجع الناعمة هو أن الكائنات ذات المراجع الضعيفة فقط لها دورة حياة أقصر. أثناء عملية سلسلة جامع القمامة ، يقوم بمسح منطقة الذاكرة تحت اختصاصه ، بمجرد العثور على كائن مع مراجع ضعيفة فقط ، سيتم إعادة تدوير ذاكرته بغض النظر عما إذا كانت مساحة الذاكرة الحالية كافية أم لا. ومع ذلك ، نظرًا لأن جامع القمامة هو خيط ذو أولوية منخفضة للغاية ، فقد لا يتم اكتشافه بالضرورة بسرعة كبيرة للكائنات التي لها مراجع ضعيفة فقط.
يمكن استخدام مرجع ضعيف بالاقتران مع قائمة انتظار مرجعية (مرجعية). إذا تم جمع الكائن المشار إليه بواسطة مرجع ضعيف تم جمعه ، فسيضيف جهاز Java Virtual مرجعًا ضعيفًا إلى قائمة الانتظار المرجعية المرتبطة به.
4 اقتباسات الوهم
المعروف أيضًا باسم اقتباسات Ghost ~ قبل تقديم اقتباسات Ghost ، يجب علينا أولاً تقديم آلية إنهاء الكائنات التي توفرها Java. هناك طريقة الانتهاء في فئة الكائن. القصد الأصلي لتصميمه هو أداء بعض أعمال التنظيف قبل إعادة تدوير الكائن بالفعل. نظرًا لأن Java لا توفر آلية مماثلة لـ C ++ Destructor ، فسيتم تنفيذها من خلال طريقة الانتهاء. لكن المشكلة هي أن وقت تشغيل جامع القمامة غير ثابت ، لذلك لا يمكن التنبؤ بوقت التشغيل الفعلي لعمل التنظيف هذا. يمكن أن تحل مرجع الوهمية هذه المشكلة. عند إنشاء فانتومري مرجع شبح ، يجب عليك تحديد قائمة انتظار مرجعية. عندما يتم استدعاء طريقة الانتهاء من كائن ، سيتم إضافة مرجع الشبح للكائن إلى قائمة الانتظار. من خلال التحقق من المحتويات في قائمة الانتظار ، ستعرف ما إذا كان الكائن جاهزًا لإعادة تدويره.
استخدام مراجع الأشباح وقوائمهم أمر نادر الحدوث ، ويستخدم بشكل أساسي لتنفيذ التحكم في استخدام الذاكرة بشكل جيد نسبيًا ، وهو أمر ذي معنى للغاية للأجهزة المحمولة. يمكن للبرنامج أن يطلب الذاكرة لإنشاء كائن جديد بعد تحديد كائن ما سيتم إعادة تدويره. وبهذه الطريقة ، يمكن الحفاظ على الذاكرة التي يستهلكها البرنامج بكمية منخفضة نسبيًا.
على سبيل المثال ، يعطي الرمز التالي مثالًا على تنفيذ المخزن المؤقت.
الفئة العامة phantombuffer {private byte [] data = new byte [0] ؛ referencequeue الخاص <byte []> Queue = new ReferenceQueue <byte []> () ؛ phantomreference الخاص <byte []> Ref = new phantomreference <byte []> (البيانات ، قائمة الانتظار) ؛ البايت العام [] GET (int size) {if (size <= 0) {refl new alficalArgumentException ("حجم المخزن المؤقت الخطأ") ؛ } if (data.length <size) {data = null ؛ System.gc () ؛ // Force Run the Collector Try {Queue.Remove () ؛ // سيتم حظر هذه الطريقة حتى تكون قائمة الانتظار غير فارغة ref.clear () ؛ // لن يتم مسح مرجع Ghost تلقائيًا ، يجب تشغيل Ref = NULL ؛ البيانات = بايت جديد [الحجم] ؛ المرجع = new phantomreference <byte []> (البيانات ، قائمة الانتظار) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ }} إرجاع البيانات ؛ }} في الكود أعلاه ، في كل مرة يتم فيها تطبيق المخزن المؤقت الجديد ، يتم التأكد أولاً من إعادة تدوير صفيف البايت للمخزن المؤقت السابق بنجاح. طريقة إزالة الإزالة التي تشير إلى أن قائمة الانتظار ستحظر حتى يتم إضافة مرجع شبح جديد إلى قائمة الانتظار. ومع ذلك ، تجدر الإشارة إلى أن هذا النهج سيؤدي إلى تشغيل جامع القمامة عدة مرات ، مما قد يتسبب في أن يكون البرنامج منخفضًا للغاية.
نموذج الرمز:
package com.skywang.java ؛ import java.lang.ref.referencequeue ؛ import java.lang.ref.phantomReference ؛ public class phantomreferencetest {public static void main (string [] args) {Quepenue Queue = new ReferenceQueue () ؛ مرجع phantomreference = new phantomreference (myDate () جديد ، قائمة الانتظار) ؛ System.gc () ؛ }} نتائج التشغيل:
OBJ [التاريخ: 1372142282558] هو GC
توضح النتيجة أن مرجع الوهم يتم إنهاء بعد إنشاء مثيل.
Queue reference referequeue = new ReferenceQueue () ؛ phantomreference ref = new phantomreference (myDate () جديد ، قائمة الانتظار) ؛ system.gc () ؛
أي ما يعادل:
MyDate Date = new MyDate () ؛ Date = null ؛