Pertanyaan Apakah ada satu JVM per aplikasi Java?


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

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


59
2018-05-10 08:22


asal


Jawaban:


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

Ada beberapa detail implementasi seperti Pembagian Data Kelas, di mana beberapa instance JVM mungkin berbagi beberapa data / memori tetapi mereka tidak memiliki efek yang terlihat oleh pengguna terhadap 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.


56
2018-05-10 08:54



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


13
2018-05-10 08:26



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


6
2018-05-10 08:27



Secara teori Anda dapat menjalankan beberapa aplikasi dalam JVM. Dalam prakteknya, mereka dapat saling mengganggu dengan berbagai cara. Sebagai contoh:

The JVM has one set of System.in/out/err, one default encoding, one default locale, one set of system properties, and so on. If one application changes these, it affects all applications.
Any application that calls System.exit() kills all applications.
If one application thread goes wild, and consumes too much CPU or memory it will affect the other applications too.

Refrensi


6
2017-11-27 12:27



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


4
2018-05-10 09:17



Sedikit terlambat di sini, namun info ini mungkin berguna untuk seseorang. Dalam sistem Linux, jika Anda ingin tahu berapa banyak JVM yang berjalan, Anda dapat mencoba perintah ini

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

ps ke daftar proses, grep untuk proses pencarian yang mengandung "java" dan wc untuk menghitung garis kembali


1
2018-02-08 05:18



Jawaban singkat: sering, ya, Anda akan mendapatkan satu aplikasi per JVM. Jawaban panjang: JVM dapat digunakan seperti itu, dan itu mungkin merupakan 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 akhir (yaitu kita) sebagai entitas tunggal tetapi yang sebenarnya terdiri dari beberapa aplikasi yang mendasari (kompiler, pelari pengujian, alat analisis statis, pembuat paket, manajer paket, proyek / alat manajemen ketergantungan, dll). Dalam hal itu ada berbagai trik yang digunakan IDE untuk memastikan bahwa pengguna mengalami pengalaman yang terintegrasi sementara juga terlindung (sampai batas tertentu) dari keanehan individu dari alat yang mendasarinya. Salah satu trik tersebut adalah melakukan beberapa hal-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 raison d'etre-nya berfungsi sebagai wadah untuk aplikasi lain untuk dijalankan. 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 dalam JVM itu sendiri, masing-masing dipisahkan secara logis dari satu sama lain dalam classloader mereka sendiri (mengurangi kemungkinan crosstalk dalam proses yang tidak disengaja).

Jadi, semuanya tergantung pada apa yang Anda anggap sebagai application menjadi. Jika Anda murni berbicara tentang "hal yang berjalan ketika 'main ()' dipanggil", maka Anda melihat satu aplikasi per JVM - ketika OS memulai JVM, JVM menjalankan satu kelas public static void main() metode.

Tetapi begitu aplikasi Anda mulai semakin rumit, batas Anda menjadi lebih kabur. Sebuah IDE seperti Intellij atau Eclipse akan menggunakan kembali banyak hal yang sama seperti 'javac', baik dalam JVM yang sama atau yang berbeda, serta melakukan pekerjaan yang berbeda (seperti pengecatan ulang layar). Dan pengguna aplikasi web pada server aplikasi (bersama JVM) sebenarnya mungkin menggunakan banyak aplikasi 'inti' yang sama seperti yang bisa digunakan secara lokal melalui baris perintah.


1
2017-12-23 23:28