How to set the -Xmx when start running a jar file?

后端 未结 5 1891
青春惊慌失措
青春惊慌失措 2020-12-13 12:36

As we know that we can set -Xmx1024M in window->preferences->java->installed jres->edit->default vm arguments in eclipse

相关标签:
5条回答
  • 2020-12-13 13:16

    Correct way to set Xmx value for jar file at run time is:

    java -Xmx512m -jar Application.jar 
    
    0 讨论(0)
  • 2020-12-13 13:30

    Unfortunately, existing answers are wrong in one crucial point.

    -Xmx must be passed to the Java runtime environment, not to the executed jar.

    Wrong:

    java -jar JavaApplication.jar -Xmx1024m 
    

    Correct:

    java -Xmx1024m -jar JavaApplication.jar 
    

    More specifically, the java launcher needs to be used as follows:

    java [options] -jar file.jar [arguments]

    • [options] are passed to the Java runtime environment
    • [arguments] are passed to the main function

    The -Xmx parameter belongs to the (nonstandard) JVM options, and--being an option--needs to be listed before -jar (or at least before file.jar). The JVM will not recognize an -Xmx argument passed to the main function as proposed in other answers.

    0 讨论(0)
  • 2020-12-13 13:30

    user1361991 > I like your evil option but I cannot comment it since I am still a newbie here. Anyway, I thought it deserved a little enhancement since I find it lacks the stderr and stdout redirection.

    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 ;
    }
    

    and the StreamGobbler source (probably retrieved from somewhere on the Internet to be honest and modified a little, I can't remember):

    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 讨论(0)
  • 2020-12-13 13:34

    try java -Xmx1024m filename.

    I found this on StackOverflow What does Java option -Xmx stand for? and use it when I start Netbeans for instance.

    use it like this

    java -Xmx1024m -jar JavaApplication.jar
    

    info: -Xmxn Specify the maximum size, in bytes, of the memory allocation pool. This value must be a multiple of 1024 greater than 2MB. Append the letter k or K to indicate kilobytes, or m or M to indicate megabytes. The default value is 64MB. The upper limit for this value will be approximately 4000m on Solaris 7 and Solaris 8 SPARC platforms and 2000m on Solaris 2.6 and x86 platforms, minus overhead amounts.

    0 讨论(0)
  • 2020-12-13 13:35

    Three methods:

    • Command Line:
      • Instruct your users to run your application using "java -jar SampleJavaApp.jar -Xmx1024m"
    • Java Control Panel:
      • Instruct your users to dedicate more memory to java by default: Win7 guide
    • Restart your jar with the appropriate Xmx value.

    The last option is "evil" but doesn't require any extra effort from your users. Here's a sample block of code:

    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 -Xmx1024m -jar "+currentPath+" restart");
            return;
        }
    }
    
    0 讨论(0)
提交回复
热议问题