Gdy na tym samym komputerze działa wiele programów Java

83

Każda aplikacja Java będzie działać w określonej Instancji Wirtualnej Maszyny Java. Jestem naprawdę zdezorientowany w poniższych aspektach, a Google jeszcze bardziej mnie zdezorientował. Różne artykuły w różnych witrynach.

  1. Jeśli mam usługę WWW napisaną w Javie, do uruchomienia będzie potrzebna instancja JVM. Czy więc JVM może być procesem demona?

  2. Jeśli tak, kiedy uruchomimy inną aplikację java, użyje ona tej instancji JVM lub utworzy nową?

  3. Pamięć główna dostępna w każdej maszynie jest stała. Kiedy uruchamiamy jednocześnie n procesów java bez podawania początkowego rozmiaru sterty, w jaki sposób rozmiar sterty jest rozkładany między procesy?

  4. Czy istnieje proces, który zarządza n wystąpieniami maszyny JVM, czy też jest zarządzany przez sam system operacyjny?

  5. Czy w przypadku zatrzymania świata podczas GC ma to wpływ na inne wystąpienia JVM (zakładam, że są to różne wątki)?

Aniket Thakur
źródło
2
Twój pierwszy punkt zależy od implementacji kontenera ...
MadProgrammer
6
+1 za szczegółowe wyjaśnienie i zbadanie pytania przed zapytaniem.
amod

Odpowiedzi:

80

1) Jeśli mam usługę sieciową napisaną w Javie, do uruchomienia będzie potrzebna instancja JVM. Czy zatem JVM można uczynić procesem demona?

Tak, może. Sposób, w jaki to się robi, zależy od systemu operacyjnego i samego kontenera serwera WWW.

2) Jeśli tak, kiedy uruchomimy inną aplikację java, użyje ona tej instancji maszyny JVM lub utworzy nową?

Nie. Każda aplikacja Java korzysta z niezależnej maszyny JVM.

Każda JVM to oddzielny proces, co oznacza, że ​​nie ma współdzielenia stosów, stert itp. (Ogólnie rzecz biorąc, jedynymi rzeczami, które mogą być współużytkowane, są segmenty tylko do odczytu, które zawierają kod podstawowej maszyny JVM i natywnych bibliotek ... w taki sam sposób, w jaki normalne procesy mogą współdzielić segmenty kodu.)

3) Pamięć główna dostępna w każdej maszynie jest stała. Kiedy uruchamiamy jednocześnie n procesów java bez podania początkowego rozmiaru sterty, w jaki sposób rozmiar sterty jest rozkładany między procesy?

Mechanizm decydujący o wielkości stosu, jeśli nie określisz rozmiaru, zależy od używanej maszyny JVM / platformy / wersji oraz od tego, czy używasz modelu „klient”, czy „serwer” (dla maszyn JVM typu Hotspot). Heurystyka nie uwzględnia liczby ani rozmiaru innych maszyn JVM.

Źródła: https://stackoverflow.com/a/4667635/139985

W praktyce prawdopodobnie lepiej byłoby bezpośrednio określić rozmiar sterty.

4) Czy istnieje proces, który zarządza n wystąpieniami maszyny JVM, czy też jest zarządzany przez sam system operacyjny?

Ani. Liczba instancji JVM jest określana przez działania różnych rzeczy, które mogą uruchamiać procesy; np. skrypty demonów, skrypty poleceń, użytkownicy wpisujący polecenia w wierszu poleceń itp. Ostatecznie system operacyjny może odmówić uruchomienia kolejnych procesów, jeśli zabraknie mu zasobów, ale maszyny JVM nie są traktowane inaczej niż inne procesy.

5) Czy w przypadku zatrzymania świata podczas GC ma to wpływ na inne instancje JVM (zakładam, że są to różne wątki)?

Nie. JVM to niezależne procesy. Nie mają żadnego zmiennego stanu. Wyrzucanie elementów bezużytecznych działa na każdej maszynie JVM niezależnie.

Stephen C.
źródło
10
  1. zobacz Jak zdemonizować program w języku Java?
  2. zostanie utworzona nowa instancja JVM
  3. w taki sam sposób, jak pamięć jest współdzielona między wszystkimi innymi procesami
  4. jest zarządzany przez O / S
  5. nie dotyczy to innych instancji

Jeśli Twoje instancje muszą koordynować swoją pracę, możesz utworzyć jedną główną instancję, która będzie uruchamiać / zatrzymywać inne instancje.

Nie wyjaśniłeś, dlaczego potrzebujesz wielu instancji JVM. Prawdopodobnie pojedyncza instancja działałaby lepiej.

Alexei Kaigorodov
źródło