As we know that we can set -Xmx1024M
in window->preferences->java->installed jres->edit->default vm arguments
in eclipse
Correct way to set Xmx value for jar file at run time is:
java -Xmx512m -jar Application.jar
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 functionThe -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.
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() ;
}
}
}
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.
Three methods:
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;
}
}