2009-07-27 56 views
20

मेरा जावा एप्लिकेशन "जावा-जेजर जेजर" प्रक्रिया चलाकर, एक और जावा एप्लिकेशन चलाता है। जे .जर को दिए गए डेटासेट के आधार पर बहुत सारी स्मृति का उपयोग करने के लिए जाना जाता है, और अक्सर आउटऑफमेमरी एरर हेप प्राप्त होता है। तो मैं उस पर -Xmx का उपयोग करना चाहता हूं, ताकि मैं जितना संभव हो उतना स्मृति आवंटित कर सकूं (या इसके करीब)। मैं सिस्टम पर कुल मेमोरी प्राप्त करने के बारे में सोच रहा था, फिर उसमें से 80-90% -Xmx निर्दिष्ट करना।जावा-एक्सएमएक्स, सिस्टम पर अधिकतम मेमोरी

क्या मेरी समस्या का कोई समाधान है? और, मेरा समाधान कैसे ध्वनि करता है?

संपादित करें: मैं मेमोरी खपत को कम नहीं कर सकता क्योंकि स्मृति का उपयोग जावा के अंतर्निहित पैक 200 संपीड़न द्वारा किया जाता है, जिसे मैं कुछ जेएआर फाइलों को पैक करने के लिए उपयोग कर रहा हूं।

+3

तो आप वास्तव में कैसे जावा का उपयोग करने प्रणाली स्मृति की मात्रा निर्धारित करने के लिए पूछ रहे हैं? –

+0

हां यह एक संभावित समाधान होगा, और यदि आप एक रास्ता जानते हैं, तो यह जानकर कि इसकी सराहना की जाएगी। –

+0

क्या आप 64 बिट जेवीएम चला रहे हैं? यदि आप 32 बिट चला रहे हैं तो coz, तो आपको '80% 'बिट के साथ समस्या होगी यदि आपका फ्री मेम 7 जी के रूप में बदल जाता है, उदाहरण के लिए –

उत्तर

4

अपने ओएस के आधार पर, इस नि: शुल्क और उपलब्ध मेमोरी आकार प्राप्त करने के लिए काम कर सकते हैं:

java.lang.management.OperatingSystemMXBean mxbean = java.lang.management.ManagementFactory.getOperatingSystemMXBean(); 
com.sun.management.OperatingSystemMXBean sunmxbean = (com.sun.management.OperatingSystemMXBean) mxbean; 
long freeMemory = sunmxbean.getFreePhysicalMemorySize(); 
long availableMemory = sunmxbean.getTotalPhysicalMemorySize(); 

वहाँ से, आप 80-90% पता लगाने और अधिकतम स्मृति आकार आप चाहते हैं के साथ अपने जार शुरू कर सकते हैं ।

मुझे नहीं पता कि यह सभी ओएस (यानी विंडोज) के साथ काम करता है, लेकिन जब मैंने ओएसएक्स और लिनक्स दोनों के साथ इसका परीक्षण किया तो यह काम करता था।

+1

धन्यवाद! मैंने विंडोज और लिनक्स पर उस आदेश की कोशिश की, और यह पूरी तरह से काम किया। –

+1

ऐसा लगता है कि यह केवल सूर्य जेवीएम पर काम करेगा, मुझे आईबीएम जेवीएम पर तैनाती की जरूरत है, इसलिए प्रत्येक के साथ दौड़ नहीं सकते सूरज का उपयोग करेगा। –

0

ठीक है, एक बात मैं आपको बता सकता हूं कि आपके ऐप को रैम भरने के करीब न आने दें। जावा ऐप्स बिल्कुल भी स्वैप नहीं करते हैं। मुझे लगता है कि कचरा संग्रह के कारण, जावा लगातार अपनी याददाश्त को स्वैप से खींचता है।

मैं एक डेडलॉक में भाग गया जहां मुझे लगता है कि सिस्टम स्मृति के लिए जावा से पूछ रहा था जो जीसी का कारण बनता है और स्वैपफाइल से सामान खींचता है - इस बिंदु पर सिस्टम इसे रीसेट होने तक ही स्पिन करेगा।

यह रैम के बहुत सारे और स्वैप स्पेस (उस समय के लिए) और एक पुराना जावा वीएम था, इसलिए आपका माइलेज भिन्न हो सकता है।

इसके अलावा, आप इस ऐप को कैसे शुरू कर रहे हैं, इस पर निर्भर करते हुए, आपको दूसरे ऐप के बजाय अपने ऐप के लिए -Xms निर्दिष्ट करना पड़ सकता है। यदि आप इसे पूर्ण आदेश दे रहे हैं, तो इसे -Xms दें, लेकिन यदि आप केवल जार में मुख्य श्रेणी को कॉल कर रहे हैं, तो आपके ऐप को -Xms की आवश्यकता है। (ओह, आपके द्वारा निर्दिष्ट, हाँ आप इसे "जावा" आदेश बुला रहे हैं में पारित करने के लिए की जरूरत है।)

0

वहाँ एक कारण है कि आप ओएस का उपयोग कर रहे जार में कार्यक्रम पर अमल करने है? यदि आपको अपने आवेदन से अलग प्रक्रिया में निष्पादित करने की आवश्यकता नहीं है, तो आप सीधे अपने कोड से मुख्य विधि का आह्वान कर सकते हैं, और जो भी आप चाहते हैं -Xmx के साथ अपना एप्लिकेशन शुरू कर सकते हैं।

+0

अन्य एप्लिकेशन शुरू करना या मेरा एप्लिकेशन शुरू करना एक ही समस्या है। अगर मैंने अन्य एप्लिकेशन को अपनी मुख्य विधि के साथ चलाया, तो मुझे अभी भी बहुत सारी मेमोरी का उपयोग करने में सक्षम होने के लिए मेरे आवेदन की आवश्यकता है। –

0

वहाँ कैसे निम्नलिखित blog में JConsole और अन्य उपकरणों के साथ जावा अनुप्रयोगों के निवारण के लिए पर एक पूरा ब्लॉग पोस्ट है। ध्यान रखें कि स्मृति उपयोग के नियंत्रण की कमी शायद एक स्मृति रिसाव है, लेकिन यह अन्य कारणों से भी हो सकती है। पोस्ट पर एक नज़र डालें, उस परिदृश्य को दोहराने का प्रयास करें, और देखें कि क्या आपकी समस्या हल हो गई है।

http://www.kiragiannis.com/cloud-computing/debug-a-java-application-in-the-cloud/

0

आपने पहले से ऐसा नहीं किया है, तो आप एक स्मृति प्रोफाइलर के माध्यम से अपने कार्यक्रम चलाने की जरूरत है। आप पाएंगे कि कुछ डेटा संरचनाओं का निपटारा नहीं किया जा रहा है, भले ही उनका उपयोग नहीं किया जा रहा हो।

JProfiler सुंदर गंधा है, लेकिन आप HPROF, जो जावा 5 में पेश किया गया था का उपयोग कर एक ही जानकारी प्राप्त कर सकते हैं: http://java.sun.com/developer/technicalArticles/Programming/HPROF.html

ध्यान रखें यह भी कहा कि विभिन्न प्लेटफार्मों भिन्न अधिकतम ढेर आकार, संरचना पर आधारित है (32- बिट बनाम 64-बिट), ओएस, और यहां तक ​​कि जेवीएम भी।

यदि आपके पास बहुत से मूल्य हैं जिनका पुन: उपयोग किया जा सकता है (जैसे स्ट्रिंग्स जो आप किसी XML फ़ाइल से पढ़ रहे हैं), तो आप अपनी ऑब्जेक्ट्स को पूल करके स्मृति आवश्यकताओं में भारी कमी प्राप्त कर सकते हैं।

13

-XmX की सीमा 32 बिट विंडो पर -Xmx1500m है। साझा पुस्तकालय एक बड़े ढेर के रास्ते में मिलता है। ऐसा करने के लिए आपको लगभग 2 जीबी रैम की आवश्यकता होगी।

गैर-विंडोज ओएस पर आप बड़े हो सकते हैं, और 64 बिट जेवीएम बहुत अधिक सक्षम हैं।

विंडोज एक्सपी आपको 3 जीबी रैम से अधिक नहीं होने देगा (अगर आपके पास 4 जीबी भौतिक है, तो कभी भी एक्सपी एसपी 3 के बाद से कोई परवाह नहीं है) Vista अलग-अलग वाईएमएमवी हो सकता है।

मैंने 64 बिट लिनक्स पर 64 बिट जेवीएम पर -Xmx4000M की कोशिश की है और यह ठीक था। पर विचार करते हुए कि मेरे पास 6 जीबी भौतिक राम था, यह एक बड़ा अनुरोध नहीं था।

आपका 80% विचार दिलचस्प है, लेकिन मेरे परीक्षण सिस्टम बिना किसी प्रभाव के उससे अधिक प्रतिशत चलाते हैं। (जब तक आप कुछ और करने की कोशिश नहीं करते हैं।)

और अन्य टिप्पणीकर्ता सही है, आपकी जेवीएम की मेमोरी छवि को बाहर निकालना त्वरित नहीं है। बाद में JVM के कम अव्यवस्थित ढंग से ऐसा करने में बेहतर हैं

(लेकिन वे भी बेहतर कचरा कलेक्टरों है) आप अपनी स्मृति की खपत को कम नहीं कर सकते - और मुझे पता है कितना मुश्किल यह है कि - तो शारीरिक राम के बहुत सारे है और आवंटित सबसे इसका

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