Ini benar-benar terkait dengan Hotspot dan default nilai opsi ( Java HotSpot VM Options ) yang berbeda antara klien dan konfigurasi server.
Dari Bab 2 whitepaper ( The Java HotSpot Performance Engine Architecture ):
JDK mencakup dua rasa VM - penawaran sisi klien, dan VM yang disetel untuk aplikasi server. Dua solusi ini berbagi basis kode lingkungan runtime Java HotSpot, tetapi menggunakan kompiler yang berbeda yang cocok dengan karakteristik kinerja klien dan server yang unik. Perbedaan-perbedaan ini termasuk kompilasi kebijakan inlining dan heap default.
Meskipun Server dan VM Klien serupa, Server VM telah disesuaikan untuk memaksimalkan kecepatan operasi puncak. Ini dimaksudkan untuk mengeksekusi aplikasi server yang sudah berjalan lama, yang membutuhkan kecepatan operasi secepat mungkin lebih dari waktu start-up cepat atau jejak memori runtime yang lebih kecil.
Kompiler VM Klien berfungsi sebagai pemutakhiran untuk kedua VM Klasik dan kompiler just-in-time (JIT) yang digunakan oleh versi JDK sebelumnya. VM Klien menawarkan peningkatan kinerja run time untuk aplikasi dan applet. Java HotSpot Client VM telah disesuaikan secara khusus untuk mengurangi waktu permulaan aplikasi dan jejak memori, membuatnya sangat cocok untuk lingkungan klien. Secara umum, sistem klien lebih baik untuk GUI.
Jadi perbedaan sebenarnya juga ada pada level kompiler:
Kompiler VM Klien tidak mencoba untuk melakukan banyak optimasi yang lebih kompleks yang dilakukan oleh kompiler di Server VM, tetapi sebagai gantinya, memerlukan lebih sedikit waktu untuk menganalisis dan menyusun sepotong kode. Ini berarti VM Klien dapat memulai lebih cepat dan membutuhkan jejak memori yang lebih kecil.
Server VM berisi kompiler adaptif canggih yang mendukung banyak jenis optimisasi yang sama yang dilakukan dengan mengoptimalkan kompiler C ++, serta beberapa optimisasi yang tidak dapat dilakukan oleh kompiler tradisional, seperti inlining agresif di seluruh invokasi metode virtual. Ini adalah keunggulan kompetitif dan kinerja daripada kompiler statis. Teknologi optimisasi adaptif sangat fleksibel dalam pendekatannya, dan biasanya mengungguli bahkan analisis statis canggih dan teknik kompilasi.
Catatan: Rilis pembaruan jdk6 10 (lihat Perbarui Catatan Rilis: Perubahan pada 1.6.0_10 ) mencoba untuk meningkatkan waktu startup, tetapi untuk alasan yang berbeda dari opsi hotspot, dikemas secara berbeda dengan kernel yang jauh lebih kecil.
G. Demecki menunjukkan dalam komentar bahwa dalam versi JDK 64-bit, -client
opsi ini diabaikan selama bertahun-tahun.
Lihat perintah Windowsjava
:
-client
Memilih Java HotSpot Client VM.
JDK berkemampuan 64-bit saat ini mengabaikan opsi ini dan sebagai gantinya menggunakan Java Hotspot Server VM .
-client
opsi diabaikan selama bertahun-tahun.Perbedaan langsung yang paling terlihat di versi Java yang lebih lama adalah memori yang dialokasikan untuk yang
-client
bertentangan dengan-server
aplikasi. Misalnya, pada sistem Linux saya, saya mendapatkan:karena defaultnya
-server
, tetapi dengan-client
opsi yang saya dapatkan:jadi dengan
-server
sebagian besar batas memori dan alokasi awal jauh lebih tinggi untukjava
versi ini .Nilai-nilai ini dapat berubah untuk berbagai kombinasi arsitektur, sistem operasi dan versi jvm. Versi terbaru dari jvm telah menghapus flag dan memindahkan kembali banyak perbedaan antara server dan klien.
Ingat juga bahwa Anda dapat melihat semua rincian yang berjalan
jvm
menggunakanjvisualvm
. Ini berguna jika Anda memiliki pengguna yang atau modul yang mengaturJAVA_OPTS
atau menggunakan skrip yang mengubah opsi baris perintah. Ini juga akan memungkinkan Anda memantau, secara real time, tumpukan dan permgen penggunaan ruang bersama dengan banyak statistik lainnya.sumber
sistem -client dan -server adalah binari yang berbeda. Mereka pada dasarnya adalah dua kompiler yang berbeda (JIT) yang berinteraksi dengan sistem runtime yang sama. Sistem klien optimal untuk aplikasi yang membutuhkan waktu startup cepat atau jejak kecil, sistem server optimal untuk aplikasi di mana kinerja keseluruhan yang paling penting. Secara umum sistem klien lebih cocok untuk aplikasi interaktif seperti GUI
Kami menjalankan kode berikut dengan kedua sakelar:
Catatan: Kode hanya dikompilasi satu kali! Kelas-kelasnya sama di kedua run!
Dengan -client:
java.exe -client -classpath C: \ mywork \ classes com.blogspot.sdoulger.LoopTest
Waktu yang dihabiskan: 766
Dengan -server:
java.exe -server -classpath C: \ mywork \ classes com.blogspot.sdoulger.LoopTest
Waktu yang dihabiskan: 0
Tampaknya optimisasi yang lebih agresif dari sistem server, hapus loop karena mengerti bahwa itu tidak melakukan tindakan apa pun!
Referensi
sumber
Satu perbedaan yang baru saja saya perhatikan adalah dalam mode "klien", tampaknya JVM benar-benar mengembalikan memori yang tidak digunakan ke sistem operasi, sedangkan dengan mode "server", begitu JVM mengambil memori, ia tidak akan memberikannya. kembali. Begitulah tampilannya pada Solaris dengan Java6 (gunakan
prstat -Z
untuk melihat jumlah memori yang dialokasikan untuk suatu proses).sumber
Dokumentasi online Oracle menyediakan beberapa informasi untuk Java SE 7.
Di java - halaman peluncur aplikasi Java untuk Windows,
-client
opsi diabaikan dalam JDK 64-bit:Namun (untuk membuat hal-hal menarik), di
-server
bawahnya tertulis:The Server-Class Mesin Deteksi halaman memberikan informasi yang VM dipilih oleh OS dan arsitektur.
Saya tidak tahu berapa banyak dari ini berlaku untuk JDK 6.
sumber
Dari Goetz - Java Concurrency dalam Praktek:
Penekanan saya. YMMV
sumber
IIRC server VM melakukan lebih banyak optimasi hotspot saat startup sehingga berjalan lebih cepat tetapi membutuhkan waktu lebih lama untuk memulai dan menggunakan lebih banyak memori. VM klien menolak sebagian besar optimasi untuk memungkinkan startup lebih cepat.
Sunting untuk ditambahkan: Ini beberapa info dari Sun, tidak terlalu spesifik tetapi akan memberi Anda beberapa ide.
sumber
IIRC, melibatkan strategi pengumpulan sampah. Teorinya adalah bahwa klien dan server akan berbeda dalam hal objek berumur pendek, yang penting untuk algoritma GC modern.
Berikut ini tautannya pada mode server. Sayangnya, mereka tidak menyebutkan mode klien.
Berikut ini adalah tautan yang sangat menyeluruh tentang GC secara umum; ini adalah artikel yang lebih mendasar . Tidak yakin apakah alamat-server vs -client tetapi ini adalah materi yang relevan.
Di No Fluff Just Stuff, baik Ken Sipe dan Glenn Vandenburg melakukan pembicaraan hebat tentang hal semacam ini.
sumber
Saya tidak melihat adanya perbedaan waktu startup antara 2, tetapi mencatat peningkatan yang sangat minimal dalam kinerja aplikasi dengan "-server" (server Solaris, semua orang menggunakan SunRays untuk menjalankan aplikasi). Itu di bawah 1,5.
sumber
Terakhir kali saya melihat ini, (dan memang itu beberapa waktu lalu) perbedaan terbesar yang saya perhatikan adalah dalam pengumpulan sampah.
IIRC:
Jika Anda dapat membandingkan dua VM java, satu klien, satu server menggunakan alat jvisualvm , Anda akan melihat perbedaan dalam frekuensi dan efek dari pengumpulan sampah, serta dalam jumlah generasi.Saya memiliki sepasang tangkapan layar yang menunjukkan perbedaan dengan sangat baik, tetapi saya tidak dapat mereproduksi karena saya memiliki JVM 64 bit yang hanya mengimplementasikan VM server. (Dan saya tidak dapat diganggu untuk mengunduh dan menangani versi 32 bit pada sistem saya juga.)Ini tampaknya tidak menjadi masalah lagi, setelah mencoba menjalankan beberapa kode pada windows dengan baik server dan VM klien, saya sepertinya mendapatkan model generasi yang sama untuk keduanya ...
sumber
Saat melakukan migrasi dari versi 1.4 ke 1.7 ("1.7.0_55"). Hal yang kami amati di sini adalah, tidak ada perbedaan dalam nilai default yang ditetapkan untuk heapsize | permsize | threadStackSize parameter dalam mode klien & server.
Ngomong-ngomong, ( http://www.oracle.com/technetwork/java/ergo5-140223.html ). Ini cuplikan yang diambil dari tautan di atas.
ThreadStackSize lebih tinggi di 1,7, sementara melalui forum Open JDK, ada diskusi yang menyatakan ukuran bingkai agak lebih tinggi di versi 1.7. Diyakini perbedaan nyata dapat dimungkinkan untuk mengukur pada saat dijalankan berdasarkan perilaku Anda dari aplikasi Anda
sumber