2009-03-26 12 views
14

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

लेकिन पूरी जेवीएम चीज़ वास्तव में कैसे काम करती है? क्या मेरे द्वारा लॉन्च किए गए प्रत्येक जावा प्रोग्राम के लिए एक अलग प्रक्रिया में एक अलग जेवीएम है? क्या सिस्टम प्रोग्राम में चल रहे जावा प्रोग्राम कुछ भी साझा करते हैं? क्या ओएस और जेवीएम कार्यान्वयन के बीच अंतर है? क्या मैं बना सकता हूं प्रोग्राम चर साझा करते हैं (i. ई। सीधे सामान्य आईपीसी तंत्र की बजाय JVM के माध्यम से)? क्या विशेष प्रयोजनों के लिए अधिक विदेशी एक-प्रक्रिया JVMs हैं?

आम तौर पर, जेवीएम के झटके के बारे में क्या सिफारिश की जाती है? spec? कुछ कार्यान्वयन का स्रोत कोड? वेबसाइटें? पुस्तकें?

उत्तर

23

जावा में, स्थिर वर्ग के सदस्य प्रोग्राम के बीच साझा किए गए हैं?

एक वर्ग को इसके पूर्ण नाम और क्लास लोडर द्वारा परिभाषित किया गया है जो इसे लोड करता है। यदि एक ही कक्षा एक ही जेवीएम प्रक्रिया के भीतर है और दोनों कार्यक्रमों ने कक्षा को उसी वर्ग लोडर के माध्यम से लोड किया है तो स्थिर सदस्य साझा किए जाते हैं। क्लासलोडिंग नियम अत्यधिक महत्व के हैं।

मैं कल्पना है कि नहीं, वे नहीं है, क्योंकि हर प्रक्रिया, अपने स्वयं के स्मृति स्थान है निश्चित रूप से कर रहे हैं ।

यदि आप दो ऐप्स लॉन्च करने के लिए दो अलग-अलग JVMs का उपयोग कर रहे हैं, तो आप सही हैं। लेकिन टॉमकैट जैसे एप्लिकेशन/सर्वलेट कंटेनर का मामला लें: वे एक ही प्रक्रिया (टॉमकैट होस्ट प्रक्रिया) के माध्यम से कई ऐप्स लोड करते हैं।

लेकिन पूरी JVM चीज़ वास्तव में कैसे काम करती है? क्या प्रत्येक जावा प्रोग्राम लॉन्च करने के लिए एक अलग प्रक्रिया में एक अलग JVM है? जावा सिस्टम सिस्टम में चल रहे प्रोग्राम कुछ भी करते हैं?

प्रत्येक बार जब आप कमांड लाइन पर >java -cp... टाइप करते हैं, तो आप एक नई प्रक्रिया बना रहे हैं। ध्यान रखें कि जब आप ग्रहण चलाते हैं या fork=true के साथ एक चींटी जावा कार्य को कॉल करते हैं तो आप भी नई प्रक्रियाएं बना रहे हैं।

क्या ओएस और जेवीएम कार्यान्वयन के बीच अंतर है? क्या मैं प्रोग्राम्स साझा कर सकता हूं (i। E। सीधे सामान्य आईपीसी तंत्र के बजाय JVM के माध्यम से)? क्या विशेष प्रयोजनों के लिए अधिक विदेशी एक-प्रक्रिया JVMs हैं?

एक पोस्टर की तरह, टेराकोटा जैसी परियोजनाएं हैं जो आपके लिए यह सुविधा प्रदान करती हैं। इस प्रकार के साझाकरण के लिए एक सामान्य दृष्टिकोण एक वितरित कैश है।

+0

सुंदर उत्तर। धन्यवाद :) – mac

6

नहीं, स्थिर चर JVMs के बीच नहीं हैं। हां, आपके द्वारा चलाए जाने वाले प्रत्येक जावा ऐप के लिए एक अलग जेवीएम प्रक्रिया है।

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

नहीं, आप प्रोग्राम्स को पारदर्शी रूप से साझा नहीं कर सकते हैं।

मुझे विश्वास है कि जेवीएम के बारे में किताबें हैं, लेकिन मैं किसी की भी सिफारिश नहीं कर सकता। आप इसके विवरण के लिए हॉटस्पॉट श्वेत पत्रों की तलाश में शायद सबसे अच्छे होंगे। This one एक बहुत अच्छा प्रारंभिक बिंदु है।

1

आप अपनी धारणा में सही हैं। हां, प्रत्येक जेवीएम एक अलग प्रक्रिया है। जब आप दो जावा प्रोग्राम चला रहे हैं तो टास्क मैनेजर खोलकर आप इसकी पुष्टि कर सकते हैं (नाम से प्रक्रियाओं को सॉर्ट करें और java.exe या javaw.exe देखें)।

यह JVMs (उदाहरण के लिए, स्थानीय सॉकेट के साथ) एक दूसरे से कनेक्ट करना संभव है, लेकिन वहाँ में बनाया कुछ भी नहीं है।

6

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

उसी वीएम पर अलग-अलग धागे के पास अलग-अलग वर्ग लोडर का उपयोग किया जाने पर अपने स्वयं के स्थैतिक वर्ग नेम्बर उदाहरण हो सकते हैं।

क्लासिक उदाहरण यहां Apache Tomcat होगा जो विभिन्न वेब अनुप्रयोगों को अलग रखता है, हालांकि सभी अनुप्रयोगों के लिए lib jars सामान्य हो सकता है।

+1

+1 क्लासलोडर्स के लिए +1, जो स्थिर चर के दायरे को निर्धारित करता है। हालांकि धागे के लिए विशिष्ट नहीं है, क्योंकि क्लासलोडर निष्पादन के एक धागे पर भी बदल सकता है। जेईई और ओएसजीआई वातावरण में काफी आम है। – Robin

2

कार्यान्वयन पर निर्भर करता है, लेकिन हां चीजें साझा की जाती हैं। इसे बदलने के लिए काम चल रहा है/था, और सूर्य (ऐप्पल के माध्यम से) ने वीएम के उदाहरणों के बीच डेटा साझा करने में बहुत काम किया है। एक लिंक है जो उस here में से कुछ पर चर्चा करता है।

किसी भी तरह के साझा करने के लिए वीएम कार्यान्वयन करने की आवश्यकता होती है, तो आप प्रोग्रामर के रूप में ऐसा करने के लिए कुछ भी नहीं कर सकते हैं।

वीएम स्पेक here है, इसके बारे में कुछ (पुरानी) किताबें भी हैं। आप Kaffe के लिए स्रोत भी देख सकते हैं जो कि बहुत छोटा है।

2

यदि आप JVMs में चर साझा करना चाहते हैं, तो आप Terracotta जैसे क्लस्टरिंग उत्पादों को देख सकते हैं।वे खुद को "नेटवर्क संलग्न स्मृति" के रूप में संदर्भित करते हैं और आपको प्रतिकृति तकनीक का उपयोग करके JVMs में ऑब्जेक्ट संदर्भ साझा करने देते हैं।

1

केविन ने जो कुछ भी बताया है उसका पालन करने के लिए, कोई JVM कार्यान्वयन नहीं है जो मुझे पता है जो आपको JVM उदाहरणों में स्थिर चर साझा करने की अनुमति देता है। जैसा कि पिछले उत्तरों ने कहा है (सही) - प्रत्येक जेवीएम उदाहरण यह स्वयं की प्रक्रिया है।

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

Terracotta साइट के कुकबुक अनुभाग में प्रचुर उदाहरण हैं - मैं आपको यह काम करने के लिए महसूस करने के लिए हैलो Clustered Instance Recipe से शुरू करने की सलाह देता हूं।

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