मैं बिल्ला के तहत चल रहे webapps का एक संग्रह है। टॉमकैट को -Xmx तर्क का उपयोग करके 2 जीबी मेमोरी रखने के लिए कॉन्फ़िगर किया गया है।जावा Runtime.getRuntime()। कार्यकारी() विकल्प
webapps में से कई एक काम है कि निम्नलिखित कोड का इस्तेमाल कर रही समाप्त होता है प्रदर्शन करने की जरूरत है:
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(command);
process.waitFor();
...
मुद्दा हम कर रहे हैं जिस तरह से है कि यह "बाल-प्रक्रिया" बनाया जा रहा है से संबंधित है लिनक्स पर (Redhat 4.4 और Centos 5.4)।
यह मेरी समझ है कि टोमकैट की मात्रा के बराबर स्मृति की मात्रा प्रारंभिक रूप से इस बच्चे की प्रक्रिया के लिए भौतिक (गैर-स्वैप) सिस्टम मेमोरी के पूल में मुक्त होने की आवश्यकता है। हम पर्याप्त खाली भौतिक स्मृति की जरूरत नहीं है, तो हम इस हो रही है:
java.io.IOException: error=12, Cannot allocate memory
at java.lang.UNIXProcess.<init>(UNIXProcess.java:148)
at java.lang.ProcessImpl.start(ProcessImpl.java:65)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
... 28 more
मेरे प्रश्न हैं:
1) स्मृति की राशि माता पिता के बराबर के लिए आवश्यकता को दूर करने के क्या यह संभव है भौतिक स्मृति में प्रक्रिया मुक्त हो रही है? मैं एक जवाब मुझे कितनी स्मृति बच्चे प्रक्रिया हो जाता है निर्दिष्ट करने के लिए या स्वैप स्मृति का उपयोग करने के लिए लिनक्स पर जावा अनुमति देने के लिए अनुमति देता है के लिए देख रहा हूँ।
2) Runtime.getRuntime()। Exec() के विकल्प क्या हैं यदि # 1 का कोई समाधान मौजूद नहीं है? मैं केवल दो के बारे में सोच सकता हूं, जिनमें से कोई भी वांछनीय नहीं है। JNI (बहुत अन-वांछनीय) या पुनर्लेखन कार्यक्रम हम जावा में बुला रहे हैं और यह अपने आप प्रक्रिया है कि किसी भी तरह webapp के साथ संचार कर रही है। दूसरों को होना है।
3) इस समस्या यह है कि मैं नहीं दिखाई दे रहा है कि संभावित इसे ठीक कर सकता है के लिए एक और पक्ष है? टोमकैट द्वारा उपयोग की जाने वाली मेमोरी की मात्रा को कम करना एक विकल्प नहीं है। सर्वर पर मेमोरी बढ़ाना हमेशा एक विकल्प होता है, लेकिन बैंड-एड्स की तरह लगता है।
सर्वर जावा चल रहे हैं 6.
संपादित करें: मुझे लगता है कि मैं एक बिल्ला विशिष्ट सुधार के लिए नहीं देख रहा हूँ निर्दिष्ट करना चाहिए। वेबसर्वर पर चल रहे किसी भी जावा एप्लिकेशन के साथ यह समस्या देखी जा सकती है (कई हैं)। मैंने बस उदाहरण के रूप में टोमकैट का उपयोग किया क्योंकि इसकी सबसे अधिक संभावना है कि इसे आवंटित किया जाए और यह वह जगह है जहां हमने वास्तव में पहली बार त्रुटि देखी थी। यह एक प्रतिलिपि त्रुटि है।
संपादित करें: अंत में, हम इस समस्या को फिर से लिखकर क्या सिस्टम कॉल जावा में कर रहा था द्वारा हल किया। मुझे लगता है कि हम बहुत भाग्यशाली थे क्योंकि अतिरिक्त सिस्टम कॉल किए बिना ऐसा करने में सक्षम थे। सभी प्रक्रियाएं ऐसा करने में सक्षम नहीं होंगी, इसलिए मुझे अभी भी एक वास्तविक समाधान देखना अच्छा लगेगा।
संबंधित: http://stackoverflow.com/questions/209875/from-what-linux- कर्नेल- libc-version-is-java-runtime-exec-safe-with-regards-to-m – BalusC
मैंने नहीं किया ' वास्तव में उस लेख में कुछ भी नहीं देखता जिसने मेरे सवालों का जवाब दिया। मैंने देखा कि एक क्रिया "मूल प्रक्रिया द्वारा उपयोग की जाने वाली स्मृति की मात्रा को कम करें" (हमारे लिए कोई विकल्प नहीं) चाहे उलिमिट या जावा ऑप्ट्स के साथ। दूसरा ल्यूक के उत्तर के समान था, जो एक अलग प्रक्रिया है जो कम स्मृति का उपयोग करता है। यह आदर्श से बहुत दूर है, लेकिन कम से कम व्यावहारिक – twilbrand
आप किस जेवीएम का उपयोग कर रहे हैं (सूर्य, ओपनजेडीके ...?) इससे मदद नहीं मिलती है? http://stackoverflow.com/questions/1124771/how-to-solve-java-io-ioexception-error12-cannot-allocate-memory-calling-runt – leonbloy