Подтвердить что ты не робот

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

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


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

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

java -jar MyApp.jar params...

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

java -Xmx256M -jar MyApp.jar

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

Ответ 3

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

Ответ 4

Нашел ответ в google.

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

Ответ 5

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

Ответ 6

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

Статья Silent Development Blog об увеличении исполняемой java-кучи Java

Ответ 7

По-видимому, это работает на Ubuntu

> export _JAVA_OPTIONS="-Xmx1g"

java -jar jconsole.jar & Поднято _JAVA_OPTIONS: -Xmx1g

Ответ 8

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

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

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

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

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