জাভা কল স্ট্যাকের সর্বোচ্চ গভীরতা কত?


104

স্ট্যাকওভারফ্লো এরিয়ার পাওয়ার আগে আমার কল স্ট্যাকের মধ্যে কত গভীর যেতে হবে? উত্তর প্ল্যাটফর্ম নির্ভর?


4
ঘনিষ্ঠভাবে সম্পর্কিত: stackoverflow.com/questions/794227/...
finnw

যেহেতু এটি একটি ভাল প্রশ্ন, আমি শিরোনামটি এমন কিছুতে আপডেট করেছি যা আমি মনে করি অর্থের সাথে আরও স্পষ্টভাবে জড়িত। (পূর্বে আমি ভেবেছিলাম আপনি উদাহরণস্বরূপ, রানটাইমের সময় আপনি যে নির্দিষ্ট স্ট্যাকের ক্যাপচার করেছিলেন সেটি গভীরতার উল্লেখ করছেন )। আপনি যদি একমত না হন তবে নির্দ্বিধায় এটিকে পরিবর্তন করুন।
আন্দ্রেজেজ ডয়েল

উত্তর:


62

এটি স্ট্যাকের জন্য বরাদ্দ করা ভার্চুয়াল মেমরির পরিমাণের উপর নির্ভর করে।

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

আপনি এটি -Xssভিএম প্যারামিটার বা Thread(ThreadGroup, Runnable, String, long)কনস্ট্রাক্টরের সাথে টিউন করতে পারেন ।


14
এবং সম্ভবত আপনি স্ট্যাক ফ্রেমগুলি লাগিয়ে রেখেছেন?
duffymo

4
সীমাটিও ফাংশনে স্ট্যাকের ব্যবহারের উপর নির্ভর করে।
জারেক প্রিজেগডজকি

4
যদি আমরা এক্সএস এর উল্লেখ না করি, তবে?
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
@ আর্যাহ জেভিএম শব্দার্থবিদ্যার একটি গুরুত্বপূর্ণ অংশটি হ'ল লেজ পুনরাবৃত্তি সমর্থিত নয়। যাঁরা JVM এ লেজ পুনরাবৃত্তি সহ ভাষা প্রয়োগ করতে চান তাদের ক্ষেত্রে এটি অনেক আকর্ষণীয় সমস্যা দেয়।
থরবজর্ন রাভন অ্যান্ডারসন

4
public foo() { try { foo(); } finally { foo(); } }জাভাতে চিরকালের জন্য 'ভার্চুয়াল' চালাতে পারে তবেই ava
ফ্লিপ

আমার জন্য, StackOverflowError8792 এর পরে ঘটে
ericdemo07

4
@ ThorbjørnRavnAndersen লেজ পুনরাবৃত্তির অপ্টিমাইজেশান সমর্থিত নয়। বরং স্পষ্টতই আপনার লেজ পুনরাবৃত্তি হতে পারে। এটি কেবল কল স্ট্যাক না বাড়ানোর জন্য এটি অনুকূলিত করে না।
পাতলা

19

স্ট্যাকের আকারটি -Xssকমান্ড লাইন সুইচের সাথে সেট করা যেতে পারে তবে থাম্বের নিয়ম হিসাবে এটি যথেষ্ট গভীর, কয়েক হাজার না হলেও কয়েক হাজার কল। (ডিফল্ট প্ল্যাটফর্ম নির্ভর, তবে বেশিরভাগ প্ল্যাটফর্মগুলিতে কমপক্ষে 256k)

যদি আপনি একটি স্ট্যাক ওভারফ্লো পান তবে কোডের একটি ত্রুটির কারণে 99% সময়।


4
দ্বিতীয় অনুচ্ছেদের জন্য +1। একটি সম্পর্কে সর্বদা মনে রাখা উচিত।
mcveat

6
গ্রহনটি ব্যবহার করে, আমি কেবল 1024 পুনরাবৃত্তি কল পাই।
নর্সপপ

4
@ উত্তরসাপ্প আপনি স্ট্যাক ট্রেসের আকারের দ্বারা এটি নির্ধারণ করছেন? এটি স্ট্যাকের প্রকৃত আকার নির্বিশেষে 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

(২) ভিন্ন শ্রেণি ব্যবহার করে অ স্থির পদ্ধতি:

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) {একমাত্র পদ্ধতি হিসাবে আছে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.