سؤال

أتساءل كيف تعمل المراجع الضعيفة داخليا، على سبيل المثال في .NET أو في Java. أفكاري العامة هي:

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

أي من هذه الحلول تبدو نظيفة أو فعالة. هل يعرف أحد كيف يتم القيام به بالفعل؟

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

في .NET، عندما WeakReference يتم إنشاؤه، يطلب من GC عن رمز مقبض / مبهمة يمثل المرجع. ثم، عند الحاجة، WeakReference يستخدم هذا المقبض لطرح GC إذا كان هذا المقبض لا يزال ساري المفعول (أي الكائن الأصلي لا يزال موجودا) - وإذا كان الأمر كذلك، فيمكنه الحصول على مرجع كائن فعلي.

لذلك يقوم هذا ببناء قائمة من الرموز / المقابض ضد عناوين الكائنات (وفترض أنه الحفاظ على هذه القائمة أثناء إلغاء التجزئة وغيرها)

لست متأكدا من أنني أفهم 100٪ الرصاص الثلاث، لذلك أتردد في تخمين أي (إن وجد) الأقرب إليه.

يبدو أن تنفيذ المراجع الضعيفة يتم الاحتفاظ به جيدا في هذه الصناعة ؛-). على سبيل المثال، اعتبارا من الآن، ويكيبيديا المادة يفتقر إلى أي تفاصيل التنفيذ. والنظر في الإجابات أعلاه (بما في ذلك المقبول): "إلقاء نظرة على المصدر" أو "أعتقد"؛ - .

من بين جميع الإجابات، فقط المرجع المرجعية PYTHON's PEP 205 مرجعية. كما يقول، لأي كائن واحد، يمكن أن يكون هناك مرجع ضعيف واحد، إذا كنا نعامل ضعف كيان نفسه.

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

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

وكما يكون للكائن مؤشرا إلى ضعفه، ثم يمكن للكائن إلغاء الضعيف في المدمر الخاص.

هذا التنفيذ هو نظيف جدا (بدون سحر "يدعو إلى GC" والأشياء) وتكلفة وقت التشغيل O (1). بالطبع، من الجشع جدا من الذاكرة - تحتاج إلى إضافة حقل مؤشر +1 إلى كل كائن، على الرغم من وجود كائنات 90 +٪ ستكون فارغة. بالطبع، VHLLs لديها بالفعل ذاكرة كبيرة واحدة لكل كائن، وقد تكون هناك فرصة لإيصال الحقول "الإضافية" المختلفة. على سبيل المثال.

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

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

بالمناسبة، إذا كنت تصميم إطارا قائم على GC، أود أن أضيف بعض الأشياء الجيدة الأخرى: (1) وسيلة لإعلان نوع مرجعي مكان التخزين كما عقد مرجع يهم في المقام الأول لشخص آخر، و (2) مجموعة متنوعة من WeakReference والتي من شأنها أن تشير إلى أن المراجع الوحيدة إلى كائن في مواقع تخزين "ذات الاهتمام لشخص آخر". برغم من WeakReference هو نوع مفيد، إن فعل تحويل إشارة ضعيفة إلى مرجع قوي قد يمنع النظام من أي وقت مضى الاعتراف من أي وقت مضى أنه لا يجني أحد أن هدفه اختفى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top