سؤال

أنا أتساءل كيف أنها مكلفة إلى العديد من المواضيع في انتظار الدولة في جافا 1.6 x64.

أن تكون أكثر تحديدا ، أنا أكتب التطبيق الذي يمتد عبر العديد من أجهزة الكمبيوتر و يرسل/يستقبل البيانات من واحد إلى آخر.أشعر بالراحة أكثر أن يكون ترابط منفصل لكل متصل آلة مهمة ، مثل 1) إرسال البيانات ، 2) تلقي البيانات ، 3) إعادة تأسيس اتصال عند إسقاطه.وذلك بالنظر إلى أن هناك ن العقد في نظام المجموعة ، كل آلة ستكون لدينا 3 مواضيع لكل من N-1 الجيران.عادة سيكون هناك 12 الآلات ، والتي يأتي إلى 33 الاتصالات المواضيع.

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

لذلك ليس هناك أي أهمية الأداء أثر على وجود العديد من ينام المواضيع ؟

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

المحلول

في معظم الحالات الموارد المستهلكة قبل النوم الموضوع سيكون مساحة مكدس.باستخدام 2-المواضيع-في-الاتصال-نموذج ، والتي أعتقد أنها مشابهة إلى ما تصفه, ومن المعروف أن يسبب قابلية كبيرة القضايا لهذا السبب بالذات عند عدد الاتصالات تنمو كبيرة.

لقد كنت في هذه الحالة نفسي عند عدد الاتصالات نما فوق 500 اتصالات (حوالي ألف المواضيع), كنت تميل إلى الحصول على الكثير من الحالات حيث يمكنك الحصول على OutOfMemoryError منذ المواضيع كومة استخدام مساحة تتجاوز الحد الأقصى لمقدار الذاكرة لعملية واحدة.على الأقل في هذه الحالة ، الذي كان في جافا على 32 بت ويندوز العالم.يمكنك ضبط الأمور والحصول على أبعد قليلا, أعتقد, ولكن في النهاية انها مجرد ليست قابلة للغاية منذ أن كنت تضيع الكثير من الذاكرة.

إذا كنت تحتاج إلى عدد كبير من اتصالات, جافا NIO (new IO أو أيا كان) هو الطريق للذهاب ، مما يجعل من الممكن التعامل مع الكثير من الاتصالات في نفس الموضوع.

وقد قلت ذلك, يجب أن لا تواجه مشكلة كبيرة مع تحت 100 على المواضيع معقول الحديثة الخادم ، حتى لو كان وربما لا يزال مضيعة للموارد.

نصائح أخرى

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

Swithcing إلى NIO زيادة عدد الاتصالات يمكننا التعامل مع الكثير ، والتي كان من الأهمية بمكان بالنسبة لنا.

هذا لن نطاق جيد جدا.وجود عدد كبير من المواضيع يعني VM أن تنفق المزيد من الوقت في سياق تبديل الذاكرة الاستخدام سوف يكون أعلى بسبب كل موضوع يتطلب الخاصة بها مساحة مكدس.يمكنك أن تكون أفضل حالا مع عدد أصغر من المواضيع المعالجة في خط الأزياء ، أو استخدام الخيط تجمع مع asychronous التقنيات.

الكثير من المواضيع يعني أن الكثير من مساحة مكدس الذي سوف يأكل الذاكرة الخاصة بك - التحقق من -Xss إعدادات فقط كم ، ثم تفعل الرياضيات.

وإذا كنت من أي وقت مضى للقيام notifyAll() لسبب ما ، ثم بالطبع كنت الاستيقاظ الكثير من المواضيع إضافية - على الرغم من أنك قد لا تحتاج إلى القيام بذلك في البنيان.

أنا لست متأكد من أنك يمكن بسهولة تجنب وجود موضوع واحد في الاستماع مأخذ في هذا النموذج (على الرغم من أنني أعرف القليل جدا عن NIO - والتي قد تصلح حتى أن مسألة) ولكن نلقي نظرة على java.util.المتزامنة.المنفذ واجهة تنفيذها فصول الكريم طريقة لتجنب وجود الكثير من خيوط إضافية التسكع.في الواقع ، ThreadPoolExecutor قد تكون طريقة جيدة لإدارة الاستماع المواضيع جدا, لذلك كنت لا تنفق الكثير من الوقت في خلق وتدمير المواضيع unneccessarily.

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

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