JVM आप स्मृति को बचाने के लिए जब यह होता है (के बाद से वीएम स्मृति को आबंटित करने स्टैक ट्रेस संग्रहीत करने के लिए एक अपवाद या त्रुटि के स्टैक ट्रेस में हो सकता है, शायद 1024 प्रविष्टियों में से एक कृत्रिम सीमा होती है)।
सौभाग्य से, एक ध्वज है जो इस सीमा को बढ़ाने की अनुमति देता है।बस निम्नलिखित तर्क के साथ अपने कार्यक्रम चलाने:
-XX:MaxJavaStackTraceDepth=1000000
यह आपके स्टैक ट्रेस की 1 लाख प्रविष्टियों, जो पर्याप्त से अधिक होना चाहिए करने के लिए प्रिंट होगा। प्रविष्टियों की संख्या असीमित के रूप में सेट करने के लिए -1
पर यह मान सेट करना भी संभव है।
This list of non-standard JVM options अधिक विवरण देता है:
मैक्स। नहीं। जावा अपवादों के लिए स्टैक ट्रेस में लाइनों (0 का मतलब सभी)। जावा> 1.6 के साथ, मान 0 का अर्थ वास्तव में है 0. मान -1 या कोई ऋणात्मक संख्या सभी स्टैक मुद्रित करने के लिए निर्दिष्ट की जानी चाहिए ( 1.6.0_22, विंडोज़ पर 1.7.0 के साथ परीक्षण किया गया है)। जावा < = 1.5 के साथ, मान 0 का मतलब सब कुछ है, जेवीएम नकारात्मक संख्या पर चोक करता है ( विंडोज़ पर 1.5.0_22 के साथ परीक्षण किया गया)।
इस ध्वज के साथ सवाल का नमूना चल रहा है निम्न परिणाम देता है:
Exception in thread "main" java.lang.StackOverflowError
at Overflow.<init>(Overflow.java:3)
at Overflow.<init>(Overflow.java:4)
at Overflow.<init>(Overflow.java:4)
at Overflow.<init>(Overflow.java:4)
(more than ten thousand lines later:)
at Overflow.<init>(Overflow.java:4)
at Overflow.<init>(Overflow.java:4)
at Overflow.a(Overflow.java:7)
at Overflow.main(Overflow.java:10)
इस तरह, आप, कोड है कि त्रुटि फेंक दिया के मूल कॉल प्राप्त कर सकते हैं यहां तक कि वास्तविक स्टैक ट्रेस अगर 1024 लाइनों से अधिक लंबा है।
यदि आप उस विकल्प का उपयोग नहीं कर सकते हैं, तो अभी भी एक और तरीका है, यदि आप इस तरह के रिकर्सिव फ़ंक्शन में हैं, और यदि आप इसे संशोधित कर सकते हैं। आप निम्नलिखित कोशिश पकड़ जोड़ते हैं:
public Overflow() {
try {
new Overflow();
}
catch(StackOverflowError e) {
StackTraceElement[] stackTrace = e.getStackTrace();
// if the stack trace length is at the limit , throw a new StackOverflowError, which will have one entry less in it.
if (stackTrace.length == 1024) {
throw new StackOverflowError();
}
throw e; // if it is small enough, just rethrow it.
}
}
मूलतः, यह बना सकते हैं और एक नया StackOverflowError
फेंक, अंतिम प्रविष्टि को त्यागकर क्योंकि हर एक पिछली बार की तुलना एक स्तर ऊपर भेजा जाएगा होगा (यह एक समय लग सकता है कुछ सेकंड, क्योंकि इन सभी त्रुटियों को बनाया जाना है)। जब स्टैक ट्रेस को 1023 तत्वों तक घटा दिया जाएगा, तो इसे आसानी से पुनर्स्थापित किया जाएगा।
आखिरकार यह स्टैक ट्रेस के नीचे 1023 लाइनों को प्रिंट करेगा, जो कि पूर्ण स्टैक ट्रेस नहीं है, लेकिन शायद इसका सबसे उपयोगी हिस्सा है।
यह देखते हुए कि आप स्टैक आकार बढ़ा सकते हैं और यह दूर हो जाता है, क्या आप स्टैक आकार को कम करने का प्रयास कर सकते हैं और देख सकते हैं कि इससे आपको अधिक स्टैक ट्रेस देखने की अनुमति मिलती है या नहीं? याद नहीं है कि आप JVM में स्टैक आकार को कैसे नियंत्रित करते हैं और क्या आपको इसे पर्याप्त रूप से छोटा बनाने की अनुमति होगी, लेकिन इससे समस्या का निदान करने में सहायता मिल सकती है। –
@ टॉम, स्टैक आकार को नए थ्रेड (थ्रेड ग्रुप समूह, रननेबल लक्ष्य, स्ट्रिंग नाम, लांग स्टैक साइज) द्वारा नियंत्रित किया जाता है। – bestsss
ओह ठीक है। अच्छा विचार :-( –