2012-02-11 14 views
6

मैं समझता हूं कि जावा में थ्रेड के स्टैक आकार को रनटाइम पर प्राप्त करने का कोई तरीका नहीं है (Can one obtain actual stack size used by a thread in Java after some time of running? देखें)।स्टैक के वास्तविक आकार को पाने का कोई तरीका क्यों नहीं है?

उदाहरण के लिए, यदि हम java.lang.Thread 64 * 1024 के स्टैक आकार को निर्दिष्ट करते हैं, तो JVM हमें किसी भी स्टैक आकार के साथ थ्रेड देने के लिए स्वतंत्र है।

हालांकि, मेरा मानना ​​है कि वास्तव में स्टैक के वास्तविक आकार को जानना कुछ अनुप्रयोगों के लिए बहुत उपयोगी है जिसके लिए इस तरह की जानकारी की आवश्यकता होती है।

हमारे पास कोई तरीका नहीं है जो हमें वास्तविक स्टैक के लिए उपयोग किए गए बाइट्स की संख्या बताता है?

क्या आर्किटेक्चर में कुछ प्रकार की सीमा है जो थ्रेड के लिए बाइट्स की वास्तविक संख्या प्राप्त करना असंभव बनाता है?

+1

"हालांकि, मेरा मानना ​​है कि वास्तव में स्टैक के वास्तविक आकार को जानना कुछ अनुप्रयोगों के लिए बहुत उपयोगी है जिसके लिए इस तरह की जानकारी की आवश्यकता होती है।" क्या आपके पास कोई उदाहरण है? –

+0

@MarkByers उदाहरण के लिए, एक वेब सर्वर या एक ओएस। – Pacerier

+2

वेब सर्वर को स्टैक आकार को जानने की आवश्यकता क्यों होगी? – Bombe

उत्तर

3

स्टैक पर संग्रहीत एकमात्र चीजें प्राचीन प्रकार और संदर्भ हैं। वस्तुओं हमेशा ढेर पर बनाई गई हैं, तो डेटा प्रकार है कि ढेर पर संग्रहीत किया जाएगा

  • प्रकार बाइट, चार, पूर्णांक, लंबे, नाव की स्थानीय चर रहे हैं, इन के दोहरे सबसे लंबे समय तक डबल जो 8 हैं बाइट्स
  • वस्तुओं के सन्दर्भ 32 बिट वी एम पर 4 बाइट, 64 बिट VMs पर 8 बाइट्स हैं तो वे जमा हो जाती है

ध्यान दें कि सरणियों वस्तुओं प्रकार के होते हैं (संभवतः कम, 48 बिट संदर्भ स्थान बचाने के लिए उपयोग किया जाता है) ढेर पर, यदि आपके पास एक आदिम है जो कक्षा में एक क्षेत्र है तो आदिम वस्तु का हिस्सा है और इसलिए ढेर पर संग्रहीत किया जाएगा।

तो आपके पास रनवे रिकर्सन होने तक स्टैक स्पेस से बाहर निकलना बहुत मुश्किल है। मैं कल्पना करता हूं कि यही कारण है कि जावा डिजाइनर आपको स्टैक आकार को खोजने का कोई तरीका नहीं देते हैं।

स्टैक आकार देने का एक और कारण यह नहीं है कि यह एक कार्यान्वयन विवरण होगा कि आप वास्तव में कुछ भी नहीं कर सकते हैं, आप थ्रेड बनाने के बाद थ्रेड स्टैक के आकार को नहीं बदल सकते हैं, और आप पॉइंटर अंकगणित नहीं कर सकते हैं तो स्टैक आकार जानने का क्या मतलब है?

+0

मैं एक धागा पूल हूं, मैं पैदा होने पर 30 धागे बनाना चाहता हूं, प्रत्येक 64 केबी के ढेर आकार के साथ।हालांकि यदि JVM मेरे स्टैक आकार अनुरोध को अनदेखा करता है और प्रत्येक थ्रेड को 1 एमबी के ढेर आकार के साथ बनाता है, तो मैं 30 धागे बनाना नहीं चाहता हूं। यदि प्रत्येक धागे में 512 केबी का ढेर आकार होता है, तो मैं इसके बजाय 15 धागे बनाउंगा। अन्यथा यदि प्रत्येक थ्रेड में 1 एमबी का ढेर आकार होता है, तो मैं इसके बजाय 10 धागे (और इसी तरह) बनाउंगा। हालांकि मेरे पास स्टैक आकार की पूछताछ करने का कोई तरीका नहीं है, और अब मैं सबसे अच्छा कर सकता हूं। – Pacerier

+0

@ स्टैसर आकार का पैसरियर ढेर आकार के सापेक्ष इतना छोटा सा है, इसलिए अधिक थ्रेड वाले मुद्दे को व्यक्तिगत थ्रेड का ढेर आकार नहीं है, लेकिन प्रत्येक थ्रेड द्वारा उपयोग की जाने वाली ढेर मेमोरी की मात्रा से। अधिक धागे जितना अधिक ढेर आपको शायद चाहिए। आपके ऐप को चलाने के लिए किस प्रकार का हार्डवेयर लक्ष्यीकरण कर रहा है, इस पर आप स्मृति के केबी के बारे में चिंतित हैं? – ams

+0

क्या मैं कुछ गलत समझ रहा हूं, क्योंकि धागे स्वयं द्वारा किसी भी ढेर स्मृति को नहीं लेते हैं। अगर मेरे पास MyThreadPool के 10 उदाहरण हैं और प्रत्येक MyThreadPool में 30 थ्रेड हैं और प्रत्येक थ्रेड में 1 एमबी स्टैक आकार है जो कुल 300 एमबी मेमोरी है। दूसरी ओर, यदि प्रत्येक थ्रेड में 64 केबी स्टैक आकार होता है तो यह केवल 18.75 एमबी मेमोरी लेगा। यह एक औसत-औसत कंप्यूटर – Pacerier

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

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