जावा थ्रेड निर्माण महंगा है क्योंकि इसमें बहुत कम काम शामिल है:
- थ्रेड स्टैक के लिए स्मृति का एक बड़ा ब्लॉक आवंटित और आरंभीकृत किया जाना है।
- मेजबान ओएस के साथ मूल धागा बनाने / पंजीकृत करने के लिए सिस्टम कॉल करने की आवश्यकता है।
- डेस्क्रिप्टर्स को JVM- आंतरिक डेटा संरचनाओं को बनाना, आरंभ करना और जोड़ना होगा।
यह इस अर्थ में भी महंगा है कि जब तक यह जीवित है, थ्रेड संसाधनों को नीचे रखता है; जैसे धागा स्टैक, स्टैक से आने वाली कोई भी वस्तु, जेवीएम थ्रेड डिस्क्रिप्टर, ओएस देशी थ्रेड डिस्क्रिप्टर।
इन सभी चीजों की लागत प्लेटफ़ॉर्म विशिष्ट है, लेकिन वे मेरे द्वारा कभी भी पार किए गए किसी भी जावा प्लेटफ़ॉर्म पर सस्ते नहीं हैं।
Google खोज ने मुझे एक पुराना बेंचमार्क पाया, जो कि 2002 के विंटेज डुअल प्रोसेसर Xeon पर 2002 के विंटेज लिनक्स पर चलने वाले सन जावा 1.4.1 पर प्रति सेकंड थ्रेड बनाने की दर ~ 4000 था। एक अधिक आधुनिक प्लेटफॉर्म बेहतर संख्या देगा ... और मैं कार्यप्रणाली पर टिप्पणी नहीं कर सकता ... लेकिन कम से कम यह एक बॉलपार्क देता है कि धागा निर्माण कितना महंगा होने की संभावना है।
पीटर लॉरी के बेंचमार्किंग से संकेत मिलता है कि इन दिनों निरपेक्ष रूप से थ्रेड क्रिएशन काफी तेज है, लेकिन यह स्पष्ट नहीं है कि जावा और / या ओएस ... या उच्च प्रोसेसर गति में कितना सुधार है। लेकिन उसकी संख्या अभी भी 150 + गुना सुधार का संकेत देती है यदि आप प्रत्येक बार एक नया थ्रेड बनाने / शुरू करने के लिए थ्रेड पूल का उपयोग करते हैं। (और उन्होंने कहा कि यह सब रिश्तेदार है ...)
(उपर्युक्त "ग्रीन थ्रेड्स" के बजाय "देशी थ्रेड्स" मानता है, लेकिन आधुनिक JVM सभी प्रदर्शन कारणों से देशी थ्रेड्स का उपयोग करते हैं। हरे रंग के धागे संभवतः बनाने के लिए सस्ते होते हैं, लेकिन आप अन्य क्षेत्रों में इसके लिए भुगतान करते हैं।)
मैंने यह देखने के लिए थोड़ी खुदाई की है कि वास्तव में जावा थ्रेड का स्टैक कैसे आवंटित किया जाता है। लिनक्स पर OpenJDK 6 के मामले में, थ्रेड स्टैक को कॉल द्वारा आवंटित किया जाता pthread_create
है जो मूल धागा बनाता है। (JVM pthread_create
एक प्रचारित स्टैक पास नहीं करता है ।)
फिर, pthread_create
स्टैक के भीतर कॉल को mmap
इस प्रकार आवंटित किया जाता है:
mmap(0, attr.__stacksize,
PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
के अनुसार man mmap
, MAP_ANONYMOUS
ध्वज स्मृति को शून्य से आरंभ करने का कारण बनता है।
इस प्रकार, भले ही यह आवश्यक न हो कि नए जावा थ्रेड स्टैक शून्य हैं (JVM कल्पना के अनुसार), व्यवहार में (कम से कम लिनक्स पर OpenJDK 6 के साथ) वे शून्य हैं।