जावा कॉल स्टैक की अधिकतम गहराई कितनी है?


100

StackOverflowError प्राप्त करने से पहले मुझे कॉल स्टैक में जाने की कितनी आवश्यकता है? क्या जवाब प्लेटफॉर्म पर निर्भर है?


1
बारीकी से संबंधित: stackoverflow.com/questions/794227/…
finnw

चूंकि यह एक अच्छा सवाल है, मैंने शीर्षक को कुछ ऐसा महसूस किया है जो मुझे लगता है कि अर्थ के साथ अधिक स्पष्ट रूप से जुड़ा हुआ है। (पहले मैंने सोचा था कि आप एक विशेष स्टैक की गहराई का उल्लेख कर सकते हैं , उदाहरण के लिए, आपने रनटाइम पर कब्जा कर लिया होगा)। यदि आप असहमत हैं तो इसे वापस बदलने के लिए स्वतंत्र महसूस करें।
आंद्रेज डॉयल

जवाबों:


60

यह स्टैक को आवंटित वर्चुअल मेमोरी की मात्रा पर निर्भर करता है।

http://www.odi.ch/weblog/posting.php?posting=411

आप इसे -Xssवीएम पैरामीटर या Thread(ThreadGroup, Runnable, String, long)कंस्ट्रक्टर के साथ ट्यून कर सकते हैं ।


13
और शायद उस पर आपके द्वारा लगाए गए स्टैक फ्रेम का आकार?
डफिमो

1
सीमा भी फ़ंक्शन में स्टैक उपयोग पर निर्भर करती है।
जारेक प्रोजगोडकी

1
अगर हम Xss का उल्लेख नहीं करते हैं, तो?
a3.14_Infinity

31

मैंने अपने सिस्टम पर परीक्षण किया और कोई निरंतर मान नहीं पाया, कभी-कभी स्टैक ओवरफ्लो 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();
    }

}

15
क्या यह मामला नहीं है कि यह पूंछ पुनरावर्ती है और कभी भी अतिप्रवाह नहीं होना चाहिए? संपादित करें: क्षमा करें। जावा में यह 8027 पर दुर्घटनाग्रस्त हो गया; स्काला में मेरे बोर होने से पहले यह 8594755 तक पहुंच गया।
आर्य

9
JaryM शब्दार्थ का एक महत्वपूर्ण हिस्सा @arya है कि पूंछ पुनरावृत्ति समर्थित नहीं है। यह उन लोगों के लिए कई दिलचस्प समस्याएं देता है जो जेवीएम पर पूंछ पुनरावृत्ति के साथ भाषाओं को लागू करना चाहते हैं।
थोरबजोरन राव एंडरसन

2
public foo() { try { foo(); } finally { foo(); } }'वस्तुतः' को हमेशा के लिए जावा में ही चला सकते हैं।
फेल्पे

मेरे लिए, StackOverflowError8792 के बाद होता है
ericdemo07

2
@ ThorbjørnRavnAndersen पूंछ पुनरावृत्ति अनुकूलन समर्थित नहीं है। बल्कि जाहिर है आप पूंछ पुनरावृत्ति हो सकता है। यह सिर्फ कॉल स्टैक नहीं बढ़ने के लिए इसे ऑप्टिमाइज़ नहीं करता है।
स्लिम

19

स्टैक आकार को -Xssकमांड लाइन स्विच के साथ सेट किया जा सकता है लेकिन अंगूठे के नियम के रूप में, यह पर्याप्त गहरी है, सैकड़ों नहीं तो हजारों कॉल डीप। (डिफ़ॉल्ट प्लेटफ़ॉर्म आश्रित है, लेकिन अधिकांश प्लेटफार्मों में कम से कम 256k है।)

यदि आपको स्टैक ओवरफ़्लो मिलता है, तो 99% बार यह कोड में त्रुटि के कारण होता है।


3
दूसरे पैराग्राफ के लिए +1। उस बारे में हमेशा याद रखना चाहिए।
mcveat

6
ग्रहण का उपयोग करते हुए, मुझे केवल 1024 पुनरावर्ती कॉल मिलते हैं।
नूर्वा

2
@ नोर्सवे क्या आप निर्धारित कर रहे हैं कि स्टैक ट्रेस के आकार से? यह स्टैक के वास्तविक आकार की परवाह किए बिना 1024 तक सीमित प्रतीत होता है।
ब्रायन मैककिनटन

4

इन दो कॉल की तुलना करें:
(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) {एकमात्र तरीका है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.