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

As we know that we can set -Xmx1024M in window->preferences->java->installed jres->edit->default vm arguments in eclipse. But when I package this project into a runnable jar file, how can I set the -Xmx1024M when running the jar via java -jar A.jar?

Thanks a lot!



Solution 1:[1]

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.

Solution 2:[2]

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.

Solution 3:[3]

Three methods:

  • Command Line:
  • Instruct your users to run your application using "java -Xmx1024m -jar SampleJavaApp.jar"
  • 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;
    }
}

Solution 4:[4]

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

java -Xmx512m -jar Application.jar 

Solution 5:[5]

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

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Kuzeko
Solution 2
Solution 3
Solution 4 venkatesh akkisetty
Solution 5 user4599075