我们知道我们可以在 eclipse 中的-Xmx1024M
中设置window->preferences->java->installed jres->edit->default vm arguments
。但是,当我将此项目打包到一个可运行的jar文件中时,如何通过-Xmx1024M
运行jar时设置java -jar A.jar
?
非常感谢!
答案 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)
三种方法:
最后一个选项是" 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米,减去开销金额。