2009-10-29 18 views
5

पर आधारित आकार को सीमित करता है, मैं एक लिंकड हैशैप बनाना चाहता हूं जो उपलब्ध स्मृति के आधार पर अपना आकार सीमित कर देगा (यानी freeMemory + (maxMemory - allocatedMemory) एक निश्चित दहलीज से नीचे हो जाता है)। इसका उपयोग कैश के रूप में किया जाएगा, संभवतः "कम से कम हाल ही में उपयोग" को कैशिंग रणनीति के रूप में उपयोग किया जा रहा है।एलआरयू लिंक्ड हैशैप जो उपलब्ध स्मृति

मेरी चिंता हालांकि आवंटित स्मृति में भी शामिल है (मुझे लगता है) गैर-कचरा एकत्रित डेटा, और इस प्रकार उपयोग की गई स्मृति की मात्रा का अधिक अनुमान लगाएगा। मैं इसके अनपेक्षित परिणामों के बारे में चिंतित हूं।

उदाहरण के लिए, लिंक्ड हैशैप आइटम को हटा सकता है क्योंकि ऐसा लगता है कि पर्याप्त मुफ्त मेमोरी नहीं है, लेकिन मुफ्त मेमोरी में वृद्धि नहीं होती है क्योंकि इन हटाए गए आइटम तुरंत कचरा नहीं होते हैं।

क्या किसी को इस तरह की चीज़ के साथ कोई अनुभव है? क्या मेरी चिंता जरूरी है? यदि हां, तो क्या कोई अच्छा दृष्टिकोण सुझा सकता है?

मुझे यह जोड़ना चाहिए कि मैं भी कैश को "लॉक" करने में सक्षम होना चाहता हूं, मूल रूप से "ठीक है, अब से स्मृति उपयोग समस्याओं के कारण कुछ भी हटाएं"।

+0

आपका आवेदन यहां क्या है? पृष्ठभूमि के इरादे के बारे में एक विचार के बिना एक अच्छा जवाब के साथ आना मुश्किल है। क्या आपका हैश मैप कैश है या क्या? – jprete

+0

jprete, मैंने इसे स्पष्ट करने की कोशिश की है - आप सही हैं, यह एक कैश – sanity

+0

यह एक सामान्य उदाहरण है जहां जीसी और जावा मेमोरी प्रबंधन अपने असली गन्दा चेहरे को दिखाता है। सी ++ में ऐसी चीज करने के लिए * इतना आसान * होगा। जीसी का उपयोग करके, आप डिलीट या फ्री जैसे कमांड निष्पादित नहीं कर सकते हैं। –

उत्तर

1

मुझे पता है कि मैं पक्षपातपूर्ण हूं, लेकिन मुझे इसके लिए वास्तव में हमारे MapMaker की दृढ़ता से अनुशंसा करना है। SoftKeys() या softValues ​​() सुविधा का उपयोग करें, इस पर निर्भर करता है कि यह कुंजी या उस मान के जीसी संग्रह का है जो किसी प्रविष्टि को साफ़ किया जा सकता है।

+1

मैं MapMaker का उपयोग करना चाहता हूं (मैं Google संग्रह का व्यापक उपयोग करता हूं मेरे कोड में), लेकिन क्या यह एक एलआरयू कैश की तरह व्यवहार करने का कोई तरीका है जो उपलब्ध स्मृति के अनुसार स्केल करता है? इसके अतिरिक्त, क्या इसे "लॉक" करने का कोई तरीका है ताकि कचरा संग्रह के जवाब में यह अब प्रविष्टियों को हटा न सके? – sanity

+1

"एलआरयू कैश की तरह व्यवहार करें ..." - यह बहुत अधिक वर्णन करता है कि नरम संदर्भ आपको क्या देंगे, हां। इसे "लॉक" करें - इसमें एकमात्र समझदार उत्तर में नक्शा कॉपी करना शामिल है: मानचित्र < कुंजी, वैल > strongCache = Maps.newHashMap (कैश); –

+0

< कचरा के बारे में खेद है; कोई पूर्वावलोकन नहीं है इसलिए मुझे अनुमान लगाया गया कि मुझे बचाना है या नहीं। :( –

0

कैश समस्याग्रस्त हो जाते हैं। आईआईआरसी, सन के जेआरई में SoftCache है जिसमें कई समस्याएं हैं।

वैसे भी, सबसे आसान बात नक्शा में SoftReference एस का उपयोग करना है। यह तब तक ठीक काम करना चाहिए जब SoftReference प्लस Map.Entry का ओवरहेड कैश किए गए डेटा से काफी कम है।

वैकल्पिक रूप से आप WeakHashMap की तरह, ReferenceQueue का उपयोग कर सकते हैं और या तो इसे मतदान कर सकते हैं या उस पर धागा अवरुद्ध कर सकते हैं (दुर्भाग्यवश प्रति उदाहरण एक थ्रेड)। सिंक्रनाइज़ेशन मुद्दों से सावधान रहें।

मानचित्र को "लॉक करना", शायद आप आवश्यक होने से बचना चाहते हैं। आपको सभी डेटा के मजबूत संदर्भ रखने की आवश्यकता होगी (और अगर शून्य नहीं है तो बेदखल करें)। वह बदसूरत होने जा रहा है।

+0

लॉकिंग के लिए, मैं सोच रहा था कि मैं बस पूरी चीज को सामान्य हैश मैप – sanity

+0

में कॉपी कर सकता हूं, ठीक है, आप मानचित्र की सामग्री कॉपी कर सकते हैं, लेकिन फिर आपको नरम संदर्भों को भी कम करना होगा। हालांकि लॉकिंग के बजाय कॉपी करना एक बेहतर तरीका है। –

0

मैं कैशिंग सिस्टम को पुन: आविष्कार करने के बजाय Ehcache जैसे कुछ का उपयोग करने का दृढ़ता से सुझाव दूंगा। यह उपयोग करने के लिए बहुत आसान है, बहुत विन्यास योग्य है, और महान काम करता है।

0

जैसा कि मैट बी ने कहा, एहचेचे या जेबॉस कैश की तरह कुछ अच्छा पहला कदम है।

यदि आप कुछ हल्के वजन और प्रक्रिया में चाहते हैं, तो Google संग्रह देखें। उदाहरण के लिए, आप सॉफ़्ट/कमज कुंजियों और मानों के साथ नक्शा बनाने के लिए MapMaker (http://google-collections.googlecode.com/svn/trunk/javadoc/index.html?com/google/common/collect/BiMap.html) का उपयोग कर सकते हैं, इसलिए यह केवल उन वस्तुओं को कैश करेगा जिनके लिए इसमें कमरा है (हालांकि आपको एलआरयू नहीं मिलेगा)।

+0

ओह - बेहतर लिंक: http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/MapMaker.html – nojo

0

मैंने पहले भी एक ही जरूरत थी और यह कैसे मैं अपने कैश कार्यान्वित:

  • एक कैश स्मृति प्रबंधक है, जो एक न्यूनतम और अधिकतम स्मृति सीमा होती है वहाँ (अधिकतम सीमित मायने रखती है वैसे भी) अधिकतम क्षमता (बार जब आप एक उच्च सीमा है के अधिकांश, आप एक्स से अधिक आइटम पकड़ जाने नहीं करना चाहती) & प्रतिशत स्मृति उपयोग
  • मैं एक LinkedHashMap का उपयोग करें:
  • हर पंजीकृत कैश निम्नलिखित (महत्वपूर्ण) पैरामीटर और कैश की रक्षा के लिए एक ReentrantReadWriteLock।
  • प्रत्येक एक्स रखता है कि प्रति प्रविष्टि औसत स्मृति खपत की गणना करता है और गणना की गई स्मृति सीमा> स्मृति स्मृति की अनुमति देता है तो ट्रिगर निष्कासन (async) ट्रिगर करता है।
  • निश्चित रूप से स्मृति गणना गणना वास्तविक स्मृति खपत को नहीं दिखाती है लेकिन वास्तविक मूल्य (प्रोफाइलर का उपयोग करके) की गणना की गई स्मृति की तुलना में मुझे लगता है कि यह काफी करीब है।

मैं कैश पर एक अतिरिक्त गार्ड लगाने की योजना बना रहा था, अगर मामले मेमोरी आधारित निष्कासन की तुलना में तेजी से चल रहा है, लेकिन अब तक मुझे इसे करने की आवश्यकता नहीं मिली है।

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