Вопрос по java – Могу ли я установить максимальный размер кучи Java для запуска из файла JAR?

35

Я запускаю файл java jar, который часто требует больше, чем максимальный размер кучи 64 МБ по умолчанию. Для этого приложения достаточно 256 МБ кучи. Есть ли способ указать (в манифесте может быть?) Всегда использовать максимальный размер кучи 256 МБ при запуске jar? (Более конкретные подробности ниже, если это необходимо.)

Это приложение для командной строки, которое я написал на Java, которое выполняет некоторые манипуляции с изображениями. На изображениях с высоким разрешением (около 12 мегапикселей и выше, что не редкость) я получаю ошибку OutOfMemoryError.

В настоящее время я запускаю приложение из файла JAR, т.е.

java -jar MyApp.jar params...

Я могу избежать OutOfMemoryError, указав максимальный размер кучи 256 МБ в командной строке, т.е.

java -Xmx256m -jar MyApp.jar params...

Однако я не хочу указывать это, поскольку знаю, что 256 МБ достаточно даже для изображений с высоким разрешением. Я хотел бы, чтобы эта информация была сохранена в файле jar. Это возможно?

Короткий ответ - нет, вы не можете указать аргументы JVM для JAR. Смотрите связанный вопросstackoverflow.com/questions/193483 Steve Kuo

Ваш Ответ

8   ответов
24

Напишите пакетный или командный скрипт, содержащий следующую строку. Поместите в папку, где хранится MyApp.jar.

java -Xmx256M -jar MyApp.jar

После этого всегда открывайте этот пакетный файл / файл сценария, чтобы запустить файл JAR. Хотя, это не будет включать спецификацию размера виртуальной памяти в сам файл jar. Но, это может преодолеть проблему, чтобы часто писать одну и ту же команду в командной строке.

На самом деле это отвечает на вопрос. Хотя четыре года уже поздно.
1

Видимо это работает на Ubuntu

> export _JAVA_OPTIONS="-Xmx1g"

java -jar jconsole.jar & Picked up _JAVA_OPTIONS: -Xmx1g

Или JAVA_TOOL_OPTIONS = & quot; -Xmx1g & quot;
3

Это не очень хорошо, но вы можете иметь его в качестве исполняемого JAR-файла, а затем в его основном файле выполнить его через командную строку как поток, не являющийся демоном, с соответствующими параметрами, сохраненными в файле свойств или вычисленными или что угодно, затем выйдите из оригинала. Вы могли бы даже заставить его выполнить банку с другим & quot; реальным & quot; точка входа, которая ожидает эти параметры.

13

Вы также можете использовать обертку, какlaunch4j который сделает исполняемый файл для большинства ОС: es и позволит вам указать параметры виртуальной машины.

но вам может понадобиться Mac, чтобы сделать это
мне это нравится, и это избавило бы от "java -jar" часть командной строки тоже. Kip
на самом деле, это не так здорово, как я думал. У меня нет Mac, но я хотел бы создать исполняемую оболочку Mac для моего JAR-файла с моего компьютера с Windows. похоже, это приложение не совсем так ... Kip
Я использую jarbundler для моих приложений Mac
2

YES! Вам нужно написать небольшую стартовую программу - я написал небольшую, в основном, кросс-платформенную (пути должны быть хорошими) для этого - см. Ниже. Это было проверено на Windows / Ubuntu / Mac OS X.

Статья в блоге Silent Development об увеличении размера исполняемой кучи Java-файлов

0

Есть много способов сделать это:

Вы можете иметь другой файл Jar, который запускает ваш основной Jar.

Или имейте командный файл, который запустит вашу банку. Но будьте осторожны, если при загрузке с скажем net пользователь должен будет установить разрешения для запуска сценария

Сборка установщика. На Mac с помощью компоновщика Oracle Java App для Java 7, компоновщик Apple App для Java 6 создает файл .app. Вы по-прежнему не можете распространять его, так как необходимые разрешения не будут установлены. Создайте DMG для файла приложения. Это может быть использовано для распространения. Аналогичный установщик для Windows

Третий метод будет лучшим, так как вы можете хорошо упаковать зависимости, установить все аргументы JVM и т. Д.

4

У меня была похожая потребность, и я подумал, что смогу указать это в манифесте, как предложено выше. Однако это невозможно. Мое решение аналогично тому, что предложил Алекс выше, однако, я сделал так, чтобы основной метод использовал Java ProcessBuilder для запуска другого процесса Java. При запуске другого процесса вы можете указать максимальный объем памяти для нового процесса. По сути, один Java-процесс запускает другой. Это немного подозрительно, но работает, и все же позволяет запускать ваше приложение, дважды щелкнув файл Jar, что, как я знаю, вы хотите сделать. Посмотрите в ProcessBuilder.

спасибо, это хорошая идея. я должен разобраться в этом! Kip
3

Найденныйответ в гугле

Он говорит «нет» для файла JAR, «да» в JavaWeb Start и что вы должны сделать это в своем (возможно, системном) сценарии / приложении запуска / оболочки.

Или JAVA_TOOL_OPTIONS = & quot; -Xmx1g & quot;

Похожие вопросы