طرح McGoverntheory هذا السؤال في Stackoverflow:
كم عدد المواضيع التي يدعمها جهاز Java Virtual Machine على الأكثر؟ هل هو مرتبط بمطوري الماكينة الظاهرية؟ ماذا عن نظام التشغيل؟ هل هناك أي عوامل أخرى؟
إجابة إدي:
يعتمد ذلك على وحدة المعالجة المركزية التي تستخدمها ، ونظام التشغيل ، وما تفعله العمليات الأخرى ، وإصدار Java الذي تستخدمه ، وعوامل أخرى. لقد رأيت خادم Windows يحتوي على أكثر من 6500 مؤشر ترابط قبل أن ينخفض. بالطبع ، معظم المواضيع لا تفعل شيئًا. بمجرد أن يكون هناك ما يقرب من 6500 موضوع (في Java) على الجهاز ، سيبدأ الجهاز في مواجهة مشاكل وتصبح غير مستقرة.
في تجربتي ، ترتبط المواضيع الموجودة في JVM بشكل إيجابي بأداء الكمبيوتر نفسه.
بالطبع ، تحتاج إلى الحصول على ما يكفي من الذاكرة الأصلية وتخصيص ذاكرة كافية لـ Java بحيث يمكن أن يكون لكل مؤشر ترابط مكدس (مكدس الجهاز الظاهري) ويمكنه فعل ما تريد. يمكن لأي آلة ذات وحدة المعالجة المركزية الحديثة (AMD أو AMD أو Intel الأخيرة) وذاكرة 1-2G (اعتمادًا على نظام التشغيل) أن تدعم بسهولة جهاز Java الظاهري مع آلاف الخيوط.
إذا كنت بحاجة إلى إجابة أكثر دقة ، فمن الأفضل إجراء اختبار التوتر بنفسك.
إجابة تشارلي مارتن:
هناك العديد من المعلمات (يمكن تعيينها). بالنسبة للأجهزة الافتراضية المحددة ، سيكون لديهم معلمات وقت التشغيل الخاصة بهم. (الحد الأقصى لعدد المواضيع) إلى حد ما ، يتم تحديده بواسطة نظام التشغيل: ما هو الدعم الذي يجب أن يوفره نظام التشغيل الأساسي للمواضيع؟ ما هي القيود المفروضة؟ هل يستخدم الجهاز الظاهري مؤشر ترابط نظام التشغيل الأصلي ، أو الخيط الأحمر أو الخيط الأخضر؟
يعد الدعم الذي يقدمه نظام التشغيل مشكلة أخرى. إذا كتبت برنامج Java مثل هذا:
نسخة الكود كما يلي:
فئة dileikeadog {
الفراغ الثابت العام الرئيسي (سلسلة [] argv) {
ل(؛؛){
موضوع جديد (جديد somerunaable) .start () ؛
}
}
}
(لا تشتكي من تفاصيل بناء الجملة ، هذا قد بدأ للتو) ثم بالطبع تريد الحصول على مئات من المواضيع الجري. ومع ذلك ، فإن تكلفة إنشاء خيط مرتفعة نسبيًا ، وتصبح الجدولة (الكثير من المواضيع) بارزة. لا يزال من غير المؤكد ما إذا كانت هذه الخيوط يمكن أن تفعل أشياء مفيدة.
نسخة ترقية
حسنًا ، لا أطيق الانتظار! فيما يلي برنامج اختبار صغير كان مصقولًا قليلاً:
انسخ الرمز على النحو التالي: الفئة العامة Dielikeadog {
كائن ثابت خاص S = كائن جديد () ؛
العدد الثابت الخاص الثابت = 0 ؛
الفراغ الثابت العام الرئيسي (سلسلة [] argv) {
ل(؛؛){
موضوع جديد (جديد RunNable () {
تشغيل الفراغ العام () {
متزامن (s) {
العد += 1 ؛
System.err.println ("Thread #"+count) ؛
}
ل(؛؛){
يحاول {
thread.sleep (1000) ؛
} catch (استثناء e) {
System.err.println (e) ؛
}
}
}
}).يبدأ()؛
}
}
}
على نظام Intel OS/X 10.5.6 ، فإن إخراج Java 5 هو كما يلي:
نسخة الكود كما يلي:
موضوع جديد #2547
موضوع جديد #2548
موضوع جديد #2549
لا يمكن إنشاء موضوع: 5
موضوع جديد #2550
استثناء في الموضوع "الرئيسي" java.lang.outofmemoryerror: غير قادر على إنشاء موضوع أصلي جديد
في java.lang.thread.start0 (الطريقة الأصلية)
في java.lang.thread.start (thread.java:592)
في dielikeadog.main (dielikeadog.java:6)
إجابة بنيميث:
بعد قراءة رد تشارلي مارتن ، كنت أتساءل عما إذا كان حجم ذاكرة الكومة يمكن أن يحدث فرقًا في عدد المواضيع التي تم إنشاؤها ، ثم أدهشني النتيجة: على نظام Vista Home Premium SP1 ، باستخدام JDK 1.6.0_11 ، قم بتعيين حجم ذاكرة الكومة من 2M إلى 1024m لتنفيذ برنامج اختبار Charlie. على سبيل المثال: لإنشاء ذاكرة كومة 2M ، فإن معلمات الجهاز الظاهري الذي أستخدمه هي: -xms2m -xmx2m.
ها هي نتائج الاختبار الخاصة بي:
انسخ الرمز على النحو التالي: 2 ميغابايت -> 5744 مؤشرات ترابط
4 ميغابايت -> 5743 موضوعات
8 ميغابايت -> 5735 موضوعات
12 ميغابايت -> 5724 خيوط
16 ميغابايت -> 5712 موضوعات
24 ميغابايت -> 5687 موضوعات
32 ميغابايت -> 5662 موضوعات
48 ميغابايت -> 5610 موضوعات
64 ميغابايت -> 5561 موضوعات
96 ميغابايت -> 5457 موضوعات
128 ميغابايت -> 5357 موضوعات
192 ميغابايت -> 5190 موضوع
256 ميغابايت -> 5014 موضوعات
384 ميغابايت -> 4606 موضوعات
512 ميغابايت -> 4202 موضوعات
768 ميغابايت -> 3388 موضوعات
1024 ميغابايت -> 2583 موضوعات
لذلك ، حجم الكومة مهم حقا. ومع ذلك ، فإن حجم الكومة والحد الأقصى لعدد الخيوط متناسبة عكسيا.
هذا غريب جدا!
إجابة نيل كوفي:
الحد الأقصى للنظرية النظرية المطلقة من مؤشرات الترابط هو مساحة عنوان المستخدم للعملية مقسومًا على حجم مكدس مؤشر الترابط (في الواقع ، إذا تم استخدام جميع الذاكرة بواسطة مكدس مؤشر الترابط ، فلن يكون هناك برنامج يمكن تشغيله). لذلك ، أخذ نظام Windows 32 بت كمثال ، فإن مساحة عنوان المستخدم لكل عملية هي 2G. . في الواقع على نظام XP ، وجدت أنه يمكن بدء حوالي 13000 موضوع.
بعد ذلك ، أعتقد أن سؤالك هو بشكل أساسي: (أ) ما إذا كان يمكنك إدارة العديد من مؤشرات الترابط في الكود الخاص بك بشكل فعال وعدم السماح لهم بالقيام به من الواضح (مثل: دعهم على نفس كائن الكائن (ب) ما إذا كان نظام التشغيل يمكنه إدارة هذه الخيوط العديدة بشكل فعال. في الأساس ، إذا كانت إجابة (أ) هي "نعم" ، فإن إجابة (ب) هي "نعم".
من قبيل الصدفة ، يمكنك تعيين حجم مكدس مؤشر الترابط في مُنشئ مؤشر الترابط ، لكن لا تحتاج إلى عدم الخلط بين هذا مع معلمات الجهاز الظاهري.