StackOverflowError प्राप्त करने से पहले मुझे कॉल स्टैक में जाने की कितनी आवश्यकता है? क्या जवाब प्लेटफॉर्म पर निर्भर है?
StackOverflowError प्राप्त करने से पहले मुझे कॉल स्टैक में जाने की कितनी आवश्यकता है? क्या जवाब प्लेटफॉर्म पर निर्भर है?
जवाबों:
यह स्टैक को आवंटित वर्चुअल मेमोरी की मात्रा पर निर्भर करता है।
http://www.odi.ch/weblog/posting.php?posting=411
आप इसे -Xssवीएम पैरामीटर या Thread(ThreadGroup, Runnable, String, long)कंस्ट्रक्टर के साथ ट्यून कर सकते हैं ।
मैंने अपने सिस्टम पर परीक्षण किया और कोई निरंतर मान नहीं पाया, कभी-कभी स्टैक ओवरफ्लो 8900 कॉल के बाद होता है, कभी-कभी केवल 7700, यादृच्छिक संख्याओं के बाद।
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(); } }'वस्तुतः' को हमेशा के लिए जावा में ही चला सकते हैं।
StackOverflowError8792 के बाद होता है
स्टैक आकार को -Xssकमांड लाइन स्विच के साथ सेट किया जा सकता है लेकिन अंगूठे के नियम के रूप में, यह पर्याप्त गहरी है, सैकड़ों नहीं तो हजारों कॉल डीप। (डिफ़ॉल्ट प्लेटफ़ॉर्म आश्रित है, लेकिन अधिकांश प्लेटफार्मों में कम से कम 256k है।)
यदि आपको स्टैक ओवरफ़्लो मिलता है, तो 99% बार यह कोड में त्रुटि के कारण होता है।
इन दो कॉल की तुलना करें:
(1) स्टेटिक विधि:
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) एक अलग वर्ग का उपयोग करते हुए गैर-स्थैतिक विधि:
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
टेस्ट रिकर्सन क्लास में public int testRecursion(int number) {एकमात्र तरीका है।