Rumah > Java > javaTutorial > Bagaimanakah Saya Boleh Meningkatkan Saiz Timbunan Java untuk Mencegah StackOverflowErrors?

Bagaimanakah Saya Boleh Meningkatkan Saiz Timbunan Java untuk Mencegah StackOverflowErrors?

Linda Hamilton
Lepaskan: 2024-12-17 02:35:25
asal
837 orang telah melayarinya

How Can I Increase the Java Stack Size to Prevent StackOverflowErrors?

Meningkatkan Saiz Tindanan Java untuk Tindanan Panggilan yang Lebih Besar

Mesin Maya Java (JVM) mengekalkan tindanan panggilan masa jalan untuk setiap urutan. Apabila saiz tindanan tidak mencukupi untuk mengendalikan tindanan panggilan dalam, StackOverflowError berlaku. Untuk memanjangkan saiz tindanan ini untuk menampung tindanan panggilan yang lebih besar, manfaatkan bendera baris arahan java -Xss....

Sebagai contoh, dalam coretan kod anda:

public class TT {
  public static long fact(int n) {
    return n < 2 ? 1 : n * fact(n - 1);
  }
}
Salin selepas log masuk

Untuk mengendalikan pengiraan fakta(2^15), anda boleh menggunakan pengiraan berikut:

java -Xss4m TT
Salin selepas log masuk

Konfigurasi Timbunan Khusus Pelaksanaan dan Benang

Perhatikan bahawa bendera -X... bergantung kepada pelaksanaan. Dalam kes anda, anda menggunakan JVM OpenJDK. Selain itu, anda boleh menentukan saiz tindanan yang lebih besar hanya untuk benang tertentu, mengelakkan pembaziran memori untuk benang yang tidak memerlukannya. Ini adalah lebih baik daripada menggunakan java -Xss....

Menganggar Saiz Tindanan Yang Diperlukan

Anda boleh menentukan saiz tindanan tepat yang diperlukan untuk program anda dengan meningkatkan - Nilai Xss sehingga ia memproses pengiraan yang dikehendaki tanpa menemui a StackOverflowError.

Tingkah Laku Tidak Tentu

Keperluan tindanan kadangkala boleh menjadi tidak tentu. Faktor seperti kutipan sampah atau kompilasi JIT boleh menyumbang kepada tingkah laku ini.

Pelaksanaan Alternatif: Berulang lwn. Rekursif

Pertimbangkan alternatif, pelaksanaan kurang intensif tindanan bagi algoritma anda. Untuk fungsi fakta anda, pelaksanaan berulang mungkin kurang terdedah kepada limpahan tindanan:

public class TTIterative {
  public static long fact(int n) {
    if (n < 2) return 1;
    if (n > 65) return 0;
    long f = 2;
    for (int i = 3; i <= n; ++i) {
      f *= i;
    }
    return f;
  }
}
Salin selepas log masuk

Ingat bahawa fungsi fakta tidak boleh mengira pemfaktoran tepat untuk nombor yang lebih besar daripada 65 disebabkan oleh pengehadan jenis data yang panjang. Pertimbangkan untuk mengembalikan BigInteger untuk mengatasi had ini.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Meningkatkan Saiz Timbunan Java untuk Mencegah StackOverflowErrors?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan