2014-09-18 9 views
12

यह जिज्ञासा से सिर्फ एक साधारण सैद्धांतिक प्रश्न है। मैं हमेशा एक जावा प्रशंसक लड़का की तरह रहा हूं। लेकिन एक बात मुझे आश्चर्यचकित करती है कि क्यों जावा ढेर पर वस्तुओं को बनाने के लिए तंत्र प्रदान नहीं करता है? अगर मैं सी # पर संरचना बनाने की तरह ही ढेर के बजाय ढेर पर छोटे बिंदु (int x, int y) ऑब्जेक्ट बना सकता हूं तो यह अधिक कुशल नहीं होगा। क्या जावा में इस प्रतिबंध के पीछे कोई विशेष सुरक्षा कारण है? :)जावा में स्टैक मेमोरी पर ऑब्जेक्ट्स बनाना?

+1

क्या होता है जब आप इसे एक कंटेनर में डालते हैं जो ढेर पर नहीं है? जब आप वापस आते हैं, तो कंटेनर में अब विलुप्त स्मृति का संदर्भ है। – Max

+1

@ मैक्स: संभवतः, भाषा को उन संरचनाओं को भी शामिल करने की आवश्यकता होगी जो संकलक को इसके खिलाफ जांचने की अनुमति देते हैं। – Thilo

+0

@ मैक्स: कंटेनर के पास मूल का संदर्भ नहीं है, या तो इसकी एक प्रति है या इसकी एक बॉक्स की प्रति है। .NET/C# पिछले 15 वर्षों से यह रहा है। https://msdn.microsoft.com/en-us/library/yz2be5wk.aspx – csauve

उत्तर

15

यहां रणनीति यह है कि भाषा में इस निर्णय को लीक करने के बजाय जावा जावा को जेवीएम/हॉटस्पॉट/जेआईटी/रनटाइम तय करता है कि यह कहां और कैसे स्मृति आवंटित करना चाहता है।

"बचने के विश्लेषण" का उपयोग करने के लिए अनुसंधान चल रहा है यह जानने के लिए कि वास्तव में वस्तुओं को ढेर और ढेर पर जाने की आवश्यकता नहीं है-बजाय उन्हें आवंटित करें। मुझे यकीन नहीं है कि क्या यह पहले से ही मुख्यधारा JVM में बना है। लेकिन अगर ऐसा होता है, तो इसे रनटाइम (चीज़ -XX: कुछ) द्वारा नियंत्रित किया जाएगा, डेवलपर नहीं।

इसका उछाल यह है कि पुराना कोड इन भविष्य के संवर्द्धन से भी अपडेट किए बिना लाभ उठा सकता है।

यदि आप इसे मैन्युअल रूप से प्रबंधित करना चाहते हैं (लेकिन अभी भी कंपाइलर जांच है कि यह "सुरक्षित" रहता है), जंग पर एक नज़र डालें।

+4

http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html सक्षम 6u23 में और बाद में – jtahlborn

+1

@jtahlborn: +1। मुझे लगता है कि अनुकूलन की वर्तमान फसल वास्तव में ढेर पर वस्तुओं को आवंटित करने तक नहीं जाती है, हालांकि। रिलीज नोट्स से, यह ताले और मौजूदा वस्तुओं की अनावश्यक प्रतियों को खत्म करने जैसा लगता है। लिंक jtahlborn लिंक से – Thilo

+0

+1 पोस्ट किया गया: "यह गैर-वैश्विक रूप से भागने वाली वस्तुओं के लिए एक ढेर आवंटन के साथ एक ढेर आवंटन को प्रतिस्थापित नहीं करता है।" जिसका अर्थ है कि * ArgEscape * और * NoEscape * को स्टैक पर आवंटित किया जाएगा। लेकिन फिर, यह स्पष्ट रूप से उल्लेख नहीं किया जा रहा है ... – alfasin

2

स्टैक पर बनाए गए ऑब्जेक्ट के साथ कुछ वैश्विक संदर्भ आरंभ करना एक आम समस्या होगी। जब ऑब्जेक्ट बनाया गया तरीका निकलता है तो आप क्या इंगित करते हैं?

कहा जा रहा है कि जावा में स्टैक पर ऑब्जेक्ट बनाया गया है, यह escape analysis का उपयोग करके आपकी पीठ के पीछे किया जा रहा है जो सुनिश्चित करता है कि उपर्युक्त परिदृश्य नहीं होता है।

4

यह अंतरिम रूप से जावा के लिए आ रहे हैं, वहाँ कोई वास्तविक ईटीए इस के लिए सेट किया गया है ताकि आप केवल आशा कर सकता है यह जावा से 10 से आ जाएगा

प्रस्ताव मूल्य प्रकार कहा जाता है और आप इसे in the mailing list of Project Valhalla पालन कर सकते हैं।

मुझे नहीं पता कि पहले किसी भी भाषा में क्यों नहीं था, शायद मूल रूप से इसे अनावृत माना जाता था या इसे लागू करने के लिए कोई समय नहीं था।

+0

ठीक है! जावा "तात्कालिक रूप से" सी # तक पकड़ जाएगा? "कभी-कभी" (टीएम) – csauve

+0

@skiwi क्या आप कृपया संक्षेप में बता सकते हैं कि मूल्य प्रकार क्या हैं? –

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