java - जावा प्रारंभ करने से इंकार कर देता है-वस्तु ढेर के लिए पर्याप्त जगह आरक्षित नहीं कर सका




linux memory (10)

32-बिट ओएस चलाना एक गलती है; आपको निश्चित रूप से सबसे पुरानी सुविधा पर अपग्रेड करना चाहिए।

मुझे नहीं पता कि जावा को एक ही संगत खंड में होने के लिए अपने ढेर की आवश्यकता है, लेकिन यदि ऐसा होता है, तो 32-बिट बॉक्स पर ढेर के 1.8 जी के लिए एक लंबा आदेश की तरह लगता है। आप मान रहे हैं कि पता स्थान का एक हिस्सा है, इसमें से लगभग आधा, JVM स्टार्टअप समय पर निःशुल्क है।

उस समय अन्य पुस्तकालयों को लोड करने के आधार पर, ऐसा नहीं हो सकता है। पुस्तकालय स्मृति को आवंटित कहीं भी आवंटित कर सकते हैं, इसलिए यह आपके पता स्थान को पर्याप्त रूप से विभाजित कर सकता है कि 1.8 जी एक खंड में उपलब्ध नहीं है।

लिनक्स 32-बिट पर वैसे भी 3 जी एड्रेस स्पेस अधिकतम उपलब्ध है। पुस्तकालयों और जेवीएम स्वयं कुछ के साथ शुरू करने के लिए उपयोग करता है।

पृष्ठभूमि

हमारे पास लगभग 20 लिनक्स ब्लेड का एक पूल है। कुछ सूज़ चला रहे हैं, कुछ रेडहाट चला रहे हैं। सभी साझा NAS स्थान जिसमें निम्न 3 फ़ोल्डर्स हैं:

  • / NAS / ऐप / जावा - एक सिम्लिंक जो जावा जेडीके की स्थापना को इंगित करता है। वर्तमान में संस्करण 1.5.0_10
  • / NAS / app / lib - एक सिम्लिंक जो हमारे अनुप्रयोग के संस्करण को इंगित करता है।
  • / NAS / डेटा - निर्देशिका जहां हमारा आउटपुट लिखा गया है

हमारी सभी मशीनों में 4 जीबी भौतिक मेमोरी और 4 जीबी स्वैप स्पेस के साथ 2 प्रोसेसर (हाइपरथ्रेडेड) हैं। हम प्रत्येक मशीन को 'नौकरियों' की संख्या को सीमित करते हैं, जो किसी भी समय 6 पर प्रक्रिया कर सकते हैं (इस संख्या को बदलने की जरूरत है, लेकिन यह वर्तमान समस्या में प्रवेश नहीं करता है, इसलिए कृपया समय के लिए इसे अनदेखा करें)।

हमारी कुछ नौकरियों ने मैक्स हीप आकार 512 एमबी सेट किया है, कुछ अन्य 2048 एमबी के मैक्स हीप आकार को आरक्षित करते हैं। दोबारा, हमें एहसास हुआ कि अगर हम 2048 तक ढेर आकार के साथ उसी मशीन पर 6 नौकरियां शुरू कर दीं तो हम अपनी उपलब्ध स्मृति पर जा सकते हैं, लेकिन हमारे ज्ञान के लिए यह अभी तक नहीं हुआ है।

समस्या

एक बार और थोड़ी देर बाद एक नौकरी निम्नलिखित संदेश के साथ तुरंत विफल हो जाएगी:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

हम उसी मशीन पर एक ही समय में चल रहे बहुत से नौकरियों तक इसे चाकते थे। समस्या अक्सर कम हो गई (मई में एक बार मई) कि हम इसे फिर से शुरू करेंगे और सबकुछ ठीक होगा।

समस्या हाल ही में बहुत खराब हो गई है। हमारी सभी नौकरियां जो 2048 मीटर के अधिकतम ढेर आकार का अनुरोध करती हैं, लगभग हर बार तुरंत विफल हो जाती हैं और इसे पूरा करने से पहले कई बार फिर से शुरू करने की आवश्यकता होती है।

हम अलग-अलग मशीनों पर गए हैं और उसी परिणाम के साथ मैन्युअल रूप से उन्हें निष्पादित करने का प्रयास किया है।

डिबगिंग

यह पता चला है कि समस्या केवल हमारे एसयूएसई बक्से के लिए मौजूद है। यह अधिक बार हो रहा है क्योंकि हम और मशीनें जोड़ रहे हैं, और नए लोग SUSE हैं।

एसयूएसई बक्से पर 'बिल्ली / proc / संस्करण' हमें देते हैं:

Linux version 2.6.5-7.244-bigsmp ([email protected]) (gcc version 3.3.3 (SuSE Linux)) #1 SMP Mon Dec 12 18:32:25 UTC 2005

रेडहाट बक्से पर 'बिल्ली / proc / version' हमें देता है:

Linux version 2.4.21-32.0.1.ELsmp ([email protected]) (gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-52)) #1 SMP Tue May 17 17:52:23 EDT 2005

'uname -a' हमें दोनों प्रकार की मशीनों पर निम्नलिखित देता है:

UTC 2005 i686 i686 i386 GNU/Linux

मशीन पर कोई नौकरियां नहीं चल रही हैं, और कोई अन्य प्रक्रिया बहुत मेमोरी का उपयोग नहीं कर रही है। वर्तमान में चल रही सभी प्रक्रियाएं 100 एमबी कुल का उपयोग कर सकती हैं।

वर्तमान में 'शीर्ष' निम्नलिखित दिखाता है:

Mem:   4146528k total,  3536360k used,   610168k free,   132136k buffers
Swap:  4194288k total,        0k used,  4194288k free,  3283908k cached

'vmstat' वर्तमान में निम्नलिखित दिखाता है:

procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in    cs us sy id wa
0  0      0 610292 132136 3283908    0    0     0     2   26    15  0  0 100  0

अगर हम निम्नलिखित कमांड लाइन (1850 एमबी के मैक्स हीप) के साथ नौकरी निकाल देते हैं तो यह ठीक शुरू होता है:

java/bin/java -Xmx1850M -cp helloworld.jar HelloWorld
Hello World

यदि हम अधिकतम ढेर आकार को 1875 एमबी तक बढ़ाते हैं तो यह विफल रहता है:

java/bin/java -Xmx1875M -cp helloworld.jar HelloWorld
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

यह स्पष्ट है कि वर्तमान में उपयोग की जाने वाली मेमोरी बफरिंग / कैशिंग के लिए है और यही वजह है कि बहुत कम 'मुक्त' के रूप में प्रदर्शित किया जा रहा है। स्पष्ट नहीं है कि एक जादुई 1850 एमबी लाइन क्यों है जहां कुछ भी उच्चतर जावा शुरू नहीं कर सकता है।

किसी भी स्पष्टीकरण की सराहना की जाएगी।


ulimit अधिकतम मेमोरी आकार और वर्चुअल मेमोरी असीमित पर सेट?


आपको अपने ओएस और जावा को अपग्रेड करने की आवश्यकता है। जावा 5.0 ईओएल है लेकिन यदि आप जावा 6 में अपडेट नहीं कर सकते हैं, तो आप नवीनतम पैच स्तर 22 का उपयोग कर सकते हैं!

32-बिट विंडोज़ ~ 1.3 जीबी तक सीमित है, इसलिए आप अधिकतम 1.8 तक पहुंचने के लिए अच्छा कर रहे हैं। नोट: यह निरंतर स्मृति के साथ एक समस्या है, और जैसे ही आपका सिस्टम अपनी मेमोरी स्पेस चलाता है, खंडित हो सकता है, इसलिए यह मुझे आश्चर्य नहीं करता कि आपको यह समस्या है।

एक 64-बिट ओएस, इस समस्या में कोई समस्या नहीं है क्योंकि इसमें अधिक वर्चुअल स्पेस है, आपको इसका लाभ उठाने के लिए जावा के 64-बिट संस्करण में अपग्रेड करना भी नहीं है।

बीटीडब्लू, मेरे अनुभव में, 32-बिट जावा 5.0 64-बिट जावा 5.0 से तेज हो सकता है। यह कई सालों बाद तक नहीं था कि जावा 6 अपडेट 10 64-बिट के लिए तेज था।


ऐसा लगता है कि 32-बिट सर्वरों के लिए एक JVM सीमा है जिसे दूर नहीं किया जा सकता है (जब तक आपको कोई विशेष 32-बिट JVM नहीं मिलता है जो 2 जीबी सीमा या उससे कम नहीं लगाता है)।

सर्वर साइड पर इस धागे में 32 से अधिक आर्किटेक्चर पर विभिन्न जेवीएम का परीक्षण करने वाले कई लोगों सहित अधिक जानकारी है। आईबीएम का जेवीएम 100 एमबी की इजाजत देता है लेकिन यह वास्तव में आपको प्राप्त करने वाला नहीं है।

http://www.theserverside.com/discussions/thread.tss?thread_id=26347

"वास्तविक" समाधान एक 64-बिट सर्वर का उपयोग 64-बिट जेवीएम के साथ 2 जीबी प्रति प्रक्रिया से अधिक ढेर प्राप्त करने के लिए है। हालांकि, 64-बिट JVM का उपयोग कर अपने पता आकार (केवल पता योग्य स्थान नहीं) को बढ़ाने के प्रभाव पर विचार करना महत्वपूर्ण है। 4 जीबी से कम स्मृति का उपयोग कर प्रसंस्करण के लिए प्रदर्शन और स्मृति प्रभाव होने की संभावना है।

विचार के लिए भोजन: क्या इन नौकरियों में से प्रत्येक को वास्तव में 2 जीबी मेमोरी की आवश्यकता होती है? क्या 1.8 जीबी के भीतर चलाने के लिए नौकरियों को संशोधित करने का कोई तरीका है, इसलिए यह सीमा कोई समस्या नहीं है?


जैसा कि अन्य प्रतिक्रियाओं में सुझाव दिया गया है, समस्या आभासी पता स्थान के थकावट के कारण होती है। 32 बिट लिनक्स यूजरस्पेस प्रोग्राम आमतौर पर 3 जीबी तक सीमित होता है; शेष 1 जीबी कर्नेल द्वारा उपयोग किया जाता है (तर्क: चूंकि शीर्ष 1 जीबी कर्नेल फिक्स्ड मैपिंग है क्योंकि सिस्को की सेवा करते समय पृष्ठ तालिका को छूना आवश्यक नहीं है)।

आरएचईएल कर्नेल, हालांकि, 4 जीबी / 4 जीबी स्प्लिट को कार्यान्वित करते हैं जहां पूर्ण 4 जीबी एएस थोड़ी रनटाइम ओवरहेड की लागत पर उपयोगकर्ताओं की प्रक्रियाओं के लिए उपलब्ध है (कर्नेल एक अलग 4 जीबी आभासी एएस में रहता है)


निष्पादित करने के चरण .... वीएम की शुरुआत के दौरान हुई त्रुटि को हल करने के लिए ऑब्जेक्ट ढेर के लिए पर्याप्त स्थान आरक्षित नहीं किया जा सका जावा वर्चुअल मशीन नहीं बना सका।

चरण 1: स्मृति का उपयोग करें जो आपने पहले उपयोग किया था .. जावा -Xms128m -Xmx512m -cp simple.jar

चरण 2: राम बोर्ड को कुछ समय से निकालें और इसे प्लग करें और फिर से शुरू करें * हो सकता है कि यह अवरुद्ध ढेर क्षेत्र मेमोरी को छोड़ देगा .. जावा -Xms512m -Xmx1024m -cp simple.jar

उम्मीद है कि यह अब अच्छी तरह से काम करेगा ... :-)


मैं एसओए एनवी का उपयोग कर रहा हूं, setSOADomainENV.cmd में 1024 से 768 से setSOADomainENV.cmd गए setSOADomainENV.cmd ने इस मुद्दे को हल किया है।

REM set DEFAULT_MEM_ARGS=-Xms512m -Xmx1024m
set DEFAULT_MEM_ARGS=-Xms512m -Xmx768m

मैंने दो अनुप्रयोगों को लिखा, एक मध्यम आकार, और दूसरा, काफी छोटा। मैं किसी भी तर्क के बिना मध्यम आकार (लिनक्स, सेंटोस पर) को आग लगा दूंगा, (जावा सर्वर), और यह ठीक होगा। लेकिन जब मैंने "जावा क्लाइंट" के साथ छोटे ऐप को निकाल दिया, तो यह मुझे बताएगा कि यह पर्याप्त जगह आरक्षित नहीं कर सका, और दौड़ नहीं पाएगा। मैंने प्रयोग किया, और 10 एम के साथ -Xms और -Xmx दोनों का उपयोग किया, और वे दोनों शिकायत के बिना दौड़ेंगे ... आंकड़े जाओ!


यह ट्रैक से बाहर हो सकता है, लेकिन दो चीजें हैं जो वसंत को ध्यान में रखती हैं। निम्नलिखित में से दोनों मानते हैं कि आप लिनक्स का 32 बिट संस्करण चला रहे हैं।

लिनक्स पर एक प्रक्रिया आकार सीमा है, ऐसा लगता है कि CentOS पर लगभग 2.5 जीबी था और कर्नेल में कॉन्फ़िगर किया गया है (यानी बदलने के लिए एक अपूर्ण)। आपकी प्रक्रिया यह हो सकती है कि एक बार जब आप सभी जेवीएम कोड + पर्मजन स्पेस और बाकी के जेवीएम पुस्तकालयों को जोड़ लेंगे।

दूसरी बात यह है कि मैं कुछ ऐसा आया हूं जो आप पता स्थान से बाहर हो रहे हैं, मुझे पता है कि मैं जानता हूं। एक 1.5 जीबी ढेर के साथ ग्लासफ़िश चलाने में कोई समस्या थी, जब उसने जेएसपी को मजबूर करने की कोशिश की तो मेरा असफल जावैक विफल हो गया क्योंकि ओएस बॉक्स में 12 जीबी मेमोरी होने के बावजूद नई बनाई गई प्रक्रिया के लिए पर्याप्त पता स्थान आवंटित नहीं कर सका। यहां कुछ ऐसा ही हो सकता है।

मैं उपरोक्त दो के लिए एकमात्र समाधान डर रहा हूं जहां 64 बिट कर्नेल में अपग्रेड करना है।

उम्मीद है कि यह कुछ उपयोग है।


यह देखते हुए कि अन्य सुझावों में से कोई भी काम नहीं करता है (कई चीजों सहित मैंने स्वयं को सुझाव दिया होगा), आगे की समस्या निवारण में सहायता के लिए, क्या आप दौड़ने का प्रयास कर सकते हैं:

sysctl -a

एसयूएसई और रेडहाट दोनों मशीनों पर यह देखने के लिए कि क्या कोई अंतर है? मैं अनुमान लगा रहा हूं कि इन दो वितरणों के बीच डिफ़ॉल्ट कॉन्फ़िगरेशन अलग-अलग हैं जो इसका कारण बन रहे हैं।





heap