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

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

非常感谢!

尝试java -Xmx1024m文件名。 我在StackOverflow上发现了这个Java选项-Xmx代表什么? 例如,当我启动Netbeans时使用它。

像这样使用java -jar JavaApplication.jar -Xmx1024m

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

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

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

错误:

 java -jar JavaApplication.jar -Xmx1024m 

正确:

 java -Xmx1024m -jar JavaApplication.jar 

更具体地说, java启动程序需要使用如下:

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

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

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

三种方法:

  • 命令行:
    • 指示您的用户使用“java -jar SampleJavaApp.jar -Xmx1024m”运行您的应用程序
  • Java控制面板:
    • 默认情况下,指示您的用户将更多内存专用于Java: Win7指南
  • 使用适当的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 -jar -Xmx1024m "+currentPath+" restart"); return; } } 

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源(可能从互联网上的某个地方检索到诚实和修改一点,我不记得了):

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