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

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

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

Ответ 1

попробуйте java -Xmx1024m имя файла. Я нашел это в StackOverflow. Что означает опция Java -Xmx? и использовать его, когда я запускаю Netbeans, например.

используйте его как этот java -Xmx1024m -jar JavaApplication.jar

info: -Xmxn Укажите максимальный размер в байтах пула выделения памяти. Это значение должно быть кратно 1024 больше 2 МБ. Добавьте букву k или K для обозначения килобайт, или m или M для обозначения мегабайт. Значение по умолчанию составляет 64 МБ. Верхний предел для этого значения будет приблизительно 4000 м для платформ Solaris 7 и Solaris 8 SPARC и 2000 м для платформ Solaris 2.6 и x86 за вычетом накладных расходов.

Ответ 2

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

-Xmx должен быть передан среде выполнения Java, а не исполняемому банку.

Неправильно:

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

Ответ 3

Три метода:

  • Командная строка:
    • Попросите пользователей запускать ваше приложение, используя "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 -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 (возможно, откуда-то из Интернета, чтобы быть честным и немного измененным, я не помню):

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