Apakah ada satu JVM per aplikasi Java?

91

Apakah JVM yang sama digunakan oleh semua aplikasi Java yang berjalan atau, apakah 'satu JVM per aplikasi Java' berlaku? (katakanlah aplikasinya adalah IntelliJ IDEA, server dan NetBeans misalnya)

Lebih lanjut, apakah ada hubungan antara JVM yang ditetapkan dan proses yang digunakan oleh setiap aplikasi Java?

nadh
sumber
2
Ini pertanyaan yang bagus. :)
jamie

Jawaban:

81

Secara umum, setiap aplikasi akan mendapatkan instans JVM-nya sendiri dan proses tingkat OS-nya sendiri, dan setiap instans JVM tidak bergantung satu sama lain.

Ada beberapa detail implementasi seperti Berbagi Data Kelas , di mana beberapa instans JVM mungkin berbagi beberapa data / memori tetapi tidak memiliki efek yang terlihat oleh pengguna ke aplikasi (kecuali untuk waktu startup yang lebih baik, semoga).

Namun skenario umum adalah server aplikasi tunggal (atau "server web") seperti Glassfish atau Tomcat yang menjalankan beberapa aplikasi web. Dalam hal ini, beberapa aplikasi web dapat berbagi JVM.

Joachim Sauer
sumber
21

Ada satu JVM per aplikasi Java. Seharusnya tidak ada koneksi apa pun di antara mereka kecuali Anda membuatnya, misalnya dengan jaringan. Jika Anda bekerja di dalam IDE, kode yang Anda tulis biasanya berjalan di JVM terpisah. IDE biasanya akan menghubungkan JVM terpisah untuk debugging. Jika Anda berurusan dengan beberapa aplikasi web, mereka dapat berbagi JVM yang sama jika diterapkan ke penampung web yang sama.

WhiteFang 34
sumber
12

Secara teori, Anda dapat menjalankan banyak aplikasi dalam JVM. Dalam praktiknya, mereka dapat saling mengganggu dengan berbagai cara. Contoh :

  • JVM memiliki satu set System.in/ out/ err, satu pengkodean default, satu lokal default, satu set properti sistem, dan seterusnya. Jika satu aplikasi mengubahnya, itu mempengaruhi semua aplikasi.
  • Aplikasi apa pun yang memanggil akan System.exit()membunuh semua aplikasi.
  • Jika satu utas aplikasi menjadi liar, dan menghabiskan terlalu banyak CPU atau memori, itu akan mempengaruhi aplikasi lain juga.
Rajneesh Mishra
sumber
8

Jumlah JVM yang berjalan adalah jumlah executable yang dipanggil. Setiap aplikasi tersebut memanggil java executable-nya sendiri (java.exe / javaw.exe etx untuk windows) yang berarti masing-masing berjalan di JVM terpisah.

d-hidup
sumber
8

Jawaban singkatnya: sering kali, ya, Anda akan mendapatkan satu aplikasi per JVM. Jawaban panjang: JVM dapat digunakan dengan cara itu, dan itu mungkin pilihan terbaik, tetapi tidak harus demikian.

Itu semua tergantung pada apa yang Anda anggap sebagai 'aplikasi'. IDE adalah contoh yang baik dari aplikasi yang disajikan kepada pengguna akhirnya (yaitu kami) sebagai entitas tunggal tetapi sebenarnya terdiri dari beberapa aplikasi yang mendasari (kompiler, runner pengujian, alat analisis statis, pembuat paket, manajer paket, proyek / alat manajemen ketergantungan, dll). Dalam hal ini, ada berbagai trik yang digunakan IDE untuk memastikan bahwa pengguna mengalami pengalaman terintegrasi sambil juga dilindungi (sampai batas tertentu) dari keanehan individu alat yang mendasarinya. Salah satu trik tersebut adalah melakukan beberapa hal dalam JVM terpisah, berkomunikasi baik melalui file teks atau melalui fasilitas debugging tingkat aplikasi.

Server aplikasi (Wildfly, Glassfish, Websphere, Weblogic, dll) adalah aplikasi yang alasan utamanya adalah bertindak sebagai wadah untuk menjalankan aplikasi lain. Dalam hal ini, dari satu perspektif, ada satu JVM per aplikasi (yaitu satu JVM digunakan untuk menjalankan seluruh server aplikasi) tetapi sebenarnya ada beberapa aplikasi yang terkandung di dalam JVM itu dengan haknya masing-masing, masing-masing secara logis dipisahkan satu sama lain dalam classloader mereka sendiri (mengurangi kemungkinan crosstalk dalam proses yang tidak disengaja).

Jadi, itu semua sangat tergantung pada apa yang Anda anggap applicationsebagai. Jika Anda hanya berbicara tentang "hal yang berjalan ketika 'main ()' dipanggil", maka Anda melihat satu aplikasi per JVM - saat OS memulai JVM, JVM menjalankan public static void main()metode kelas tunggal .

Tapi begitu aplikasi Anda mulai menjadi lebih rumit, batasan Anda menjadi lebih kabur. IDE seperti Intellij atau Eclipse akan menggunakan kembali banyak hal yang sama dengan 'javac', baik di JVM yang sama atau yang berbeda, serta melakukan pekerjaan yang berbeda (seperti mengecat ulang layar). Dan pengguna aplikasi web pada server aplikasi (JVM bersama) mungkin sebenarnya menggunakan aplikasi 'inti' yang sama seperti yang dapat digunakan secara lokal melalui baris perintah.

sisyphus
sumber
5

Aplikasi apa pun yang memiliki perpustakaan bersama akan berbagi salinan perpustakaan yang sama. Java memiliki cukup banyak perpustakaan bersama. Namun, Anda tidak akan melihat perbedaannya kecuali beberapa memori yang disimpan.

Peter Lawrey
sumber
2

Sedikit terlambat disini namun info ini mungkin berguna untuk seseorang. Di sistem Linux, jika Anda ingin mengetahui berapa banyak JVM yang berjalan, Anda dapat mencoba perintah ini

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

psuntuk proses daftar, grepuntuk proses pencarian yang mengandung "java" dan wcuntuk menghitung baris yang dikembalikan

Ram Dwivedi
sumber
0

Sebenarnya ini adalah satu pertanyaan yang bisa memiliki jawaban yang sangat membingungkan. Untuk membuatnya tetap singkat:

  1. Ya, per proses java, per JVM.
  2. Runtime dan ProcessBuilder mengikuti aturan ini.
  3. Memuat toples menggunakan refleksi dan kemudian menjalankan utama tidak akan memunculkan JVM baru.
asmitB
sumber