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.
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?
Jeśli tak, kiedy uruchomimy inną aplikację java, użyje ona tej instancji JVM lub utworzy nową?
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?
Czy istnieje proces, który zarządza n wystąpieniami maszyny JVM, czy też jest zarządzany przez sam system operacyjny?
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)?
Odpowiedzi:
Tak, może. Sposób, w jaki to się robi, zależy od systemu operacyjnego i samego kontenera serwera WWW.
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.)
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.
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.
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.
źródło
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.
źródło