2009-07-24 25 views
8

मैंने कहीं पढ़ा है कि जावा लगभग 12 मशीन निर्देशों में वस्तुओं के लिए स्मृति आवंटित कर सकता है। यह मेरे लिए काफी प्रभावशाली है। जहां तक ​​मैं समझता हूं कि एक चाल का उपयोग करते हुए JVM का उपयोग करों में स्मृति को पूर्ववत कर रहा है। यह ऑपरेटिंग सिस्टम के अनुरोधों की संख्या को कम करने में मदद करता है, जो कि काफी महंगा है, मुझे लगता है। लेकिन सीएएस परिचालनों को आधुनिक प्रोसेसर पर 150 चक्र तक खर्च कर सकते हैं।जावा आवंटन स्मृति आवंटन

तो, क्या कोई जावा में स्मृति आवंटन की वास्तविक लागत को समझा सकता है और जो चालन आवंटन को गति देने के लिए जेवीएम का उपयोग करता है?

+0

एक ठेठ JVM केवल ढेर करने के लिए अतिरिक्त स्मृति जोड़ने के लिए ओएस का उपयोग करेगा पर सामान का एक गुच्छा किया करते थे। अधिकांश समय यह पुन: उपयोग कर रहा है कि यह पहले से क्या है। –

उत्तर

17

JVM स्मृति के एक क्षेत्र को प्रत्येक थ्रेड के लिए पूर्व आवंटित:

यह सब और अधिक विस्तार यहाँ से समझाया गया है। जब किसी थ्रेड को स्मृति आवंटित करने की आवश्यकता होती है, तो वह उस क्षेत्र के भीतर "सूचक आवंटन को टक्कर" का उपयोग करेगा। (यदि "फ्री पॉइंटर" 10 को संबोधित करने के लिए इंगित करता है, और ऑब्जेक्ट आवंटित करने के लिए आकार 50 है, तो हम केवल मुक्त पॉइंटर को 60 पर टक्कर देते हैं, और थ्रेड को बताते हैं कि यह ऑब्जेक्ट के लिए 10 और 59 के बीच मेमोरी का उपयोग कर सकता है) ।

+0

बहुत बहुत धन्यवाद। यह सामान है जिसे मैं ढूंढ रहा हूं, लेकिन यह नहीं पता था कि इसके बारे में Google से कैसे पूछना है। :) लेकिन दिलचस्प बात ... टीएलए के बारे में मैंने जो एकमात्र उल्लेख पाया है वह ओरेकल जेआरॉक जेवीएम (फ्लैग-एक्सटलाइज़) में है। क्या यह सुविधा सूर्य जेवीएम में मौजूद है? –

+1

सूर्य शब्दावली थ्रेड स्थानीय आवंटन बफर है। अनुवाद के लिए टीएलए मानक लुक-एसाइड बफर (आईबीएम दोष) और हार्डवेयर कैश मानचित्रों को संदर्भित करता है। –

+1

ठीक है, मुझे जानकारी मिली है। धन्यवाद। बीटीडब्ल्यू, मुझे लगता है कि अनुवाद लुकसाइड बफर संक्षिप्त रूप से टीएलबी की तरह है :) http://en.wikipedia.org/wiki/Translation_lookaside_buffer –

2

सबसे अच्छी चाल जनरेटिव कचरा-संग्राहक है। यह ढेर को अपरिवर्तित रखता है, इसलिए स्मृति आवंटित करने से पॉइंटर मुक्त स्थान पर बढ़ रहा है और पुराना मान लौटा रहा है। अगर स्मृति खत्म हो जाती है, कचरा-संग्रह प्रतिलिपि वस्तुओं और इस तरह से एक नया unfragmented ढेर बनाता है।

चूंकि विभिन्न धागे को पॉइंटर पर मुफ्त मेमोरी में सिंक्रनाइज़ करना होता है, अगर इसे बढ़ाते हैं, तो वे भाग को प्रीलोकेट करते हैं। तो एक धागा ताला के बिना, नई स्मृति आवंटित कर सकते हैं। (TLA या थ्रेड स्थानीय क्षेत्र) http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html

1

JVM के लिए कोई एकल स्मृति आवंटक नहीं है। आईआईआरसी सही ढंग से सूर्य की जेवीएम और आईबीएम की प्रबंधित स्मृति अलग-अलग है। हालांकि आम तौर पर जिस तरह से जेवीएम संचालित होगा वह यह है कि शुरुआत में यह स्मृति के एक टुकड़े को आवंटित करेगा, यह सेगमेंट प्रोसेसर कैश में रहने के लिए पर्याप्त छोटा होगा, जिससे यह बहुत तेज़ी से पहुंच सके।

जैसा कि आप एप्लिकेशन के अंदर ऑब्जेक्ट बनाते हैं, ऑब्जेक्ट्स इस सेगमेंट के भीतर से स्मृति ले लेंगे। सेगमेंट के भीतर ऑब्जेक्ट आवंटन केवल पॉइंटर अंकगणितीय है।

प्रारंभ में ताजा खनन खंड में ऑफसेट पता शून्य होगा। आवंटित पहली वस्तु शून्य के एक 'पता' (वास्तव में खंड में ऑफसेट) होगी। जब आप ऑब्जेक्ट आवंटित करते हैं तो मेमोरी मैनेजर को पता चलेगा कि ऑब्जेक्ट कितना बड़ा है, सेगमेंट के भीतर उस जगह को आवंटित करें (16 बाइट्स कहते हैं) और उसके बाद उस राशि से "ऑफसेट एड्रेस" बढ़ाएं जिसका अर्थ है कि स्मृति आवंटन अंधेरा है, यह सिर्फ पॉइंटर है अंकगणित।

सूर्य एक श्वेतपत्र यहाँ http://java.sun.com/j2se/reference/whitepapers/memorymanagement_whitepaper.pdf है और आईबीएम ibm.com/developerworks

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