दिलचस्प पोस्ट
कैसे एक git उर्फ ​​के अंदर सीधे बाश स्क्रिप्ट एम्बेड करें घटना को भेजा जा रहा है जब angular.js लोड हो रहा है वेबस्कॉट क्लाइंट API में HTTP शीर्षलेख क्लास द्वारा jQuery का गिनती तत्व; इसे लागू करने का सबसे अच्छा तरीका क्या है? `Im2col` और` col2im` के कुशल कार्यान्वयन अजगर में एक डिक्ट कुंजी के रूप में मैं सूची का उपयोग क्यों नहीं कर सकता? JQuery का उपयोग कर एक चुनिंदा बॉक्स पर पहला विकल्प कैसे सेट करें? गतिशील रूप से LINQ ग्रुपिंग वेबसाइट तक पहुंचने से डारोदर.डॉम जैसी स्पैम रेफरर को कैसे ब्लॉक करें? X 86 पेजिंग कैसे काम करता है? ब्राउज़र जावास्क्रिप्ट स्टैक आकार की सीमा यूआरएलआईबी 2 के टाइमआउट को संभालना? – पायथन अजगर: , , ] में "5,4,2,4,1,0" परिवर्तित करें Android Gradle अपाचे एचटीटीपी क्लाइंट मौजूद नहीं है? Matplotlib में गैर- ASCII वर्ण

दो जेवीएम के बीच साझा मेमोरी

जावा के दो जेवीएम (एक ही भौतिक मशीन पर चल रहे) के लिए जावा का एक तरीका क्या है? मान लीजिए कि जेवीएम 1 में निर्माता किसी विशेष प्री-डिफाइन मेमोरी स्थान पर संदेश रखता है, क्या उपभोक्ता जेएमएम 2 पर संदेश भेज सकता है, यदि वह जानता है कि कौन सी मेमोरी स्थान को देखना है?

वेब के समाधान से एकत्रित समाधान "दो जेवीएम के बीच साझा मेमोरी"

समाधान 1:

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

सर्वर:

 public class Server { public static void main( String[] args ) throws Throwable { File f = new File( FILE_NAME ); FileChannel channel = FileChannel.open( f.toPath(), StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.CREATE ); MappedByteBuffer b = channel.map( MapMode.READ_WRITE, 0, 4096 ); CharBuffer charBuf = b.asCharBuffer(); char[] string = "Hello client\0".toCharArray(); charBuf.put( string ); System.out.println( "Waiting for client." ); while( charBuf.get( 0 ) != '\0' ); System.out.println( "Finished waiting." ); } } 

ग्राहक:

 public class Client { public static void main( String[] args ) throws Throwable { File f = new File( FILE_NAME ); FileChannel channel = FileChannel.open( f.toPath(), StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.CREATE ); MappedByteBuffer b = channel.map( MapMode.READ_WRITE, 0, 4096 ); CharBuffer charBuf = b.asCharBuffer(); // Prints 'Hello server' char c; while( ( c = charBuf.get() ) != 0 ) { System.out.print( c ); } System.out.println(); charBuf.put( 0, '\0' ); } } 

समाधान 2:

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


अब उपर्युक्त उदाहरण हैं, यदि आप दो अलग-अलग प्रक्रियाओं के बीच स्मृति साझा करना चाहते हैं यदि आप वर्तमान प्रक्रिया में मनमाने ढंग से स्मृति को पढ़ना / लिखना चाहते हैं, तो कुछ चेतावनियां आपको पहले जानना चाहिए। यह JVM के पूरे सिद्धांत के खिलाफ है और वास्तव में वास्तव में इसे उत्पादन कोड में नहीं करना चाहिए। आप सभी सुरक्षा का उल्लंघन करते हैं और यदि आप बहुत सावधान नहीं हैं तो आप आसानी से JVM को क्रैश कर सकते हैं।

कहा जा रहा है, यह प्रयोग करने में काफी मजेदार है। वर्तमान प्रक्रिया में मनमाने ढंग से स्मृति को पढ़ने / लिखने के लिए आप sun.misc.Unsafe class का उपयोग कर सकते हैं। यह सभी जेवीएम पर उपलब्ध कराया गया है जिनके बारे में मुझे पता है और उन्होंने इसका प्रयोग किया है। क्लास का उपयोग करने के तरीके का एक उदाहरण यहां मिल सकता है ।

कुछ आईपीसी पुस्तकालय हैं जो जावा मे मेमोरी-मैप किए गए फ़ाइलों के माध्यम से साझा मेमोरी के उपयोग की सुविधा प्रदान करते हैं।

क्रॉनिकल-पंक्ति

क्रॉनिकल कतार गैर-अवरुद्ध जावा Queue समान है, सिवाय इसके कि आप एक जेवीएम में एक संदेश दे सकते हैं और दूसरे जेवीएम में इसका चुनाव कर सकते हैं।

दोनों जेवीएम में आपको एक ही एफएस निर्देशिका में एक ChronicleQueue क्वायूयूई उदाहरण बनाना चाहिए (मेमोरी-माउंटेड एफएस में इस निर्देशिका की स्थिति जानें यदि आपको संदेश दृढ़ता नहीं चाहिए):

 ChronicleQueue ipc = ChronicleQueueBuilder.single("/dev/shm/queue-ipc").build(); 

एक जेवीएम में एक संदेश लिखें:

 ExcerptAppender appender = ipc.acquireAppender(); appender.writeDocument(w -> { w.getValueOut().object(message); }); 

दूसरे जेवीएम में एक संदेश पढ़ें:

 ExcerptTailer tailer = ipc.createTailer(); // If there is no message, the lambda, passed to the readDocument() // method is not called. tailer.readDocument(w -> { Message message = w.getValueIn().object(Message.class); // process the message here }); // or avoid using lambdas try (DocumentContext dc = tailer.readingDocument()) { if (dc.isPresent()) { Message message = dc.wire().getValueIn().object(Message.class); // process the message here } else { // no message } } 

एरोन आईपीसी

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

क्रॉनिकल मानचित्र

क्रॉनिकल मानचित्र आईपीसी संचार को कुछ कुंजी के द्वारा अनुमति देता है। दोनों जेवीएम में, आपको समान विन्यास के साथ एक नक्शा बनाना चाहिए और उसी फाइल (फ़ाइल को मेमोरी-माउंट एफएस में स्थानीयकृत किया जाना चाहिए अगर आपको वास्तविक डिस्क की दृढ़ता की आवश्यकता नहीं है, जैसे /dev/shm/ ) में कायम होना चाहिए:

 Map<Key, Message> ipc = ChronicleMap .of(Key.class, Message.class) .averageKey(...).averageValue(...).entries(...) .createPersistedTo(new File("/dev/shm/jvm-ipc.dat")); 

फिर एक जेवीएम में आप लिख सकते हैं:

 ipc.put(key, message); // publish a message 

रिसीवर JVM पर:

 Message message = ipc.remove(key); if (message != null) { // process the message here } 

ईमानदारी से, आप समान स्मृति साझा नहीं करना चाहते आपको केवल दूसरी डेटा भेजना चाहिए जो आपको दूसरे जेवीएम में करना चाहिए। कहा जा रहा है कि, इस मामले में आपको साझा स्मृति की आवश्यकता है, अन्य समाधान मौजूद हैं।

डेटा दो भेजा जा रहा JVMs समान स्मृति पहुंच बिंदुओं को साझा नहीं करते हैं, इसलिए किसी दूसरे में उपयोग करने के लिए एक JVM से एक संदर्भ का उपयोग करना असंभव है। एक नया संदर्भ बस बना दिया जाएगा क्योंकि वे एक-दूसरे के बारे में नहीं जानते हैं

हालांकि, आप डेटा को अन्य जेवीएम में भेज सकते हैं, और विभिन्न तरीकों से वापस कर सकते हैं:

1) RMI का उपयोग करके, आप डेटा को पार्स करने के लिए एक रिमोट सर्वर सेटअप कर सकते हैं। मैंने इसे स्थापित करने के लिए परेशानी का थोड़ा सा पाया क्योंकि उसे सुरक्षा बदलाव की आवश्यकता है और डेटा Serializable होना चाहिए। आप लिंक पर अधिक जानकारी प्राप्त कर सकते हैं

2) किसी सर्वर का उपयोग विभिन्न स्थानों पर डेटा भेजने की आयु-पुरानी विधि है। इसे कार्यान्वित करने का एक तरीका एक ServerSocket Socket का उपयोग कर रहा है और एक localhost Socket पर Socket साथ जुड़ रहा है। ऑब्जेक्टऑटपुटस्ट्रीम का उपयोग करना चाहते हैं, तो ऑब्जेक्ट अभी भी ObjectOutputStream


डेटा साझा करना यह बहुत खतरनाक और अस्थिर, निम्न-स्तर, और, ठीक है, असुरक्षित (शब्दशः) है।

यदि आप जावा कोड का उपयोग करना चाहते हैं, तो आप सही मेमोरी पते का उपयोग कर, smUnsafe का उपयोग करने पर एक नज़र डाल सकते हैं, आप OS में बैकिंग C / C ++ arrays द्वारा संग्रहीत ऑब्जेक्ट पुनर्प्राप्त करने में सक्षम होंगे।

अन्यथा, आप खुद को सी / सी + एआरए एक्सेस करने के लिए native विधियों का उपयोग कर सकते हैं, हालांकि मेरे पास कोई सुराग नहीं है कि यह कैसे लागू किया जा सकता है।

हाँ,

एक मध्यवर्ती कार्यक्रम के साथ आप मनमाना स्मृति स्थानों को लिख सकते हैं और पढ़ सकते हैं। आप विशुद्ध रूप से जावा में ऐसा नहीं कर सकते।

उदाहरण के लिए आप सी ++ कोड का एक टुकड़ा लिख ​​सकते हैं जो मनमाना स्मृति स्थान को पढ़ सकते हैं और जेएनआई के माध्यम से कॉल कर सकते हैं। मेमोरी एड्रेस में लिखने के लिए रिवर्स में भी यही सच है

क्लास के लिए पहली कक्षा परिभाषा लिखें जिसे इस को संभालना चाहिए, उदाहरण के लिए:

 public class MemTest { public native byte[] readMemory(int address); public native void writeMemory(int address, byte[] values); } 

तब आप इसे संकलित करते हैं। उसके बाद आप इसके लिए एक शीर्षलेख बनाने के लिए javah.exe (या लिनक्स समतुल्य) का उपयोग करते हैं:

 javah MemTest 

अब आप एक। सीपीपी फ़ाइल लिखते हैं जिसमें उस हेडर को शामिल किया गया है और विधियों को परिभाषित करता है। DLL को संकलित करें । Dll लोड करने के लिए आप या तो उचित मूल्य, या System.loadLibrary () के साथ -Djava.library.path JVM पैरामीटर का उपयोग करें।

सावधानी के नोट: मैं यह करने की सिफारिश नहीं करता। लगभग निश्चित रूप से बेहतर तरीके हैं जो आप करना चाहते हैं

Distributed_cache आपकी आवश्यकताओं को पूरा करने के लिए सबसे अच्छा समाधान है

कंप्यूटिंग में, एक वितरित कैश एक लोकेल में उपयोग कैश की पारंपरिक अवधारणा का एक विस्तार है एक वितरित कैश कई सर्वरों को स्पैन कर सकता है ताकि यह आकार में और अंतर्राष्ट्रीय क्षमता में बढ़ सकता है।

कुछ विकल्प:

टेराकोटा , जेवीएम के क्लस्टर में धागे को एक दूसरे के साथ जेवीएम सीमाओं पर एक दूसरे के साथ बातचीत करने की अनुमति देता है, जो उसी अंतर्निर्मित जेवीएम सुविधा का इस्तेमाल करते हुए क्लस्टर-वाइड अर्थ

Oracle_Coherence एक स्वामित्व 1 जावा-आधारित इन-मेमोरी डेटा ग्रिड है, जिसे पारंपरिक रिलेशनल डेटाबेस प्रबंधन प्रणालियों की तुलना में बेहतर विश्वसनीयता, स्केलेबिलिटी और प्रदर्शन के लिए डिज़ाइन किया गया है

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

रेडिस एक डेटा संरचना सर्वर है यह ओपन-सोर्स, नेटवर्क, इन-मेमोरी और स्टोर्स की चाबियाँ वैकल्पिक स्थायित्व के साथ है।

काउचबेससीर एक खुले-स्रोत, वितरित (साझा-कुछ नहीं वास्तुकला) बहु-मॉडल नं SQL दस्तावेज़-उन्मुख डेटाबेस सॉफ़्टवेयर पैकेज है जो इंटरेक्टिव अनुप्रयोगों के लिए अनुकूलित है। ये अनुप्रयोग कई समवर्ती उपयोगकर्ताओं को डेटा बनाते, संगृहीत करने, पुनः प्राप्त करने, एकत्र करने, जोड़ तोड़ने और पेश करने के लिए काम कर सकते हैं।

उपयोगी पोस्ट:

टेराकोटा क्या है?

क्या टेराकोटा एक वितरित कैश है?

infoq लेख

पिवट ऑफ-हेप मेमोरी के साथ असुरक्षित

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

 public static Unsafe getUnsafe() { try { Field f = Unsafe.class.getDeclaredField("theUnsafe"); f.setAccessible(true); return (Unsafe)f.get(null); } catch (Exception e) { /* ... */ } } MyStructure structure = new MyStructure(); // create a test object structure.x = 777; long size = sizeOf(structure); long offheapPointer = getUnsafe().allocateMemory(size); getUnsafe().copyMemory( structure, // source object 0, // source offset is zero - copy an entire object null, // destination is specified by absolute address, so destination object is null offheapPointer, // destination address size ); // test object was copied to off-heap Pointer p = new Pointer(); // Pointer is just a handler that stores address of some object long pointerOffset = getUnsafe().objectFieldOffset(Pointer.class.getDeclaredField("pointer")); getUnsafe().putLong(p, pointerOffset, offheapPointer); // set pointer to off-heap copy of the test object structure.x = 222; // rewrite x value in the original object System.out.println( ((MyStructure)p.pointer).x ); // prints 777 .... class Pointer { Object pointer; } 

तो अब आप (MyStructure) p.pointer से MyStructure और p पास कर सकते हैं। एक दूसरी जेवीएम में एक्स, और आपको निम्न में सक्षम होना चाहिए:

 MyStructure locallyImported = (MyStructure)p.pointer; 

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

https://highlyscalable.wordpress.com/2012/02/02/direct-memory-access-in-java/ से लिया कोड स्निपेट्स