2011-11-16 14 views
10

पर स्मृति आवंटन है जब आप जावा में new Object() करते हैं, तो क्या jvm स्मृति आवंटित करने के लिए लॉकलेस एल्गोरिदम का उपयोग करता है या इसे लॉक करने की आवश्यकता होती है?क्या JVM लॉकलेस

जेवीएम मैं इस मामले में जिक्र कर रहा हूं हॉटस्पॉट वीएम है। छोटे से मैं इसके बारे में जानता हूं, इसे स्मृति सुपर फास्ट आवंटित करने के लिए केवल एक सूचक को बढ़ाने की आवश्यकता है। लेकिन कई धागे के मामले में, क्या उस वृद्धि के लिए लॉकिंग या सीएएस की आवश्यकता होती है?

उत्तर

6

जैसा कि बताया गया है, डिफ़ॉल्ट रूप से एक tlab का उपयोग करना है। behavious this glossary में वर्णित के रूप this blog & सभी विवरण में आकार आप this blog में चाहते हो सकता है पर

TLAB 
Thread-local allocation buffer. Used to allocate heap space quickly without synchronization. Compiled code has a "fast path" of a few instructions which tries to bump a high-water mark in the current thread's TLAB, successfully allocating an object if the bumped mark falls before a TLAB-specific limit address. 

अधिक जानकारी इस प्रकार है।

संक्षेप में यह तब तक थ्रेड स्थानीय है जब तक कि TLAB पूरा नहीं हो जाता है, आपको साझा पूल को हिट करने की आवश्यकता होगी और यह एक सीएएस ऑपरेशन है।

एक और जटिल कारक this bug हो सकता है जो कार्ड अंकन में झूठी साझाकरण का वर्णन करता है जो कि लॉक नहीं है लेकिन प्रदर्शन को नुकसान पहुंचाएगा (यदि आप लॉकिंग के बारे में पूछ रहे हैं)। ऐसा लगता है कि यह जावा 7 में तय है।

5

यह निर्भर करता है :) मेरा मानना ​​है कि यदि आप -XX:+UseTLAB option (जो पीटर द्वारा नोट किए गए सूर्य/ओरेकल जेवीएम के लिए डिफ़ॉल्ट है) का उपयोग करते हैं, तो थ्रेड-स्थानीय ढेर के कारण यह "खुश पथ" में विवाद मुक्त होगा । बेशक, अगर पर्याप्त जगह नहीं होने के कारण कचरा संग्रह की आवश्यकता होती है, तो हम समांतर जीसी आदि के क्षेत्र में आते हैं, जहां विभिन्न कार्यान्वयन होते हैं और यह सब बहुत जटिल है ... और निश्चित रूप से, यह हर समय चलता है।

यहां तक ​​कि "एकल ढेर" मॉडल में भी, मुझे उम्मीद है कि आवंटन को अत्यधिक अनुकूलित किया जाएगा - जहां संभव हो पर परमाणु वृद्धि करने के रूप में सामान्य अर्थ में लॉक प्राप्त करना उतना ही अधिक नहीं है। मैं नहीं कह सकता कि मुझे ब्योरा पता है।

+1

+1: सूर्य/ओरेकल JVMs पर डिफ़ॉल्ट रूप से UseTLAB चालू है। –

+0

@ पीटर लेवरी: धन्यवाद - उचित रूप से संपादित किया गया। –

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