2013-11-22 4 views
15

जैसा कि हम जानते हैं कि हम window->preferences->java->installed jres->edit->default vm argumentsग्रहण में सेट कर सकते हैं। लेकिन जब मैं इस प्रोजेक्ट को एक रननेबल जार फ़ाइल में पैकेज करता हूं, तो java -jar A.jar के माध्यम से जार चलाने पर मैं -Xmx1024M कैसे सेट कर सकता हूं?एक जार फ़ाइल चलाने शुरू करते समय -Xmx कैसे सेट करें?

बहुत बहुत धन्यवाद!

+1

जावा जार -Xmx1024M A.jar – Mark

उत्तर

2

java -Xmx1024m फ़ाइल नाम का प्रयास करें। मैंने इसे StackOverflow What does Java option -Xmx stand for? पर पाया और उदाहरण के लिए नेटबीन्स शुरू करते समय इसका उपयोग करें।

इस java -jar JavaApplication.jar -Xmx1024m

जानकारी की तरह उपयोग: -Xmxn , अधिकतम आकार निर्दिष्ट करें, स्मृति आवंटन पूल के बाइट्स में। यह मान 2 एमबी से 1024 से अधिक का एक होना चाहिए। मेगाबाइट्स को इंगित करने के लिए किलोबाइट्स, या एम या एम को इंगित करने के लिए अक्षर के या के रूप में संलग्न करें। डिफ़ॉल्ट मान 64 एमबी है। इस मूल्य के लिए ऊपरी सीमा सोलारिस 7 और सोलारिस 8 एसपीएआरसी प्लेटफार्मों और सोलारिस 2.6 और x86 प्लेटफॉर्म पर 2000 मीटर, कम से कम ओवरहेड राशियों पर लगभग 4000 मीटर होगी।

+3

कृपया ध्यान दें कि आपके प्रस्तावित समाधान '-Xmx1024m' निष्पादित जार फ़ाइल में पास किया गया है, जेएमवी के इरादे से नहीं। विवरण के लिए मेरा उत्तर देखें: http://stackoverflow.com/a/42207984/7492402 –

+2

उपर्युक्त उत्तर गलत है - सभी JVM तर्क जावा के ठीक बाद पारित किए जाने चाहिए: यानी जावा -Xmx4G -Xms1G .... your_jar.jar –

1

तीन तरीके:

  • कमांड लाइन:
    • का उपयोग कर अपने आवेदन चलाने के लिए अपने उपयोगकर्ताओं को निर्देश दें "जावा जार SampleJavaApp.jar -Xmx1024m"
  • जावा नियंत्रण कक्ष:
    • डिफ़ॉल्ट रूप से जावा को अधिक स्मृति समर्पित करने के लिए अपने उपयोगकर्ताओं को निर्देश दें: Win7 guide
  • उपयुक्त एक्सएमएक्स मूल्य के साथ अपने जार को पुनरारंभ करें।

अंतिम विकल्प "बुरा" है लेकिन आपके उपयोगकर्ताओं से कोई अतिरिक्त प्रयास की आवश्यकता नहीं है। यहाँ कोड का एक नमूना ब्लॉक है:

public static void main(String[] args) throws IOException, URISyntaxException { 
    String currentPath=SampleJavaApp.class 
      .getProtectionDomain() 
      .getCodeSource().getLocation() 
      .toURI().getPath() 
      .replace('/', File.separator.charAt(0)).substring(1); 
    if(args.length==0 && Runtime.getRuntime().maxMemory()/1024/1024<980) { 
     Runtime.getRuntime().exec("java -jar -Xmx1024m "+currentPath+" restart"); 
     return; 
    } 
} 
43

दुर्भाग्य से, मौजूदा जवाब एक महत्वपूर्ण बिंदु में गलत हैं।

-Xmx जावा रनटाइम पर्यावरण को पास किया जाना चाहिए, न कि निष्पादित जार के लिए।

गलत:

java -jar JavaApplication.jar -Xmx1024m 

सही:

java -Xmx1024m -jar JavaApplication.jar 

अधिक विशेष रूप से, java launcher जरूरतों के रूप में इस प्रयोग की जाने वाली:

जावा [विकल्प] जार फ़ाइल।जार [तर्क]

  • [options] जावा क्रम पर्यावरण
  • [arguments] को पास किया जाता मुख्य कार्य करने के लिए

-Xmx पैरामीटर (अमानक) JVM विकल्प के अंतर्गत आता है, and- पारित कर रहे हैं एक विकल्प - - से पहले सूचीबद्ध होना चाहिए (या कम से कम file.jar)। JVM अन्य उत्तरों में प्रस्तावित मुख्य कार्य को पारित -Xmx तर्क को पहचान नहीं पाएगा।

+0

आपका बहुत बहुत धन्यवाद! –

0

उपयोगकर्ता 13619 9 1> मुझे आपका बुरा विकल्प पसंद है लेकिन मैं इसे तब तक टिप्पणी नहीं कर सकता क्योंकि मैं अभी भी एक नौसिखिया हूं। वैसे भी, मैंने सोचा कि यह थोड़ा संवर्धन योग्य है क्योंकि मुझे लगता है कि इसमें कठोर और stdout पुनर्निर्देशन की कमी है।

String currentPath= MyClass.class 
    .getProtectionDomain() 
    .getCodeSource().getLocation() 
    .toURI().getPath() 
    .replace('/', File.separatorChar).substring(1) ; 
if (args.length == 0 && Runtime.getRuntime().maxMemory()<512*1024*1024) { 
    Process p= Runtime.getRuntime().exec("java -jar -Xmx512M " + currentPath + " restart") ; 
    new StreamGobbler(p.getInputStream()).start() ; 
    new StreamGobbler(p.getErrorStream()).start() ; 
    p.waitFor() ; 
    return ; 
} 

और StreamGobbler स्रोत (शायद इंटरनेट पर कहीं से लिया गया ईमानदार होना और एक छोटे से संशोधित, मुझे याद नहीं):

public class StreamGobbler 
    extends Thread 
{ 
    public StreamGobbler(InputStream is) 
    { 
     this(is, System.out) ; 
    } 

    public StreamGobbler(InputStream is, PrintStream ps) 
    { 
     this.is= is ; 
     this.ps= ps ; 
    } 
    private final InputStream is ; 
    private final PrintStream ps ; 

    @Override 
    public void run() 
    { 
     try { 
      InputStreamReader isr= new InputStreamReader(is) ; 
      BufferedReader br= new BufferedReader(isr) ; 
      for (String line ; (line= br.readLine()) != null ;) { 
       ps.println(line) ; 
      } 
     } 
     catch (IOException ioe) { 
      ioe.printStackTrace() ; 
     } 
    } 
} 
+0

"stderr और stdout redirection" से आपका क्या मतलब है? और स्ट्रीम गोबेलर क्या करता है? –

+0

देर से उत्तर के लिए हैलो और खेद है। मूल समस्या का समाधान करने के लिए मैं "समस्या" को संबोधित करना चाहता था कि यह प्रोग्राम के आउटपुट को छुपा रहा था जब इसे मूल रूप से टर्मिनल से लॉन्च किया गया था (यदि आप एक गैर-अपवाद अपवाद के लिए एक साधारण लॉग या स्टैकट्रैक नहीं देख सकते हैं उदाहरण)। इसलिए मैंने इसे सिस्टम.आउट और System.err से आउटपुट को रीडायरेड जेवीएम से मूल पर रीडायरेक्ट करने के लिए संशोधित किया। छोटी कमी यह है कि मूल कार्यक्रम को दूसरे के अंत तक इंतजार करना पड़ता है, इसलिए पहला व्यक्ति रैम को तुरंत रिलीज़ नहीं करेगा। – user4599075

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