如何在开始运行jar文件时设置-Xmx?

时间:2013-11-22 16:05:22

标签: java jar

我们知道我们可以在 eclipse 中的-Xmx1024M中设置window->preferences->java->installed jres->edit->default vm arguments。但是,当我将此项目打包到一个可运行的jar文件中时,如何通过-Xmx1024M运行jar时设置java -jar A.jar

非常感谢!

5 个答案:

答案 0 :(得分:102)

不幸的是,现有答案在一个关键点上是错误的。

必须将

-Xmx传递给Java运行时环境,而不是传递给执行的jar。

错:

java -jar JavaApplication.jar -Xmx1024m 

正确:

java -Xmx1024m -jar JavaApplication.jar 

更具体地说,java launcher需要按如下方式使用:

  

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

  • [options]被传递到Java运行时环境
  • [arguments]传递给主函数

-Xmx参数属于(非标准)JVM选项,并且 - 作为选项 - 需要在-jar之前列出(或者至少在file.jar之前)。 JVM将无法识别传递给main函数的-Xmx参数,如其他答案中所建议的那样。

答案 1 :(得分:6)

三种方法:

  • 命令行:
    • 指示您的用户使用" java -jar SampleJavaApp.jar -Xmx1024m"
    • 运行您的应用程序
  • Java控制面板:
    • 默认情况下,指示您的用户为java添加更多内存:Win7 guide
  • 使用适当的Xmx值重新启动jar。

最后一个选项是" evil"但不要求用户付出额外的努力。这是一个示例代码块:

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

答案 2 :(得分:3)

在运行时为jar文件设置Xmx值的正确方法是:

java -Xmx512m -jar Application.jar 

答案 3 :(得分:0)

user1361991&gt;我喜欢你的邪恶选择但我无法发表评论,因为我还是新手。无论如何,我认为它应该得到一点改进,因为我发现它缺少stderr和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() ;
       }
    }
}

答案 4 :(得分:-8)

尝试java -Xmx1024m文件名。我在StackOverflow What does Java option -Xmx stand for?上找到了这个,并在我启动Netbeans时使用它。

java -jar JavaApplication.jar -Xmx1024m

一样使用它

信息: -Xmxn 指定内存分配池的最大大小(以字节为单位)。此值必须是1024的倍数,大于2MB。附加字母k或K表示千字节,或m或M表示兆字节。默认值为64MB。此值的上限在Solaris 7和Solaris 8 SPARC平台上约为4000米,在Solaris 2.6和x86平台上为2000米,减去开销金额。