【问题标题】:How to set the -Xmx when start running a jar file?开始运行jar文件时如何设置-Xmx?
【发布时间】:2013-12-07 14:17:38
【问题描述】:

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

非常感谢!

【问题讨论】:

  • java -jar -Xmx1024M A.jar

标签: java jar


【解决方案1】:

试试java -Xmx1024m文件名。

我在 StackOverflow What does Java option -Xmx stand for? 上找到了它,并在我启动 Netbeans 时使用它。

像这样使用它

java -Xmx1024m -jar JavaApplication.jar

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

【讨论】:

  • 请注意,在您提出的解决方案中,-Xmx1024m 被传递给执行的 jar 文件,而不是按预期传递给 JVM。详情见我的回答:stackoverflow.com/a/42207984/7492402
  • 上面的答案是错误的——所有 JVM 参数都应该在 java 之后传递:即 java -Xmx4G -Xms1G .... your_jar.jar
  • 以上是错误的,请参阅@PhilippMerkle 的以下答案
  • 伙计,我不明白谷歌的算法是如何工作的,但得到的答案让我浪费了很多时间
【解决方案2】:

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

java -Xmx512m -jar Application.jar 

【讨论】:

    【解决方案3】:

    三种方法:

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

    最后一个选项是“邪恶”,但不需要用户付出任何额外的努力。这是一个示例代码块:

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

    【讨论】:

    • 最佳解决方案!谢谢
    【解决方案4】:

    user1361991 > 我喜欢你的邪恶选项,但我无法评论它,因为我还是这里的新手。无论如何,我认为它值得一点改进,因为我发现它缺少 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 的源代码(老实说,可能是从 Internet 上的某个地方检索到的并稍作修改,我不记得了):

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

    【讨论】:

    • “stderr 和 stdout 重定向”是什么意思?流 gbbler 是做什么的?
    • 您好,很抱歉回答迟了。我想用原始的邪恶解决方案解决的“问题”是它在最初从终端启动时隐藏了程序的输出(如果有未捕获的异常,您将看不到简单的日志或堆栈跟踪)例子)。因此,我对其进行了修改,以将 System.out 和 System.err 的输出从重新启动的 JVM 重定向到原始 JVM。小缺点是原程序必须等待第二个结束,所以第一个不会立即释放 RAM。
    【解决方案5】:

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

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

    错误:

    java -jar JavaApplication.jar -Xmx1024m 
    

    正确:

    java -Xmx1024m -jar JavaApplication.jar 
    

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

    java [选项] -jar file.jar [参数]

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

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

    【讨论】:

    • 粗心大意的陷阱 - 不是搞笑,但-Xmx 参数语法区分大小写。我一直在拼命想弄清楚为什么我不能通过修改快捷方式目标属性来让它工作,这就是原因。
    • 我已经尝试了这两种方法,并使用 jvsualvm 查看 jvm args,它在两种情况下都将 JVM 参数显示为 -Xmx2048m。关于为什么会发生这种情况的任何线索?
    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 2015-09-05
    相关资源
    最近更新 更多