Opsi JVM -Xss - Apa fungsinya sebenarnya?

229

Dikatakan di sini bahwa -Xss digunakan untuk "mengatur ukuran stack thread", apa artinya sebenarnya? Adakah yang bisa membantu saya memahami ini?

instantsetsuna
sumber
Beberapa contoh di sini (bukan milik saya ...): herongyang.com/JVM/…
Christophe

Jawaban:

269

Setiap utas dalam aplikasi Java memiliki tumpukan sendiri . Tumpukan ini digunakan untuk menyimpan alamat pengirim, argumen panggilan fungsi / metode, dll. Jadi, jika utas cenderung memproses struktur besar melalui algoritma rekursif, mungkin diperlukan tumpukan besar untuk semua alamat pengirim dan semacamnya. Dengan Sun JVM, Anda dapat mengatur ukuran itu melalui parameter itu.

TJ Crowder
sumber
11
Jadi, opsi -Xss digunakan untuk membatasi berapa banyak memori yang dikonsumsi stack (dengan menyimpan alamat pengirim, variabel, dll) dan yang juga secara tidak langsung membatasi seberapa dalam stack bisa didapat? Apakah saya benar?
instantsetsuna
5
@instantsetsuna: Saya pikir penggunaan yang lebih umum mungkin untuk meningkatkan batas default. (Selalu ada batasnya.) Tapi ya, Anda mengendalikan ukuran tumpukan, yang mengontrol seberapa dalam tumpukan itu bisa.
TJ Crowder
bagaimana Anda melakukan yang setara dengan pengaturan XSS ini pada kompiler java (alias javac)? Ini masalah bagi mereka yang menggunakan perpustakaan berbasis scala yang menyebabkan rekursi ekor besar terjadi dalam kompilasi kelas - Andrew Norman 9 detik yang lalu
Andrew Norman
@AndrewNorman: Anda tidak mengkompilasi opsi runtime Java ke file kelas, itu lebih merupakan hal khusus lingkungan. Jika Anda benar-benar perlu melakukannya dalam kode, Anda dapat menulis kelas utama kecil yang tugas utamanya adalah meluncurkan aplikasi nyata Anda dengan opsi yang Anda butuhkan.
TJ Crowder
@AndrewNorman Anda dapat memberikan flag konfigurasi JVM yang harus dijalankan oleh kompiler dengan menggunakan -Jflagsintaks (mis. -J-Xss).
francoisr
166

Memang mengatur ukuran stack pada JVM.

Anda harus menyentuhnya di salah satu dari dua situasi berikut:

  • StackOverflowError (ukuran stack lebih besar dari batas), tambah nilainya
  • OutOfMemoryError: tidak dapat membuat utas asli baru (terlalu banyak utas, setiap utas memiliki tumpukan besar), kurangi.

Yang terakhir biasanya datang ketika Xss Anda diatur terlalu besar - maka Anda perlu menyeimbangkannya (pengujian!)

Adam Adamaszek
sumber
3
Tidak harus setiap waktu sebenarnya. Baik SOE dan OOME dapat terjadi karena alasan berbeda yang harus diperbaiki secara berbeda.
noego
4
Benar, tapi saya tidak mengatakan -Xss adalah satu-satunya penyebab SOE dan OOME, tetapi sebaliknya - jika diatur secara tidak benar, ini dapat menyebabkan salah satu dari keduanya.
Adam Adamaszek
5

Setiap utas memiliki tumpukan yang digunakan untuk variabel lokal dan nilai internal. Ukuran tumpukan membatasi seberapa dalam panggilan Anda. Umumnya ini bukan sesuatu yang perlu Anda ubah.

Peter Lawrey
sumber
4

Jika saya tidak salah, inilah yang memberi tahu JVM berapa banyak panggilan berturut-turut yang akan diterimanya sebelum mengeluarkan StackOverflowError. Bukan sesuatu yang ingin Anda ubah secara umum.

Kellindil
sumber