धागे के ढेर के बारे में कुछ चीजें हैं जो Java specification हमें बताती हैं। अन्य चीजों के अलावा:
प्रत्येक जावा वर्चुअल मशीन थ्रेड में एक निजी जावा वर्चुअल मशीन स्टैक है, जो थ्रेड के साथ एक ही समय में बनाया गया है।
क्योंकि जावा वर्चुअल मशीन स्टैक को कभी भी पुश और पॉप फ्रेम को छोड़कर सीधे छेड़छाड़ नहीं की जाती है, फ्रेम को आवंटित किया जा सकता है। जावा वर्चुअल मशीन स्टैक के लिए मेमोरी को संगत होने की आवश्यकता नहीं है।
विशिष्टता जावा वर्चुअल मशीन स्टैक्स को या तो एक निश्चित आकार के होने या गणना के अनुसार आवश्यक गतिशील रूप से विस्तार और अनुबंध करने की अनुमति देती है।
अब, यदि हम हॉटस्पॉट जैसे जेवीएम कार्यान्वयन पर ध्यान केंद्रित करते हैं, तो हम कुछ और जानकारी प्राप्त कर सकते हैं। यहां विभिन्न तथ्यों से एकत्र किए गए कुछ तथ्य दिए गए हैं:
- थ्रेड के लिए हॉटस्पॉट में न्यूनतम स्टैक आकार निश्चित रूप से तय किया गया है। उपर्युक्त
-Xss
विकल्प यह है कि यह है। (Source)
जावा SE 6 में, स्पार्क पर डिफ़ॉल्ट 32-बिट वी एम में 512K, और 64-बिट वी एम में 1024k है। ... आप -Xss विकल्प के साथ चलकर अपने स्टैक आकार को कम कर सकते हैं। ... 64k प्रति थ्रेड की अनुमति देने वाली स्टैक स्पेस की कम से कम मात्रा है।
- JRockit स्मृति ढेर जहां ढेर स्थित हैं से अलग आवंटित करता है। (Source)
ध्यान दें कि JVM सिर्फ ढेर की तुलना में अधिक मेमोरी का उपयोग करता। उदाहरण के लिए जावा विधियों, थ्रेड स्टैक्स और देशी हैंडल को ढेर से अलग स्मृति में आवंटित किया जाता है, साथ ही साथ JVM आंतरिक डेटा संरचनाएं भी आवंटित की जाती हैं।
एक जावा थ्रेड और हॉटस्पॉट में एक देशी ओएस थ्रेड के बीच एक सीधा मानचित्रण है। (Source)।
लेकिन हॉटस्पॉट में जावा थ्रेड स्टैक सॉफ़्टवेयर प्रबंधित है, यह ओएस मूल थ्रेड स्टैक नहीं है। (Source)
यह एक अलग सॉफ्टवेयर ढेर का उपयोग करता जावा तर्क पारित करने के लिए है, जबकि देशी सी ढेर वीएम से ही किया जाता है। जावा जेड के लिए प्रोग्राम काउंटर या स्टैक पॉइंटर जैसे कई जेवीएम आंतरिक चर, सी चर में संग्रहीत हैं, जिन्हें हमेशा हार्डवेयर रजिस्टरों में रखने की गारंटी नहीं है। इन सॉफ़्टवेयर दुभाषिया संरचनाओं का प्रबंधन कुल निष्पादन समय का एक बड़ा हिस्सा खपत करता है।
JVM भी देशी तरीकों और JVM क्रम कॉल (जैसे वर्ग लोड हो रहा है) के लिए एक ही जावा धागा ढेर इस्तेमाल करता है। (Source)।
दिलचस्प बात यह है कि यहां तक कि आवंटित ऑब्जेक्ट्स कभी-कभी प्रदर्शन अनुकूलन के रूप में ढेर पर ढेर पर स्थित हो सकते हैं।(Source)
JVMs एक तकनीक से बच विश्लेषण कहा जाता है, जिसके द्वारा वे बता सकते हैं कि कुछ वस्तुओं अपने पूरे जीवन भर के लिए किसी एकल थ्रेड के लिए सीमित रहते हैं, और कहा कि जीवन भर उपयोग कर सकते हैं एक दिया ढेर के जीवन से घिरा है फ्रेम। इस तरह की वस्तुओं को ढेर के बजाय ढेर पर सुरक्षित रूप से आवंटित किया जा सकता है।
और क्योंकि एक छवि एक हजार शब्दों के लायक है, यहां से James Bloom
एक अब आपके कुछ प्रश्नों का जवाब दे रहा है:
JVM कैसे जानता है कि कैसे हो सकता है धागे होगा बनाया जाना चाहिए?
ऐसा नहीं है। धागे की एक चर संख्या बनाकर विरोधाभास द्वारा आसानी से साबित किया जा सकता है। यह के बारे में कुछ मान्यताओं को और प्रत्येक थ्रेड के ढेर आकार की अधिकतम संख्या बनाता है। यही कारण है कि यदि आप बहुत सारे धागे आवंटित करते हैं तो आप स्मृति से बाहर हो सकते हैं (अर्थात् ढेर स्मृति नहीं!)
क्या जावा इसे बनाए जाने पर प्रत्येक थ्रेड के लिए एक ढेर बनाता है?
जैसा कि पहले उल्लेख, प्रत्येक जावा वर्चुअल मशीन धागा एक निजी जावा वर्चुअल मशीन ढेर, धागे के रूप एक ही समय में बनाई गई है।(Source)।
यदि हां, तो वास्तव में ढेर स्मृति पर कहां है? यह निश्चित रूप से "प्रबंधित" ढेर में नहीं है।
जैसा ऊपर बताया गया है, Java specification ढेर मेमोरी को ढेर पर तकनीकी रूप से बोलने की अनुमति देता है। लेकिन कम से कम JRockit JVM स्मृति के एक अलग हिस्से का उपयोग करता है।
क्या जेवीएम मूल स्मृति से ढेर बनाता है या क्या यह स्टैक के लिए प्रबंधित मेमोरी क्षेत्र का एक सेक्शन आवंटित करता है?
ढेर JVM में कामयाब रहे क्योंकि जावा विनिर्देश prescribes यह कैसे व्यवहार करना चाहिए है: एक जावा वर्चुअल मशीन ढेर भंडार फ्रेम (§2.6)। एक जावा वर्चुअल मशीन स्टैक एक पारंपरिक भाषा के ढेर के समान है। एक अपवाद native
विधियों के लिए उपयोग किए जाने वाले मूल विधि ढेर हैं। में इसके बारे में और अधिक।
आपको यह जवाब मिल सकता है [http://stackoverflow.com/a/25318740/2032064) – Mifeet