Bir StackOverflowError almadan önce çağrı yığınında ne kadar derine inmem gerekir? Cevap platformu bağımlı mı?
Bir StackOverflowError almadan önce çağrı yığınında ne kadar derine inmem gerekir? Cevap platformu bağımlı mı?
Yanıtlar:
Yığına ayrılan sanal bellek miktarına bağlıdır.
http://www.odi.ch/weblog/posting.php?posting=411
Bunu -XssVM parametresi veya Thread(ThreadGroup, Runnable, String, long)yapıcı ile ayarlayabilirsiniz .
Sistemimde test ettim ve sabit bir değer bulamadım, bazen 8900 aramadan sonra yığın taşması oluyor, bazen sadece 7700 rastgele sayılardan sonra.
public class MainClass {
private static long depth=0L;
public static void main(String[] args){
deep();
}
private static void deep(){
System.err.println(++depth);
deep();
}
}
public foo() { try { foo(); } finally { foo(); } }sadece java'da sonsuza kadar 'sanal olarak' çalışabilir.
StackOverflowError
Yığın boyutu ile ayarlanabilir -Xss komut satırı anahtarıyla ancak genel bir kural olarak, yeterince derin, binlerce olmasa da yüzlerce çağrı derinliğindedir. (Varsayılan, platforma bağlıdır, ancak çoğu platformda en az 256k'dir.)
Yığın taşması ile karşılaşırsanız,% 99 oranında koddaki bir hatadan kaynaklanır.
Bu iki çağrıyı karşılaştırın:
(1) Statik yöntem:
public static void main(String[] args) {
int i = 14400;
while(true){
int myResult = testRecursion(i);
System.out.println(myResult);
i++;
}
}
public static int testRecursion(int number) {
if (number == 1) {
return 1;
} else {
int result = 1 + testRecursion(number - 1);
return result;
}
}
//Exception in thread "main" java.lang.StackOverflowError after 62844
(2) Farklı bir sınıf kullanan statik olmayan yöntem:
public static void main(String[] args) {
int i = 14400;
while(true){
TestRecursion tr = new TestRecursion ();
int myResult = tr.testRecursion(i);
System.out.println(myResult);
i++;
}
}
//Exception in thread "main" java.lang.StackOverflowError after 14002
Test özyineleme sınıfı public int testRecursion(int number) {tek yöntemdir.