Java uygulaması başına bir JVM var mı?


91

Aynı JVM, çalışan tüm Java uygulamaları tarafından mı kullanılıyor, yoksa 'Java uygulaması başına bir JVM' geçerli mi? (örneğin, uygulamaların IntelliJ IDEA, bir sunucu ve NetBeans olduğunu söyleyin)

Ayrıca, atanan JVM'ler ile her Java uygulaması tarafından kullanılan işlemler arasında herhangi bir bağlantı var mı?


2
Bu harika bir soru. :)
jamie

Yanıtlar:


81

Genel olarak konuşursak, her uygulama kendi JVM örneğini ve kendi işletim sistemi düzeyinde sürecini alır ve her JVM örneği birbirinden bağımsızdır.

Birden fazla JVM örneğinin bazı verileri / belleği paylaşabildiği ancak bunların uygulamalar üzerinde kullanıcı tarafından görülebilen bir etkisinin olmadığı (umarız iyileştirilmiş başlatma süresi hariç) Sınıf Veri Paylaşımı gibi bazı uygulama ayrıntıları vardır .

Ancak yaygın bir senaryo, birden çok web uygulamasını çalıştıran Glassfish veya Tomcat gibi tek bir uygulama sunucusudur (veya "web sunucusu"). Bu durumda, birden çok web uygulaması bir JVM'yi paylaşabilir.


21

Java uygulaması başına bir JVM vardır. Ağ kurma gibi bir tane kurmadığınız sürece aralarında herhangi bir bağlantı olmamalıdır. Bir IDE'nin içinde çalışıyorsanız, yazdığınız kod genellikle ayrı bir JVM'de çalışır. IDE, hata ayıklama için tipik olarak ayrı JVM'yi bağlayacaktır. Birden fazla web uygulamasıyla uğraşıyorsanız, aynı web kapsayıcısına dağıtılırlarsa aynı JVM'yi paylaşabilirler.


12

Teorik olarak, bir JVM'de birden fazla uygulama çalıştırabilirsiniz. Pratikte, birbirlerine çeşitli şekillerde müdahale edebilirler. Örneğin :

  • JVM'de bir dizi System.in/ out/ err, bir varsayılan kodlama, bir varsayılan yerel ayar, bir sistem özellikleri kümesi vb. Bulunur. Bir uygulama bunları değiştirirse, tüm uygulamaları etkiler.
  • System.exit()Çağıran herhangi bir uygulama tüm uygulamaları öldürür.
  • Bir uygulama iş parçacığı çılgına dönerse ve çok fazla CPU veya bellek tüketirse, diğer uygulamaları da etkileyecektir.

8

Çalışan JVM sayısı, çağrılan yürütülebilir dosya sayısıdır. Bu tür her uygulama kendi java yürütülebilir dosyasını (windows için java.exe / javaw.exe etx) çağırır, bu da her birinin ayrı bir JVM'de çalıştığı anlamına gelir.


8

Kısa cevap: genellikle, evet, JVM başına bir başvuru alırsınız. Uzun cevap: JVM bu şekilde kullanılabilir ve bu en iyi seçenek olabilir, ancak olması gerekmiyor.

Her şey neyi bir 'uygulama' olarak gördüğünüze bağlıdır. Bir IDE, son kullanıcılarına (yani bize) tek bir varlık olarak sunulan ancak aslında birden fazla temel uygulamadan (derleyiciler, test çalıştırıcıları, statik analiz araçları, paketleyiciler, paket yöneticileri, proje / bağımlılık yönetimi araçları, vb.). Bu durumda, IDE'nin kullanıcının entegre bir deneyim yaşamasını sağlamak için kullandığı çeşitli hileler vardır ve aynı zamanda altta yatan araçların bireysel değişkenlerinden (bir dereceye kadar) korunmaktadır. Böyle bir hile, bazı şeyleri ayrı bir JVM'de yapmak, ya metin dosyalarıyla ya da uygulama düzeyinde hata ayıklama araçlarıyla iletişim kurmaktır.

Uygulama sunucuları (Wildfly, Glassfish, Websphere, Weblogic, vb.), Varoluş nedeni diğer uygulamaların içinde çalışması için konteyner görevi görmesi gereken uygulamalardır. Bu durumda, bir açıdan bakıldığında, uygulama başına tek bir JVM (yani bir JVM) vardır. uygulama sunucusunun tamamını çalıştırmak için kullanılır), ancak aslında bu JVM içinde kendi başlarına bulunan ve her biri kendi sınıf yükleyicisinde mantıksal olarak birbirinden ayrılmış (işlem sırasında kazara çapraz konuşma olasılığını azaltan) birden çok uygulama vardır.

Yani, gerçekten ne olduğunu düşündüğünüze bağlı application. Tamamen "'main ()' çağrıldığında çalışan şeyden" bahsediyorsanız, JVM başına bir uygulamaya bakarsınız - işletim sistemi JVM'yi başlattığında, JVM tek bir sınıfın public static void main()yöntemini çalıştırır.

Ancak uygulamalarınız daha karmaşık hale gelmeye başladığında, sınırlarınız daha bulanık hale gelir. Intellij veya Eclipse gibi bir IDE, 'javac' ile aynı şeylerin çoğunu aynı JVM'de veya farklı bir JVM'de yeniden kullanacak ve farklı işler yapacaktır (ekranı yeniden boyamak gibi). Ve bir (paylaşılan JVM) uygulama sunucusundaki bir web uygulamasının kullanıcıları, aslında komut satırı aracılığıyla yerel olarak kullanılabilen aynı "çekirdek" uygulamayı kullanıyor olabilir.


5

Kütüphaneleri paylaşan herhangi bir uygulama, bu kütüphanelerin aynı kopyasını paylaşacaktır. Java'nın oldukça fazla sayıda paylaşılan kitaplığı vardır. Ancak kaydedilen hafızanın bir kısmı dışında farkı fark etmeyeceksiniz.


2

Burada biraz geç, ancak bu bilgi birileri için yararlı olabilir. Bir Linux sisteminde, kaç JVM'nin çalıştığını bilmek istiyorsanız, bu komutu deneyebilirsiniz.

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

pssüreci listelemek, grep"java" içeren süreci aramak ve wcdöndürülen satırları saymak için


0

Aslında bu çok kafa karıştırıcı cevapları olabilecek bir sorudur. Gerçekten kısa tutmak için:

  1. Evet, java işlemi başına, JVM başına.
  2. Runtime ve ProcessBuilder bu kuralı izler.
  3. Yansımayı kullanarak kavanozları yüklemek ve ardından ana dosyayı yürütmek yeni JVM oluşturmaz.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.