2016-02-06 11 views
9

अंदर इसे का उपयोग यह, JVM स्मृति है कि एक वस्तु के रूप में JVM के अंदर इस्तेमाल किया जा सकता बाहर एक लगातार स्मृति वस्तु बनाने के लिए इतना है कि यह एक JVM पुनः आरंभ बचता संभव है?JVM बाहर मेमोरी आवंटित करने और JVM

विशेष विचार है कि हम JVM बाहर स्मृति को आबंटित और फिर इसे के साथ इस स्मृति और सहयोगी, कहते हैं, कुछ जावा सरणी तक पहुँचने के लिए एक JNI इंटरफ़ेस का उपयोग कर सकते हैं।

किसी ऐसे हैक प्रदर्शन करने की कोशिश की? कोई भी प्लेटफॉर्म निर्भरता पर्याप्त होगी।

उदाहरण के लिए, इस JVM प्रक्रिया को फिर से प्रारंभ दौरान इन-स्मृति डीबी लोडिंग के अनुकूलन प्रदर्शन करने के लिए कर सकते हैं।

+0

आप निश्चित रूप से नहीं, एक असली जावा सरणी निर्दिष्ट करने के लिए की तरह एक 'नाव []' या तो कर सकेंगे। लेकिन तुम * * जावा में बाह्य रूप से आबंटित स्मृति का उपयोग कर सकते हैं, के रूप में एक सीधा [ByteBuffer] (https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html) था कि यह वापस लौट कर जेएनआई के माध्यम से [न्यू डायरेक्टबाइटबफर] (https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#NewDirectByteBuffer) के साथ बनाया गया। मुझे यकीन नहीं है कि एक JVM पुनरारंभ की जीवितता को कैसे पूरा किया जाए (और इस समय इसे समझ में नहीं आ सकता है), लेकिन ** यदि ** इस भाग को हल किया जा सकता है, तो प्रत्यक्ष 'बाइटबफर' होने का तरीका संभव है । – Marco13

उत्तर

10

हाँ, यह पूरी तरह से संभव है, यहां तक ​​कि JNI के बिना।

विचार tmpfs फाइल सिस्टम पर "फ़ाइल" द्वारा समर्थित है। जैसे लिनक्स पर आप उस के लिए /dev/shm (या /run/shm) माउंटप्वाइंट उपयोग कर सकते हैं।

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

+0

यह वास्तव में बहुत अच्छा है। आपका बहुत बहुत धन्यवाद! – Andremoniy

+0

प्रश्न में लिनक्स का उल्लेख नहीं किया गया था .... तो यह मंच विशिष्ट है - या विंडोज़ पर कुछ ऐसा ही है? – Marco13

+0

@ मार्को 13 विंडोज़ पर आप रैमडिस्क का उपयोग कर सकते हैं लेकिन मुझे लगता है कि आपको इसे इंस्टॉल करना होगा। –

4

आप मैपडबेटबफर स्वयं का उपयोग कर सकते हैं या आप मैप्डबेट बफर के शीर्ष पर बनाए गए डेटा स्ट्रक्चर का उपयोग कर सकते हैं ताकि यह पुन: प्रारंभ और यहां तक ​​कि जेवीएम के बीच साझा किया जा सके।

Chronicle-Map मुख्य-मान की दुकान एक ConcurrentMap के रूप में मॉडलिंग की है। जैसे Map<String, YourType>

Chronicle-Queue जैसे आपके सिस्टम में हर घटना की एक पत्रिका है एक लॉग जो आप वास्तविक समय में उपभोग कर सकते हैं।

इन दोनों खुला स्रोत और स्वतंत्र हैं और आप बाहर काम करने की दुकान है और एक मौजूदा दुकान से वस्तुओं को पुनः प्राप्त करने के लिए कैसे होने सहेजें।

नोट: के रूप में इन बंद ढेर कर रहे हैं और एक समान होती है, वे टीबीएस आकार में प्रभावित करने वाले जीसी रुक जाता है कई बार बिना हो सकता है।