it-swarm.com.ru

Как установить -Xmx при запуске jar-файла?

Поскольку мы знаем, что мы можем установить -Xmx1024M в window->preferences->Java->installed jres->edit->default vm arguments в Eclipse . Но когда я упаковываю этот проект в исполняемый файл jar, как я могу установить -Xmx1024M при запуске jar через Java -jar A.jar?

Большое спасибо!

28
Judking

К сожалению, существующие ответы неверны в одном важном моменте. 

-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 не распознает аргумент -Xmx, переданный главной функции, как предложено в других ответах.

89
Philipp Merkle

Три метода:

  • Командная строка:
    • Попросите пользователей запускать ваше приложение, используя «Java -jar SampleJavaApp.jar -Xmx1024m»
  • Панель управления Java:
    • Поручите своим пользователям выделять больше памяти для Java по умолчанию: Руководство по Win7
  • Перезапустите банку с соответствующим значением Xmx.

Последний вариант «злой», но не требует никаких дополнительных усилий от ваших пользователей. Вот пример блока кода:

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

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