क्या जावा एप्लिकेशन प्रति एक जेवीएम है?


91

क्या वही JVM सभी जावा अनुप्रयोगों द्वारा उपयोग किया जाता है या, 'एक JVM प्रति जावा अनुप्रयोग' लागू होता है? (कहते हैं कि आवेदन IntelliJ IDEA, एक सर्वर और उदाहरण के लिए NetBeans हैं)

इसके अलावा, क्या JVM द्वारा निर्दिष्ट और प्रत्येक जावा एप्लिकेशन द्वारा उपयोग की जाने वाली प्रक्रियाओं के बीच कोई संबंध है?


2
यह एक बड़ा सवाल है। :)
जैमी

जवाबों:


81

आम तौर पर बोलते हुए, प्रत्येक एप्लिकेशन को अपना स्वयं का जेवीएम उदाहरण और अपनी ओएस-स्तरीय प्रक्रिया मिलेगी और प्रत्येक जेवीएम उदाहरण एक-दूसरे से स्वतंत्र होता है।

कुछ कार्यान्वयन विवरण हैं जैसे कि क्लास डेटा शेयरिंग , जहां कई JVM इंस्टेंस कुछ डेटा / मेमोरी साझा कर सकते हैं, लेकिन उन अनुप्रयोगों के लिए कोई उपयोगकर्ता-दृश्यमान प्रभाव नहीं है (बेहतर स्टार्टअप समय को छोड़कर, उम्मीद है)।

एक सामान्य परिदृश्य हालांकि एक एकल एप्लिकेशन सर्वर (या "वेब सर्वर") है जैसे कि ग्लासफिश या टॉम्कट कई वेब एप्लिकेशन चला रहे हैं। इस मामले में, कई वेब एप्लिकेशन एक JVM साझा कर सकते हैं।


21

प्रति जावा एप्लिकेशन में एक JVM है। जब तक आप नेटवर्किंग के साथ एक स्थापित नहीं करते हैं, तब तक उनके बीच कोई संबंध नहीं होना चाहिए। यदि आप एक IDE के अंदर काम कर रहे हैं, तो आपके द्वारा लिखा गया कोड आमतौर पर एक अलग JVM में चलता है। आईडीई आमतौर पर डिबगिंग के लिए अलग JVM को कनेक्ट करेगा। यदि आप कई वेब अनुप्रयोगों के साथ काम कर रहे हैं तो वे उसी JVM को साझा कर सकते हैं यदि वे एक ही वेब कंटेनर में तैनात हों।


12

सिद्धांत रूप में आप एक JVM में कई एप्लिकेशन चला सकते हैं। व्यवहार में, वे विभिन्न तरीकों से एक-दूसरे के साथ हस्तक्षेप कर सकते हैं। उदाहरण के लिए :

  • JVM में एक सेट System.in/ out/ err, एक डिफ़ॉल्ट एन्कोडिंग, एक डिफ़ॉल्ट लोकेल, सिस्टम गुणों का एक सेट, और इसी तरह होता है। यदि कोई अनुप्रयोग इनको बदलता है, तो यह सभी अनुप्रयोगों को प्रभावित करता है।
  • जो भी एप्लिकेशन कॉल करता System.exit()है वह सभी एप्लिकेशन को मारता है।
  • यदि एक अनुप्रयोग थ्रेड जंगली जाता है, और बहुत अधिक सीपीयू या मेमोरी का उपभोग करता है तो यह अन्य अनुप्रयोगों को भी प्रभावित करेगा।

8

चल रहे जेवीएम की संख्या, लागू किए गए निष्पादन की संख्या है। ऐसा प्रत्येक एप्लिकेशन अपने स्वयं के जावा निष्पादन योग्य (विंडोज़ के लिए java.exe / javaw.exe etx) को आमंत्रित करता है, जिसका अर्थ है कि प्रत्येक एक अलग JVM में चल रहा है।


8

संक्षिप्त उत्तर: अक्सर, हाँ, आपको प्रति JVM एक आवेदन मिलेगा। लंबे उत्तर: जेवीएम का उपयोग उस तरह से किया जा सकता है, और यह सबसे अच्छा विकल्प हो सकता है, लेकिन यह होना जरूरी नहीं है।

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

एप्लिकेशन सर्वर (Wildfly, Glassfish, Websphere, Weblogic, आदि) ऐसे अनुप्रयोग हैं जिनके raison d'etre को चलाने के लिए अन्य अनुप्रयोगों के लिए कंटेनरों के रूप में कार्य करना होता है। उस स्थिति में, एक दृष्टिकोण से, एक JVM प्रति अनुप्रयोग (यानी एक JVM) होता है। पूरे एप्लिकेशन सर्वर को चलाने के लिए उपयोग किया जाता है) लेकिन वास्तव में उस JVM के भीतर कई अनुप्रयोग होते हैं, प्रत्येक तार्किक रूप से अपने स्वयं के सह-लोडर (आकस्मिक-प्रक्रिया क्रॉस्टॉक की संभावना को कम करने) में एक दूसरे से अलग होते हैं।

तो, यह सब वास्तव में इस बात पर निर्भर करता है कि आप क्या मानते applicationहैं। यदि आप विशुद्ध रूप से "उस चीज़ के बारे में बात कर रहे हैं जो 'मुख्य ()' कहे जाने पर चलती है", तो आप प्रति JVM एक अनुप्रयोग देख रहे हैं - जब OS JVM शुरू करता है, तो JVM एक एकल वर्ग public static void main()विधि चलाता है ।

लेकिन एक बार जब आपके आवेदन अधिक जटिल होने लगते हैं तो आपकी सीमाएं अधिक धुंधली हो जाती हैं। इंटेलीज या एक्लिप्स जैसी एक आईडीई 'जेवैक' के रूप में एक ही सामान का अधिक उपयोग करेगी, या तो एक ही जेवीएम या एक अलग में, साथ ही साथ अलग-अलग काम (जैसे कि स्क्रीन को फिर से करना)। और (साझा JVM) एप्लिकेशन सर्वर पर एक वेब एप्लिकेशन के उपयोगकर्ता वास्तव में कमांड लाइन के माध्यम से स्थानीय रूप से उपयोग किए जा सकने वाले 'कोर' एप्लिकेशन का अधिक उपयोग कर सकते हैं।


5

जिन भी एप्लिकेशन ने पुस्तकालयों को साझा किया है, वे उन पुस्तकालयों की एक ही प्रति साझा करेंगे। जावा में साझा पुस्तकालयों की एक उचित मात्रा है। हालाँकि, आपको कुछ स्मृति को सहेजने के अलावा अंतर दिखाई नहीं देगा।


2

थोड़ी देर यहाँ लेकिन यह जानकारी किसी के लिए उपयोगी हो सकती है। लिनक्स सिस्टम में, यदि आप जानना चाहते हैं कि कितने JVM चल रहे हैं तो आप इस कमांड को आजमा सकते हैं

$ ps -ef | grep "[j]ava" | wc -l

psgrep"जावा" युक्त खोज प्रक्रिया को सूचीबद्ध करने के लिए और wcलौटाई गई लाइनों की गणना करने के लिए


0

वास्तव में यह एक ऐसा प्रश्न है जिसके बहुत ही उलझाने वाले उत्तर हो सकते हैं। इसे छोटा रखने के लिए:

  1. हां प्रति जावा प्रक्रिया, प्रति जेवीएम।
  2. रनटाइम और प्रोसेसब्यूलर इस नियम का पालन करते हैं।
  3. प्रतिबिंब का उपयोग कर जार लोड हो रहा है और फिर मुख्य निष्पादित करके नया JVM नहीं होगा।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.