سؤال

وأنا على دراية WeakReference, ولكن أنا أبحث عن نوع الإشارة التي يتم تطهيرها فقط عند انخفاض ذاكرة ، ليس فقط في كل مرة عندما gc أشواط (مثل جافا SoftReference).أنا أبحث عن وسيلة لتنفيذ الذاكرة الحساسة ذاكرة التخزين المؤقت.

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

المحلول

لا لم يكن هناك ما يعادلها. هل هناك سبب معين لماذا سوف WeakReference لا قيام بهذه المهمة؟

وهنا سؤال مشابه لسؤالك:

لماذا لا توجد الآن ' ر. NET ديك SoftReference فضلا عن WeakReference، مثل جافا؟

نصائح أخرى

ربما ASP.NET فئة ذاكرة التخزين المؤقت (النظام.ويب.التخزين المؤقت.ذاكرة التخزين المؤقت) قد تساعد في تحقيق ما تريد ؟ فإنه تلقائيا إزالة الأشياء إذا كان يحصل الذاكرة منخفضة:

وهنا مقال يوضح كيف يتم استخدام ذاكرة التخزين المؤقت الدرجة في تطبيق نماذج windows.

وبالإضافة إلى ذاكرة التخزين المؤقت ASP.NET، هناك التخزين المؤقت التطبيق كتلة من أنماط مايكروسوفت والممارسات المجموعة.

http://msdn.microsoft.com/en-us/library /cc309502.aspx

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

Foo cachedData = new Foo();
WeakReference weakRef = new WeakReference( cachedData );
HttpRuntime.Cache[Guid.NewGuid().ToString()] = cachedData;

...

if ( weakRef.IsAlive )
{
    Foo strongRef = weakRef.Target as Foo;
}

هل يمكن إنشاء فئة SoftReference من خلال توسيع WeakReference على غرار

class SoftReference : WeakReference
{
    public SoftReference( object target ) : base( target )
    {
        HttpRuntime.Cache[Guid.NewGuid().ToString()] = target; 
    }
}

وأنت كنت بحاجة أيضا لتجاوز واضع على الهدف للتأكد من أن أي هدف جديد يذهب إلى ذاكرة التخزين المؤقت.

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

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

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

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