मैं हाल ही में कुछ कोड में यह भर में आया था - मूल रूप से किसी को एक बड़ी वस्तु बनाने के लिए, मुकाबला, जब पर्याप्त ढेर नहीं है इसे बनाने की कोशिश कर रहा:जावा: ऑब्जेक्ट बनाने के लिए पर्याप्त मुफ्त ढेर?
try {
// try to perform an operation using a huge in-memory array
byte[] massiveArray = new byte[BIG_NUMBER];
}
catch (OutOfMemoryError oome) {
// perform the operation in some slower but less
// memory intensive way...
}
यह सही नहीं लगता है, सूर्य के बाद से खुद को सुझाव है कि आप Error
या इसके उप-वर्गों को पकड़ने की कोशिश नहीं करनी चाहिए। हम यह चर्चा की, और एक अन्य विचार है कि आया था स्पष्ट रूप से मुक्त करने के ढेर के लिए जाँच किया गया था:
if (Runtime.getRuntime().freeMemory() > SOME_MEMORY) {
// quick memory-intensive approach
}
else {
// slower, less demanding approach
}
फिर, यह असंतोषजनक लगता है - विशेष रूप से है कि उठा SOME_MEMORY
के लिए एक मूल्य आसानी से प्रश्न में नौकरी से संबंधित के लिए मुश्किल है: के लिए कुछ मनमानी बड़ी वस्तु, मैं अनुमान लगा सकता हूं कि इसकी तत्कालता की कितनी मेमोरी की आवश्यकता हो सकती है?
क्या ऐसा करने का कोई बेहतर तरीका है? क्या यह जावा में भी संभव है, या भाषा के अमूर्त स्तर के नीचे स्मृति का प्रबंधन करने का कोई विचार है?
संपादित करें 1: पहले उदाहरण में, यह वास्तव में स्मृति एक दिया लंबाई हासिल हो सकता है की एक byte[]
राशि का अनुमान लगाने के लिए संभव हो सकता है, लेकिन वहाँ एक अधिक सामान्य तरीका है कि मनमाने ढंग से बड़ी वस्तुओं तक फैली हुई है?
संपादित करें 2: रूप @erickson बताते हैं, वहाँ एक वस्तु के आकार का अनुमान एक बार यह बनाया तरीके हैं, लेकिन (पिछले वस्तु आकार के आधार पर एक सांख्यिकीय दृष्टिकोण अनदेखी) वहाँ अभी तक के लिए ऐसा करने का एक तरीका है -शिक्षित वस्तुओं?
वहाँके रूप में भी है कि क्या यह OutOfMemoryError
को पकड़ने के लिए उचित है के लिए कुछ बहस हो रहा है - किसी को भी कुछ भी निर्णायक पता है?
System.gc() आमतौर पर सबकुछ बंद नहीं करता है। यह अंतर्निहित कचरा कलेक्टर पर निर्भर करता है। – erickson