मुझे पता है कि प्रत्येक वस्तु को ढेर मेमोरी की आवश्यकता होती है और स्टैक पर प्रत्येक आदिम / संदर्भ को स्टैक मेमोरी की आवश्यकता होती है।
जब मैं ढेर पर एक ऑब्जेक्ट बनाने का प्रयास करता हूं और ऐसा करने के लिए अपर्याप्त मेमोरी होती है, तो JVM ढेर पर एक java.lang.OutOfMemoryError बनाता है और मुझे फेंकता है।
तो जाहिर है, इसका मतलब है कि स्टार्टअप पर JVM द्वारा आरक्षित कुछ मेमोरी है।
क्या होता है जब इस आरक्षित मेमोरी का उपयोग किया जाता है (यह निश्चित रूप से उपयोग किया जाएगा, नीचे चर्चा पढ़ें) और JVM के पास java.lang.OutOfMemoryError का एक उदाहरण बनाने के लिए ढेर पर पर्याप्त मेमोरी नहीं है ?
क्या यह सिर्फ लटका है? या वह मुझे फेंक देगा null
क्योंकि new
OOM के उदाहरण के लिए कोई स्मृति नहीं है ?
try {
Object o = new Object();
// and operations which require memory (well.. that's like everything)
} catch (java.lang.OutOfMemoryError e) {
// JVM had insufficient memory to create an instance of java.lang.OutOfMemoryError to throw to us
// what next? hangs here, stuck forever?
// or would the machine decide to throw us a "null" ? (since it doesn't have memory to throw us anything more useful than a null)
e.printStackTrace(); // e.printStackTrace() requires memory too.. =X
}
==
जेवीएम पर्याप्त मेमोरी क्यों नहीं रख सका?
कोई भी मेमोरी कितनी भी आरक्षित क्यों न हो, उस मेमोरी का उपयोग तब भी संभव है जब JVM के पास उस मेमोरी को "पुनः प्राप्त" करने का कोई तरीका न हो:
try {
Object o = new Object();
} catch (java.lang.OutOfMemoryError e) {
// JVM had 100 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e2) {
// JVM had 99 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e3) {
// JVM had 98 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e4) {
// JVM had 97 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e5) {
// JVM had 96 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e6) {
// JVM had 95 units of "spare memory". 1 is used to create this OOM.
e.printStackTrace();
//........the JVM can't have infinite reserved memory, he's going to run out in the end
}
}
}
}
}
}
या अधिक संक्षेप में:
private void OnOOM(java.lang.OutOfMemoryError e) {
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e2) {
OnOOM(e2);
}
}
OutOfMemoryException
और तब कुछ ऐसा किया था जिसमें एक बड़ा बफर बनाना शामिल था ...
OutOfMemoryError
और इसके संदर्भ को बनाए रखा हो। यह ट्रांसपायर करता है कि एक OutOfMemoryError
को पकड़ना उतना उपयोगी नहीं है जितना कोई सोच सकता है, क्योंकि आप इसे पकड़ने पर अपने कार्यक्रम की स्थिति के बारे में लगभग कुछ भी गारंटी नहीं दे सकते । देखें stackoverflow.com/questions/8728866/…