2010-07-05 19 views
11

हमारे पास 512 एमबी रैम वाला एक छोटा टेक्स्ट बॉक्स है। हम देखना चाहते थे कि हम इस बॉक्स में जावा में कितने धागे बना सकते हैं। हमारे आश्चर्य के लिए, हम कई नहीं बना सकते हैं। अनिवार्य रूप से न्यूनतम स्टैक आकार जिसे आप -Xss के साथ सेट कर सकते हैं 64k है। सरल गणित आपको बताएगा कि 64 * 7000 430Mb की खपत होगी इसलिए हम केवल 7000 धागे या तो चारों ओर करने के लिए इसे प्राप्त करने में सक्षम थे और उसके बाद हम इस त्रुटि का सामना करना पड़ा:जावा थ्रेड की अधिकतम संख्या पर बहुत सीमित है?

java.lang.OutOfMemoryError: unable to create new native thread. 

इस जावा के साथ सच सीमा है? प्रति 512 एमबी रैम हम केवल 7k धागे में निचोड़ सकते हैं या तो?

+1

क्या आपको वाकई उन धागे की ज़रूरत है? मशीन के कितने सीपीयू/कोर हैं? – Bwmat

+0

हम कई ग्राहकों का समर्थन करने की योजना बना रहे हैं। यह वर्चुअल क्लाउड पर होस्ट किया गया है, इसलिए सुनिश्चित नहीं है। – erotsppa

+17

यदि आपको 7000 मूल धागे की आवश्यकता है, तो आपके आवेदन में गंभीर डिजाइन दोष है। –

उत्तर

2

यह प्रोग्रामिंग भाषा नहीं है, यह ऑपरेटिंग सिस्टम स्तर पर है। इसके बारे में

अधिक पढ़ने, विंडोज के लिए:

+0

इस व्यक्ति के मामले में, वे कर्नेल सीमा को कभी भी हिट करने से पहले स्मृति सीमा को मार रहे हैं। –

+0

@ जेसन - वास्तव में, मैंने रास्ते पर "OutOfMemoryError" को याद किया। – Gnoupi

+3

मेरा मानना ​​है कि "आउटऑफमेमरी एरर: नया मूल धागा बनाने में असमर्थ" * आउटऑफमेमरी एरर होने के बावजूद ओएस की प्रति-प्रक्रिया थ्रेड सीमा के कारण हो सकता है। हालांकि उस पर 100% निश्चित नहीं है। – ColinD

2

ध्यान रखें कि आप राम की 100% समर्पित करने में सक्षम नहीं होगा जावा धागे चलाने के लिए। कुछ रैम ओएस और अन्य चल रहे अनुप्रयोगों द्वारा उपयोग किया जाता है, जिसका अर्थ है कि आपके पास पूर्ण 512 एमबी उपलब्ध नहीं होगा।

0

अधिकतम मेमोरी को सेट करने का प्रयास करें- एक्सएमएक्स को कम मूल्य पर देखें और देखें कि थ्रेड गिनती बढ़ाई जा सकती है या नहीं। काम पर एक परियोजना में मैं -Xmx512m के साथ लगभग 2,5k धागे आवंटित कर सकता हूं और लगभग 4k धागे -Xmx96m के साथ आवंटित कर सकता हूं।

आपके थ्रेड स्टैक स्पेस को कम से कम अपने ढेर को बड़ा करें (कम से कम मेरे अनुभव के लिए)।

3

एक बार जब आप अपना 7k धागे बनाते हैं, तो आपको कुछ भी उपयोगी करने की कोई स्मृति नहीं होगी। शायद आपको अपने आवेदन के डिजाइन के बारे में पुनर्विचार होना चाहिए?

वैसे भी, 512 एमबी काफी छोटा नहीं है? शायद आप अपने आवेदन या शायद डोमेन के बारे में कुछ और जानकारी प्रदान कर सकते हैं?

8

एसिंक्रोनस आईओ (जावा एनओओ) का उपयोग करें और आपको 7k क्लाइंट्स का समर्थन करने के लिए 7k धागे की आवश्यकता नहीं होगी, आईओ (5?) को संभालने के लिए कुछ धागे पर्याप्त होंगे।
Netty पर एक नज़र डालें;)

प्रत्येक क्लाइंट के लिए एक थ्रेड वास्तव में खराब डिज़ाइन है।

+0

क्या अभी भी एनओओ धागे की संख्या पर एक सीमा है? मैं अब एक तीसरी पार्टी लाइब्रेरी से निपट रहा हूं जो लगता है कि हजारों धागे बना रहे हैं, यह nio tho का उपयोग कर रहा है ... ओपी द्वारा वर्णित एक ही त्रुटि का कारण बनता है ... –

1

आपको क्लाइंट सत्र प्रति एक थ्रेड की आवश्यकता नहीं है। यदि आप इस तरह से देखते हैं कि एक जे 2 ईई (या जावाईई) सर्वर एकाधिक कनेक्शन को संभालता है तो यह समवर्ती, क्यूइंग और स्वैपिंग सहित रणनीतियों के मिश्रण का उपयोग करता है। आम तौर पर आप अपने आवेदन के प्रदर्शन को ट्यून करने के लिए तैनाती के समय पर लाइव समवर्ती उदाहरणों और निष्क्रिय समय-समय मानों की अधिकतम संख्या कॉन्फ़िगर कर सकते हैं।

संबंधित मुद्दे