"ऑन-हीप" और "ऑफ-हीप" के बीच अंतर


145

Ehcache ऑन-हीप और ऑफ-हीप मेमोरी के बारे में बात करता है । अंतर क्या है? उन्हें कॉन्फ़िगर करने के लिए जेवीएम आर्ग का क्या उपयोग किया जाता है?


ऑफ-हीप मेमोरी का उपयोग कैसे करें, इसके लिए देखें: stackoverflow.com/a/30027374/895245
Ciro Santilli Sant---'

जवाबों:


169

ऑन-हीप स्टोर उन वस्तुओं को संदर्भित करता है जो जावा हीप में मौजूद होंगे (और जीसी के अधीन भी)। दूसरी ओर, ऑफ-हाइप स्टोर संदर्भित (क्रमबद्ध) वस्तुओं को संदर्भित करता है जो EHCache द्वारा प्रबंधित किए जाते हैं, लेकिन ढेर के बाहर संग्रहीत होते हैं (और जीसी के अधीन भी नहीं)। चूंकि ऑफ-हीप स्टोर को मेमोरी में प्रबंधित किया जाना जारी है, यह ऑन-हीप स्टोर की तुलना में थोड़ा धीमा है, लेकिन डिस्क स्टोर की तुलना में अभी भी तेज है।

ऑफ-हीप स्टोर के प्रबंधन और उपयोग में शामिल आंतरिक विवरण प्रश्न में पोस्ट किए गए लिंक में बहुत स्पष्ट नहीं हैं, इसलिए टेराकोटा बिगमेरी के विवरण की जांच करना बुद्धिमान होगा , जिसका उपयोग ऑफ-डिस्क का प्रबंधन करने के लिए किया जाता है। दुकान। बिगमेमोरी (ऑफ-हीप स्टोर) का उपयोग जीसी के ओवरहेड से बचने के लिए किया जाना है जो कि कई मेगाबाइट या गीगाबाइट बड़े हैं। BigMemory JVM प्रक्रिया के मेमोरी एड्रेस स्पेस का उपयोग करता है, सीधे बाइटबर्फर्स के माध्यम से जो अन्य देशी जावा ऑब्जेक्ट्स के विपरीत जीसी के अधीन नहीं हैं।


18
आगे की खोज के लिए प्रत्यक्ष बाइटबफर्स ​​का उल्लेख करने के लिए +1;)
मैक्स

3
डायरेक्ट बाइटबफ़र्स अप्रबंधित मेमोरी तक पहुंच प्रदान करते हैं, लेकिन स्वयं जीसी के अधीन हैं (जैसा कि वे इंगित करते हैं कि डेटा के विपरीत)। यह महत्वपूर्ण है क्योंकि एक प्रत्यक्ष बाइटबफ़र (बाइटबफ़र.ऑलोकेटडायरेक्ट प्रकार, न कि एमएमएपी प्रकार) जीसी द्वारा एकत्र किया जाएगा और जब यह एकत्र हो जाता है तो डीललोकेटर ट्रिगर हो जाएगा, प्रभावी रूप से अप्रबंधित मेमोरी को भी एकत्रित करना होगा।
निट्सन वकार्ट

ऑब्जेक्ट्स को आवंटित करने के लिए असुरक्षित का उपयोग करने से ऐसा लगता है कि ओनेप / डायरेक्टबाइटबफर्स ​​/ बाइटबफर्स ​​पर प्रदर्शन को बेहतर ढंग से पढ़ना और लिखना है। ashkrit.blogspot.com/2013/07/…
जो सी

98

से http://code.google.com/p/fast-serialization/wiki/QuickStartHeapOff

हीप-ऑफलोडिंग क्या है?

आमतौर पर आपके द्वारा आवंटित सभी गैर-अस्थायी वस्तुओं को जावा के कचरा संग्रहकर्ता द्वारा प्रबंधित किया जाता है। हालाँकि, VM कचरा संग्रहण का काम अच्छी तरह से करता है, एक निश्चित बिंदु पर VM को 'पूर्ण GC' नामक एक तथाकथित कार्य करना होता है। एक पूर्ण जीसी में पूर्ण आवंटित हीप को स्कैन करना शामिल है, जिसका अर्थ है कि जीसी पॉज़ / स्लोडाउन एक अनुप्रयोग हीप आकार के आनुपातिक हैं। इसलिए किसी भी व्यक्ति पर भरोसा न करें जो आपको बता रहा है कि 'मेमोरी सस्ता है।' जावा मेमोरी में खपत प्रदर्शन को नुकसान पहुंचाती है। इसके अतिरिक्त आप ढेर आकार> 1 जीबी का उपयोग करके उल्लेखनीय ठहराव प्राप्त कर सकते हैं। यह बुरा हो सकता है यदि आपके पास कोई निकट-वास्तविक समय चल रहा है, तो क्लस्टर या ग्रिड में एक जावा प्रक्रिया अनुत्तरदायी हो सकती है और क्लस्टर से हटा दी जा सकती है।

हालाँकि आज के सर्वर एप्लिकेशन (अक्सर ब्लोटी फ्रेमवर्क ;-) के शीर्ष पर बनाए गए) को आसानी से 4Gb से परे ढेर होने की आवश्यकता होती है।

इन मेमोरी आवश्यकताओं का एक समाधान, गैर-जावा ढेर (ओएस से सीधे आवंटित) के लिए वस्तुओं के कुछ हिस्सों को 'ऑफलोड' करना है। सौभाग्य से java.nio कक्षाओं को सीधे आवंटित / पढ़ने और स्मृति के अनवांटेड '' विखंडू (यहां तक ​​कि मेमोरी फाइल) भी लिखता है।

तो कोई बड़ी मात्रा में 'अप्रबंधित' मेमोरी को आवंटित कर सकता है और इसका उपयोग वस्तुओं को बचाने के लिए कर सकता है। अनियंत्रित स्मृति में मनमानी वस्तुओं को बचाने के लिए, सबसे व्यवहार्य समाधान सीरियलाइज़ेशन का उपयोग है। इसका मतलब यह है कि एप्लिकेशन ऑफ़िशियल मेमोरी में ऑब्जेक्ट्स को क्रमबद्ध करता है, बाद में ऑब्जेक्ट को डीरिएरलाइज़ेशन का उपयोग करके पढ़ा जा सकता है।

जावा वीएम द्वारा प्रबंधित ढेर का आकार छोटा रखा जा सकता है, इसलिए जीसी पॉज़ मिल में हैं, हर कोई खुश है, काम किया है।

यह स्पष्ट है, कि इस तरह के ऑफ हीप बफर का प्रदर्शन ज्यादातर क्रमांकन कार्यान्वयन के प्रदर्शन पर निर्भर करता है। अच्छी खबर: किसी कारण के लिए एफएसटी-सीरियलाइजेशन बहुत तेज है :-)।

नमूना उपयोग परिदृश्य:

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

संपादित करें: कुछ परिदृश्यों के लिए कोई अधिक परिष्कृत कचरा संग्रह एल्गोरिदम चुन सकता है जैसे कि समवर्ती माकर्डवीप या जी 1 बड़े ढेर का समर्थन करने के लिए (लेकिन यह भी इसकी सीमा 16 जीबी ढेर से आगे है)। एक वाणिज्यिक जेवीएम भी है जिसमें सुधार के लिए 'पॉज़लेस' जीसी (अज़ुल) उपलब्ध है।


4
"बड़ी मात्रा में 'अप्रबंधित' मेमोरी आवंटित करें और वहां वस्तुओं को बचाने के लिए इसका उपयोग करें" - आप ऑब्जेक्ट्स को बचा नहीं सकते। आप आदिम स्टोर कर सकते हैं, आप उन्हें अपनी पसंद की लाइब्रेरी में लपेट सकते हैं, लेकिन ये ऑब्जेक्ट नहीं हैं। आप जिस डेटा को ऑफ़फ़ेयर करते हैं, उसका कोई ऑब्जेक्ट हेडर नहीं है, आप उस पर सिंक्रोनाइज़ नहीं कर सकते, आप इसे किसी अन्य ऑब्जेक्ट में संदर्भ फ़ील्ड के साथ संदर्भित नहीं कर सकते।
निट्सन वकार्ट

41

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

EHCache की ऑफ-हाइप स्टोरेज आपके रेग्युलर ऑब्जेक्ट को हीप से दूर ले जाती है, इसे सीरियल करती है, और इसे बाइट्स के रूप में स्टोर करती है जो कि EHCache मैनेज करती है। यह डिस्क पर संग्रहीत करने जैसा है लेकिन यह अभी भी रैम में है। इस राज्य में वस्तुएं सीधे उपयोग करने योग्य नहीं हैं, उन्हें पहले से निष्क्रिय करना होगा। कचरा संग्रहण के अधीन भी नहीं।


क्या यह अभी भी ढेर में नहीं है बल्कि एक क्रमबद्ध रूप में है?
पचेरियर

1
यह कैसे अधिक कुशल बनाता है?
19

2
बहुत सारे तरीके हैं। चूँकि ऑब्जेक्ट अब मुख्य जावा हीप पर नहीं हैं, वे कचरा इकट्ठा करने वाले का समय बर्बाद नहीं करते हैं, वे जेवीएम के ढेर को टुकड़े टुकड़े नहीं करते हैं और वे अन्य अधिक उपयोग की जाने वाली वस्तुओं के लिए खाली स्थान रखते हैं। इसके अलावा, चूंकि वे क्रमबद्ध हैं और संभवत: तत्काल भविष्य में उनकी आवश्यकता नहीं है, उन्हें संकुचित किया जा सकता है, आवश्यकतानुसार स्थानांतरित किया जा सकता है, या डिस्क पर भी पृष्ठांकित किया जा सकता है।
एडम

1
हॉटस्पॉट में, जीसी ठहराव का समय सीधे ढेर के आकार पर निर्भर करता है। बिगमेमोरी इस व्यापार को ढेर के बजाय रैम का उपयोग करके, जीसी ठहराव को न्यूनतम रखने और डिस्क के उपयोग की आईओ लागत से बचने के लिए प्रदान करता है।
चंदर शिवदासानी

17

छोटी तस्वीर में

जावा संक्षेप में / बंद ढेर भंडारण

तस्वीर क्रेडिट


विस्तृत चित्र

विवरण में जावा ऑन / ऑफ हीप स्टोरेज

तस्वीर क्रेडिट


ऑफ-मेमोरी को -xmx द्वारा नियंत्रित किया जाता है? नीला एक पुराना है या बंद ढेर है?
हिमांशु अहिरे

नहीं, यह ढेर में अप्रयुक्त स्थान है, यह तब भरेगा जब ढेर में निर्मित कई वस्तुएं।
मृगिनिवास

1

जेवीएम ऑफ-हाइप मेमोरी के बारे में कुछ भी नहीं जानता है। Ehcache एक ऑन-कैश कैश के साथ-साथ इन-मेमोरी कैश को लागू करता है।


1

100% नहीं; हालाँकि, ऐसा लगता है कि हीप एक ऑब्जेक्ट या आवंटित स्थान का सेट है (RAM पर) जो कि कोड की कार्यक्षमता में या तो स्वयं जावा से बनाया गया है या ehcache से अधिक संभावित कार्यक्षमता है, और ऑफ़-हीप राम स्वयं की प्रणाली है कुंआ; हालाँकि, ऐसा लगता है कि यह एक परिमाण धीमा है क्योंकि यह व्यवस्थित नहीं है, जिसका अर्थ है कि यह एक ढेर का उपयोग नहीं कर सकता है (जिसका अर्थ है कि राम के अंतरिक्ष का एक लंबा सेट), और इसके बजाय अलग-अलग पते के रिक्त स्थान का उपयोग करके इसे थोड़ा कम कुशल बनाने की संभावना है।

फिर बेशक अगला टियर लोअर हार्ड-ड्राइव स्पेस ही है।

मैं ehcache का उपयोग नहीं करता, इसलिए हो सकता है कि आप मुझ पर भरोसा नहीं करना चाहते, लेकिन यही कि मैं उनके दस्तावेज से इकट्ठा हुआ हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.