.صافي تجزئة كومة الذاكرة المؤقتة عند استخدام MSMQ المتزامن IO

StackOverflow https://stackoverflow.com//questions/12674074

  •  12-12-2019
  •  | 
  •  

سؤال

لدي طلب أن يقرأ من كمية كبيرة من قوائم انتظار MSMQ(حوالي 10000 في هذه اللحظة).يمكنني استخدام queue.BeginPeek مع UInt32.MaxValue مهلة تلقي الرسالة من قائمة الانتظار.عندما تظهر الرسالة في قائمة الانتظار, لقد العملية و الاتصال queue.BeginPeek مرة أخرى.لذلك أنا استمع إلى جميع قوائم الانتظار ، ولكن الرسالة تتم المعالجة على تجمع مؤشرات الترابط.

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

ويبدو أن حالة شائعة عند التعامل مع المكالمات إلى التعليمات البرمجية غير المدارة, أن خلق معلقة الكائنات.ولكن لم أجد أي حل في الإنترنت.

لذلك هو إدارة الذاكرة في .صافية نقية جدا, أنه لا يسمح كاملة حتى هذه السيناريوهات البسيطة ، أو فاتني شيء ؟

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

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

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

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

المحلول

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

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

نصائح أخرى

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

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