मेमोरी गहन अनुप्रयोगों के लिए जेवीएम अधिकतम ढेर आकार में वृद्धि


88

मुझे एक जावा मेमोरी गहन एप्लिकेशन चलाने की आवश्यकता है जो 2GB से अधिक का उपयोग करता है, लेकिन मुझे ढेर अधिकतम आकार बढ़ाने में समस्याएं आ रही हैं। अब तक, मैंने निम्नलिखित तरीकों की कोशिश की है:

  • -Xmx पैरामीटर सेट करना, जैसे-Xmx3000m। यह दृष्टिकोण जेवीएम के निर्माण में विफल रहता है। मैंने जो देखा है, उससे ऐसा लगता है कि -Xmx 2GB से कम होना चाहिए।

  • -XX का उपयोग : + AggressiveHeap विकल्प । जब मैं इस दृष्टिकोण की कोशिश करता हूं तो मुझे एक 'पर्याप्त मेमोरी नहीं' त्रुटि मिलती है जो बताती है कि ढेर का आकार 1273.4 एमबी है, भले ही मेरे कंप्यूटर में 8 जीबी मेमोरी हो।

क्या एक और दृष्टिकोण है कि मैं जेवीएम के अधिकतम आकार को बढ़ाने की कोशिश कर सकता हूं? यहां कंप्यूटर स्पेक्स का सारांश दिया गया है:

  • ओएस: विंडोज 7 (64 बिट)
  • प्रोसेसर: इंटेल कोर i7 (2.66 GHz)
  • मेमोरी: 8 जीबी
  • जावा:
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)

7
BTW: न्यूनतम और अधिकतम मेमोरी आकार अब मानक विकल्प हैं। आप -Xms और -Xmx के बजाय -ms और -mx का उपयोग कर सकते हैं। -एक्स?? गैर-मानक विकल्पों के लिए आरक्षित है।
पीटर लॉरी

2
किस मानक के लिए JVM? वे हॉटस्पॉट JVM (1.8 के रूप में) के लिए अभी भी गैर-मानक हैं। देखें docs.oracle.com/javase/8/docs/technotes/tools/unix/...
हकल

-mx और -ms मौजूद है और काम करता है, लेकिन मैं इसे आधिकारिक जावा प्रलेखन में नहीं पा सकता @PeterLawrey> क्या आप दस्तावेज़ में लिंक जोड़ सकते हैं? धन्यवाद
मिशाल बर्नहार्ड

2
@MichalBernhard यह जावा 1.1 के साथ पिछड़ी संगतता है। मैंने इसे उस संस्करण के लिए प्रलेखित देखा, लेकिन अब इसे खोजना मुश्किल हो सकता है। ;)
पीटर लॉरी

1
धन्यवाद @PeterLawrey एक स्पष्टीकरण के लिए। लेकिन जब आप कहते हैं कि यह अब मानक है तो इसका मतलब है कि यह जावा 1.1 से मानक है (लेकिन बाद के संस्करणों में दस्तावेज़ नहीं है)? अजीब लगता है :) btw मैं जावा पर लिंक मिल गया 1.1 प्रलेखन और तुम ठीक कह रहे: ad.ntust.edu.tw/course/ad5601701/jmdl/docs/java/tooldocs/win32/...
मीकल बर्नहार्ड

जवाबों:



96

जब आप 32-बिट मोड में जेवीएम का उपयोग कर रहे हैं, तो आवंटित अधिकतम आकार का आकार 1280 एमबी है। इसलिए, यदि आप उससे आगे जाना चाहते हैं, तो आपको 64-मोड में JVM को आमंत्रित करना होगा।

आप निम्नलिखित का उपयोग कर सकते हैं:

$ java -d64 -Xms512m -Xmx4g HelloWorld

कहाँ पे,

  • -64: 64-बिट JVM को सक्षम करेगा
  • -Xms512m: 512 एमबी के रूप में प्रारंभिक ढेर आकार निर्धारित करेगा
  • -Xmx4g: 4 जीबी के रूप में अधिकतम ढेर आकार निर्धारित करेगा

आप अपनी आवश्यकतानुसार (YMMV) में -Xms और -Xmx को ट्यून कर सकते हैं

JVM प्रदर्शन ट्यूनिंग पर एक बहुत अच्छा संसाधन, जिसे देखना चाहते हैं: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html


मेरा JVM 32-बिट है और अधिकतम -Xmx1024M की अनुमति देता है। इसके अलावा 64 बिट संस्करण की कोशिश करने जा रहा है।
किलटेक

मैंने जेवीएम 64-बिट की कोशिश की है और इसने पूरी तरह से काम किया है। मैं अब अधिकतम ढेर आकार के 4096 एमबी सेट कर सकता हूं। जब आपके पास 32 और 64 बिट दोनों स्थापित हैं, तो कम से कम विंडोज पर आपको अपने अनुप्रयोगों के लिए जावा पथ को नए 64 बिट संस्करण स्थापित करने के लिए इंगित करना होगा। अन्यथा, त्रुटि बनी रहेगी। विंडोज पर यह अक्सर सिस्टम के पर्यावरण चर पर जावा पथ को बदलकर किया जा सकता है।
फाबियानो

मुझे लगता है कि अधिकतम ढेर की सीमा 1280 नहीं है, लेकिन 1700MB के करीब है। मैंने अपने 32 बिट जेवीएम इंस्टॉलेशन पर अधिकतम 1600 एमबी का उपयोग किया और यह ठीक काम किया।
फेबियानो

आपके आदेश में HelloWorld तर्क क्या है? अगर मैं जावा-लाइन myApp.jar कमांड के साथ शुरू होने वाली जावा प्रक्रिया का अधिकतम सेट करना चाहता हूं, तो मैं इस कमांड का उपयोग कैसे कर सकता हूं?
लॉर्डस्कॉन

नमस्ते, क्या मैं पूछ सकता हूं कि मैं अधिकतम जावा हीप आकार क्या निर्धारित कर सकता हूं? जब मैं एप्लिकेशन चलाता हूं, तो मेरी मशीन पर डिफॉल -Xmx 4GB है, लेकिन क्या मैं इसे 4GB से अधिक सेट कर सकता हूं?
ओक

14

मेरा मानना ​​है कि 2GB की सीमा 32-बिट जावा के लिए है। मैंने सोचा था कि v1.6 हमेशा 64 बिट था, लेकिन केवल देखने के लिए 64 बिट मोड को मजबूर करने का प्रयास करें: -d64 विकल्प जोड़ें।


-D64 विकल्प ने काम नहीं किया, मैं 64-बिट जेवीएम का उपयोग करने की कोशिश करूंगा क्योंकि ग्रेग ने सुझाव दिया और परिणामों की रिपोर्ट करें।
अलसी कोस्टा

1
-D64 और -d32 स्विचेस केवल सोलारिस (इन दस्तावेजों के अनुसार कम से कम) पर सही ढंग से काम करता है: java.sun.com/docs/hotspot/HotSpotFAQ.html#64bit_layering
लुकाज़ स्टेल्मच

मैंने दोनों विकल्पों के साथ कोशिश की है। -D64 के साथ JVM Xmx विकल्प निर्दिष्ट नहीं करने पर भी लॉन्च करने में विफल रहता है। -D64 केवल तब काम करता है जब मैं Xmx निर्दिष्ट नहीं करता।
अलसी कोस्टा

@Lukasz -d64 और -d32 भी Apple के JVM पर काम करते दिख रहे हैं। लेकिन उस दस्तावेज़ से यह प्रतीत होता है कि वे सूर्य के विंडोज और लिनक्स जेवीएम के लिए गैर-कार्यात्मक हैं।
22

8

32-बिट जावा लगभग 1.4 से 1.6 जीबी तक सीमित है।

Oracle 32 बिट हीप FAQ

उद्धरण

32-बिट जेवीएम के लिए अधिकतम सैद्धांतिक हीप सीमा 4 जी है। विभिन्न अतिरिक्त बाधाओं जैसे कि उपलब्ध स्वैप, कर्नेल पता स्थान उपयोग, स्मृति विखंडन और वीएम ओवरहेड के कारण, व्यवहार में सीमा बहुत कम हो सकती है। अधिकांश आधुनिक 32-बिट विंडोज सिस्टम पर अधिकतम ढेर का आकार 1.4G से 1.6G तक होगा। 32-बिट सोलारिस गुठली पर पता स्थान 2G तक सीमित है। 32-बिट वीएम चलाने वाले 64-बिट ऑपरेटिंग सिस्टम पर, अधिकतम हीप आकार अधिक हो सकता है, जो कई सोलारिस सिस्टम पर 4 जी के करीब पहुंचता है।


4

नीचे मेरे लिए काम करता है:

JAVA_HOME=/JDK1.7.51-64/jdk1.7.0_51/
PATH=/JDK1.7.51-64/jdk1.7.0_51/bin:$PATH
export PATH
export JAVA_HOME

JVM_ARGS="-d64 -Xms1024m -Xmx15360m -server"

/JDK1.7.51-64/jdk1.7.0_51/bin/java $JVM_ARGS -jar `dirname $0`/ApacheJMeter.jar "$@"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.