2011-06-27 14 views
5

मैं ग्रहण का उपयोग कर रहा हूं। समस्या यह है कि आवंटित स्मृति 512 एमबी से कम होने पर मेरा एप्लिकेशन क्रैश हो जाता है। भारी स्मृति पूर्ण प्रक्रिया शुरू करने से पहले अब किसी प्रोग्राम के लिए उपलब्ध स्मृति की जांच करने के लिए वैसे भी है? उदाहरण के लिए, मैं जानता हूँ कि हम के रूप में उपलब्ध JVM ढेर आकार की जाँच कर सकते हैं:प्रोग्रामैटिक रूप से हेप आकार उपलब्ध जांचें?

long heapSize = Runtime.getRuntime().totalMemory(); 
System.out.println("Heap Size = " + heapSize); 

समस्या है, इस JVM ढेर आकार देता है। यह भी बढ़ रहा है ग्रहण का उपयोग कर काम नहीं करता है। ग्रहण में, यदि मैं वीएम तर्क बदलता हूं तो यह काम करता है। हालांकि उपरोक्त बयान से प्रिंटआउट हमेशा एक ही है। क्या कोई आदेश है जिसके माध्यम से मैं वास्तव में जान सकता हूं कि किसी विशेष एप्लिकेशन के लिए मुझे कितनी मेमोरी आवंटित की गई है?

+0

शायद समस्या ग्रहण है। क्या आपने नेटबीन्स या इंटेलिजे की कोशिश की है? – telm

+0

मैंने कोशिश की, यह किसी भी आईडीई – Johnydep

+0

के साथ एक ही परिणाम है रनटाइम में कुल मेमरी() और maxMemory() दोनों हैं। मेरे अनुभव में maxMemory बड़ा है। –

उत्तर

13

आप रनटाइम पर हीप मेमोरी के उपयोग को एकत्रित करने के लिए JMX का उपयोग कर सकते हैं।


कोड उदाहरण:

import java.lang.management.ManagementFactory; 
import java.lang.management.MemoryPoolMXBean; 
import java.lang.management.MemoryType; 
import java.lang.management.MemoryUsage; 

for (MemoryPoolMXBean mpBean: ManagementFactory.getMemoryPoolMXBeans()) { 
    if (mpBean.getType() == MemoryType.HEAP) { 
     System.out.printf(
      "Name: %s: %s\n", 
      mpBean.getName(), mpBean.getUsage() 
     ); 
    } 
} 

आउटपुट उदाहरण:

Name: Eden Space: init = 6619136(6464K) used = 3754304(3666K) committed = 6619136(6464K) max = 186253312(181888K) 
Name: Survivor Space: init = 786432(768K) used = 0(0K) committed = 786432(768K) max = 23265280(22720K) 
Name: Tenured Gen: init = 16449536(16064K) used = 0(0K) committed = 16449536(16064K) max = 465567744(454656K) 

अपने बारे में "ईडन अंतरिक्ष" या "उत्तरजीवी अंतरिक्ष" प्रश्न है, तो बाहर How is the java memory pool divided जाँच

+0

येस लेकिन वास्तव में यह वास्तव में मदद करता है। मैं सिर्फ जेवीएम या इस तरह से कुछ मेरे आवेदन में कुल आवंटित स्मृति जानना चाहता हूं। कॉन्फ़िगरेशन से मुझे पता है कि यह 512 एमबी से कम है, तो यह काम करता है। लेकिन मैं इस व्यावहारिक रूप से कैसे जांच सकता हूं क्योंकि एक बार यह ऐप पैक हो जाने पर, यदि यह रन टाइम पर क्रैश हो रहा है, तो त्रुटि की प्रकृति के बारे में उपयोगकर्ता को संकेत देने के लिए एक मेकहनिज्म होना चाहिए। बदतर मामले में मैं अपवाद पकड़ूंगा और उपयोगकर्ता को स्मृति आकार बढ़ाने के लिए प्रेरित करूंगा, लेकिन यह दुर्घटना के बाद होगा, लेकिन शुरुआत से पहले नहीं। Unfortuanatelly इसे दुर्घटनाग्रस्त होने से पहले लगभग 30 मिनट लगते हैं और यह समय बर्बाद हो जाएगा। – Johnydep

+0

क्या आपने अपना JAVA_OPTS या CATALINA_OPTS सेट किया था? '-Xmx' (अधिकतम ढेर आकार) पैरामीटर के बारे में क्या? शायद यह दुर्घटनाग्रस्त हो जाता है क्योंकि यह किसी बिंदु पर स्मृति से बाहर है? लॉग फाइलें क्या कहती हैं, किसी भी आउटऑमरी त्रुटियों में? – Danijel

0

इस विचार के बारे में कैसे? आप JVM command line with this API देख सकते हैं।

फिर आप -Xmx… पैरामीटर के लिए कमांड लाइन स्कैन कर सकते हैं ताकि यह सुनिश्चित किया जा सके कि पर्याप्त पर्याप्त ढेर निर्दिष्ट है।

संबंधित मुद्दे