2011-11-10 28 views
5

हमारे पास एक ऐसा उत्पाद है जो वर्तमान में 32 बिट 1.6 जेआरई पर चलता है। हम बर्कले डीबी का उपयोग कर रहे हैं जो 4 जीबी एड्रेस स्पेस के लगभग 2.5 जीबी रैम का उपभोग करता है। यह हमें JVM पता स्थान के लिए लगभग 750 एमबी मेमोरी छोड़ देता है।जावा: 32 बिट में 4 जीबी मेमोरी से अधिक ढेर का उपयोग कैसे करें JVM

हम वर्तमान में वर्तमान सेटअप के साथ OutOfMemory मुद्दों को मार रहे हैं। बर्कले डीबी की 2.5 जीबी स्पेस को बरकरार रखने के दौरान हमारे जेवीएम ढेर आकार 1.5 जीबी तक बढ़ाना अच्छा लगेगा। 32-बिट JVM में 4 जीबी रैम/ढेर से अधिक तक पहुंचने का कोई तरीका है? यह मेरे सीमांत परिणाम देगा - - मैं निम्नलिखित समाधान
1) एक JVM जो बेहतर जीसी करता है का उपयोग पर विचार किया है मैं 50-100 के बारे में एमबी काम स्मृति मिल सकता है
2) कुछ memcached या "प्रक्रिया से बाहर की तरह ehcache "- यह मुझे उतना ही प्राप्त कर सकता है जितना हार्डवेयर आईपीसी/क्रमबद्धता के ऊपरी हिस्से के साथ अनुमति देता है।

क्या एप्लिकेशन की एड्रेसेबल मेमोरी बढ़ाने के लिए अन्य समाधान हैं?

समाधान सौर 10 चलने वाले स्पार्क पर काम करना चाहिए।

* अद्यतन: क्योंकि देशी साझा पुस्तकालयों का उपयोग कर के, अभी, हम एक 64-बिट JVM करने के लिए स्विच करने के लिए भले ही ओएस है नहीं कर पा रहे 64-बिट *

, धन्यवाद

+1

ओएस बहुत सारे जीबी रैम के साथ सौर -64-बिट है। यह केवल जावा प्रक्रिया है जिसके लिए अधिक रैम/ढेर की आवश्यकता होती है। – anjanb

+0

anjanb, क्या आप बर्कलेडीबी का सटीक संस्करण कह सकते हैं? बर्कलेडीबी को कितनी मेमोरी आरक्षित थी? – osgx

उत्तर

3

32-बिट प्रोग्राम 4 जीबी से अधिक मेमोरी पतों को संभालने में असमर्थ हैं। उनके पास अधिक स्मृति का प्रतिनिधित्व करने के लिए पर्याप्त बिट्स नहीं हैं।

2^32 = 4 294 967 296

आपका सबसे अच्छा शर्त एक 64-बिट JRE को उन्नत करने के लिए किया जाएगा।

+0

देशी साझा पुस्तकालयों का उपयोग करने के कारण, अभी हम 64-बिट JVM पर स्विच करने में असमर्थ हैं, भले ही ओएस 64-बिट – anjanb

+0

@anjanb है: उस स्थिति में, आपको शायद एप्लिकेशन को कई प्रक्रियाओं में विभाजित करना होगा, जैसा कि osgx अनुशंसा करता है। – StriplingWarrior

5

क्या एप्लिकेशन की एड्रेसेबल मेमोरी बढ़ाने के लिए अन्य समाधान हैं? गैर साझा स्मृति (, लेकिन प्रक्रियाओं नहीं एक धागे) के साथ कई प्रक्रियाओं में

  1. स्प्लिट एकल आवेदन। पहली प्रक्रिया डीबी चला सकती है और दूसरा परियोजना के दूसरे भाग को चला सकता है। प्रक्रियाओं के बीच संवाद करने के लिए आप आरएमआई या साझा मेमोरी या सॉकेट का उपयोग कर सकते हैं।
  2. ओएस के लिए आरक्षित कम स्मृति। जैसे x86-32 पीएई पर ओएस को 4 जीबी 4 जीबी आभासी पता स्थान से कम आरक्षित करने की अनुमति देता है। (उदाहरण के लिए "4 जीबी/4 जीबी विभाजन", Oracle Linux पर समर्थित)
  3. कुछ डेटा डिस्क पर रखें। बेहतर गति के लिए डिस्क रैम-डिस्क हो सकती है; या यह वास्तविक डिस्क हो सकती है और ओएस "पेज कैश" का उपयोग कर फ़ाइलों तक पहुंच तेज कर देगा।

इसके अलावा, हर असली स्पार्क (नहीं प्राचीन SuperSparc या गरीब आदमी शेर) 64-बिट वास्तव में है। तो, ओएस के 64-बिट संस्करण में स्विच करना आसान हो सकता है। मुझे सोलारिस के बारे में पता नहीं है, लेकिन लिनक्स में 64-बिट ओएस के शीर्ष पर 32-बिट अनुप्रयोगों को चलाने के लिए संभव है। और 64 बिट ओएस आपको 64-बिट जेवीएम चलाने की अनुमति देगा।

अद्यतन: सोलारिस http://wikis.sun.com/display/BigAdmin/Talking+about+RAM+disks+in+the+Solaris+OS में रैमडिस्क हैं और मुझे लगता है कि आपको डेटाबेस (या डीबी की अस्थायी फाइलें) संग्रहीत करने के लिए उन्हें आजमाएं। मामले में (1) की तरह कोई अतिरिक्त धारावाहिक/आईपीसी नहीं होगा; केवल अतिरिक्त पढ़ने/लिखने या mmap/munmap। लेकिन रामदीस्क एसएसडी की तुलना में तेजी से ऑर्डर और एचडीडी की तुलना में 3-4 ऑर्डर तेज है।

+0

देशी साझा पुस्तकालयों का उपयोग करने के कारण, अभी हम 64-बिट JVM पर स्विच करने में असमर्थ हैं, भले ही ओएस 64-बिट – anjanb

+1

है, क्या आप देशी libs को अलग प्रक्रिया में ले जा सकते हैं? क्या आपने 64-बिट ओएस पर 32 बिट जेवीएम चलाने की कोशिश की थी (यह 2/2 या 3/1 जीबी विभाजन की आवश्यकता नहीं है)? – osgx

+0

मेमोरी स्प्लिटिंग योजना की जांच करने के लिए एक त्वरित परीक्षण है: http://stackoverflow.com/questions/987219/max-amount-of-memory-per-java-process-in-windows/987576#987576 - आप इसे चला सकते हैं आपके वर्तमान माहौल में और 64-बिटोस +32 बिट जेवीएम संयोजन – osgx

3

मेरा सुझाव है कि आप 32-बिट जेवीएम में अपनी 32-बिट साझा मूल पुस्तकालय चलाएं और 64-बिट जेवीएम में बाकी सब कुछ चलाएं। आपके पास 64-बिट जेवीएम 32-बिट जेवीएम को जो कुछ भी करता है उसे करने के लिए कॉल कर सकता है। मुझे लगता है कि आपके डेटा/मेमोरी आवश्यकता का बड़ा हिस्सा 64-बिट जेवीएम में ले जाया जा सकता है।

+0

ऐसा कुछ है जिसे हमें प्रयोग करना होगा और देखें कि क्या यह समझ में आता है सिस्टम से अपेक्षित थ्रूपुट। – anjanb

+0

आपको उसी मशीन पर दो प्रक्रियाओं (आपके हार्डवेयर के आधार पर) के बीच 500 एमबी/एस 3000 एमबी/एस के थ्रूपुट को प्राप्त करने में सक्षम होना चाहिए। –

+0

क्या आप 32-बिट जावा ऐप से बात करने के लिए 64-बिट जावा ऐप के लिए सबसे अच्छा तरीका सुझा सकते हैं। मैं सामान्य यूनिक्स/लिनक्स आईपीसी तंत्र से अवगत हूं लेकिन इनमें से कौन सा 64-बिट जावा और 32-बिट जावा परिदृश्य में सबसे अच्छा काम करता है? – anjanb