McGoverneory mengajukan pertanyaan ini di StackOverflow:
Berapa banyak utas yang paling banyak didukung oleh mesin virtual Java? Apakah ini terkait dengan pengembang mesin virtual? Bagaimana dengan sistem operasi? Apakah ada faktor lain?
Jawaban Eddie:
Itu tergantung pada CPU yang Anda gunakan, sistem operasi, apa yang dilakukan proses lain, versi Java yang Anda gunakan, dan faktor -faktor lainnya. Saya telah melihat server Windows dengan lebih dari 6500 utas sebelum turun. Tentu saja, sebagian besar utas tidak melakukan apa pun. Setelah ada hampir 6500 utas (di Java) pada mesin, mesin akan mulai memiliki masalah dan menjadi tidak stabil.
Dalam pengalaman saya, utas yang terkandung dalam JVM berkorelasi positif dengan kinerja komputer itu sendiri.
Tentu saja, Anda harus memiliki memori asli yang cukup dan mengalokasikan memori yang cukup ke Java sehingga setiap utas dapat memiliki tumpukan (tumpukan mesin virtual) dan dapat melakukan apa pun yang Anda inginkan. Mesin apa pun dengan CPU modern (AMD atau generasi baru-baru ini Intel) dan memori 1-2G (tergantung pada sistem operasi) dapat dengan mudah mendukung mesin virtual Java dengan ribuan utas.
Jika Anda membutuhkan jawaban yang lebih akurat, yang terbaik adalah melakukan tes stres sendiri.
Jawaban Charlie Martin:
Ada banyak parameter (dapat diatur). Untuk mesin virtual tertentu, mereka akan memiliki parameter runtime sendiri. (Jumlah maksimum utas) sampai batas tertentu, ditentukan oleh sistem operasi: apa dukungan yang harus diberikan oleh sistem operasi yang mendasarinya? Pembatasan apa yang diberlakukan? Apakah mesin virtual menggunakan utas sistem operasi asli, atau benang merah atau benang hijau?
Dukungan yang diberikan oleh sistem operasi adalah masalah lain. Jika Anda menulis program Java seperti ini:
Salinan kode adalah sebagai berikut:
kelas dielikeadog {
public static void main (string [] argv) {
untuk(;;){
utas baru (someruna baru) .start ();
}
}
}
(Jangan mengeluh tentang detail sintaks, ini baru saja dimulai) maka tentu saja Anda ingin mendapatkan ratusan utas yang berjalan. Namun, biaya membuat utas relatif tinggi, dan overhead dari penjadwalan (terlalu banyak utas) menjadi menonjol. Masih belum pasti apakah utas ini dapat melakukan hal -hal yang bermanfaat.
Versi yang ditingkatkan
Oke, tidak sabar! Berikut adalah program uji kecil yang telah sedikit dipoles:
Salin kode sebagai berikut: Dielikeadog kelas publik {
objek statis pribadi s = objek baru ();
Count int private static = 0;
public static void main (string [] argv) {
untuk(;;){
utas baru (runnable baru () {
public void run () {
disinkronkan {
Hitung += 1;
System.err.println ("Thread baru #"+Count);
}
untuk(;;){
mencoba {
Thread.sleep (1000);
} catch (Exception e) {
System.err.println (e);
}
}
}
}).awal();
}
}
}
Pada sistem Intel OS/X 10.5.6, output Java 5 adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
Utas baru #2547
Utas baru #2548
Utas baru #2549
Tidak dapat membuat utas: 5
Utas baru #2550
Pengecualian di Thread "Main" java.lang.outofmemoryError: Tidak dapat membuat utas asli baru
di java.lang.thread.start0 (metode asli)
di java.lang.thread.start (thread.java:592)
di dielikeadog.main (dielikeadog.java:6)
Jawaban Benjismith:
Setelah membaca balasan Charlie Martin, saya bertanya -tanya apakah ukuran heap memori dapat membuat perbedaan dalam jumlah utas yang dibuat, dan kemudian saya terpana dengan hasilnya: pada sistem Vista Home Premium SP1, menggunakan JDK 1.6.0_11, Atur ukuran heap memori dari 2m ke 1024m untuk menjalankan program pengujian Charlie. Sebagai contoh: Untuk membuat memori heap 2m, parameter mesin virtual yang saya gunakan adalah: -xms2m -xmx2m.
Inilah hasil tes saya:
Salin kode sebagai berikut: 2 MB -> 5744 Threads
4 MB -> 5743 utas
8 MB -> 5735 utas
12 MB -> 5724 Threads
16 MB -> 5712 utas
24 MB -> 5687 Threads
32 MB -> 5662 utas
48 MB -> 5610 Threads
64 MB -> 5561 utas
96 MB -> 5457 Threads
128 MB -> 5357 utas
192 MB -> 5190 utas
256 MB -> 5014 utas
384 MB -> 4606 utas
512 MB -> 4202 Threads
768 MB -> 3388 utas
1024 MB -> 2583 utas
Jadi, ukuran tumpukan sangat penting. Namun, ukuran tumpukan dan jumlah maksimum utas berbanding terbalik.
Ini sangat aneh!
Jawaban Neil Coffey:
Jumlah utas maksimum teoretis absolut adalah ruang alamat pengguna proses yang dibagi dengan ukuran tumpukan utas (pada kenyataannya, jika semua memori digunakan oleh tumpukan utas, tidak akan ada program yang dapat berjalan). Oleh karena itu, mengambil sistem Windows 32-bit sebagai contoh, ruang alamat pengguna dari setiap proses adalah 2g. . Sebenarnya pada sistem XP, saya menemukan bahwa sekitar 13.000 utas dapat dimulai.
Kemudian, saya pikir pertanyaan Anda pada dasarnya adalah: (a) apakah Anda dapat secara efektif mengelola banyak utas dalam kode Anda dan tidak membiarkan mereka melakukannya jelas bodoh (seperti: biarkan mereka pada objek objek yang sama (b) apakah sistem operasi dapat Secara efektif mengelola banyak utas ini. Pada dasarnya, jika jawaban (a) adalah "ya", jawabannya (b) adalah "ya".
Secara kebetulan, Anda dapat mengatur ukuran tumpukan utas di konstruktor utas, tetapi Anda tidak perlu dan tidak boleh membingungkan ini dengan parameter mesin virtual.