Как я могу позволить пользователю легко выбирать, сколько памяти выделять в приложении Java Swing? - PullRequest
3 голосов
/ 09 сентября 2010

У нас есть приложение Swing, которое обрабатывает относительно большие объемы данных. Например, в настоящее время мы обрабатываем файлы CSV с миллионами строк данных. По причинам производительности и простоты мы просто храним все данные в памяти. Однако разные пользователи будут иметь разные объемы данных, которые им нужно обрабатывать, а также разные объемы оперативной памяти. Разумеется, при создании установщика нам необходимо указать размер кучи. Есть ли простой способ разрешить пользователю указывать кучу без необходимости вручную редактировать конфигурацию или файл .bat? Я предполагаю, что не всем пользователям будет удобно с этим.

Я видел один пример, где приложение указало три разных ярлыка, каждый с разным объемом памяти. Это может сработать, но я бы хотел вариант, который был бы более гибким. Затем пользователь может просто выбрать тот, который будет работать лучше для него.

Ответы [ 5 ]

6 голосов
/ 09 сентября 2010

Я рекомендую иметь что-то похожее на IntelliJ. Он вызывает диалоговое окно конфигурации, когда возникает исключение OutOfMemoryException. Это диалоговое окно позволяет пользователю настроить размер кучи и сохранить его на idea.exe.vmoptions. Вам нужно будет передать содержимое файла в команду запуска java / javaw или иметь одну загрузочную программу Java и запустить реальную.

Действительно классный вариант - предложить размер памяти, основанный на размере данных. У пользователя действительно нет возможности узнать, сколько памяти требуется вашей программе, поэтому любые рекомендации, которые вы можете дать при выборе значения, очень им помогут.

Для поддержки этого решения крайне важно, чтобы вы ожидали и обрабатывали исключения OutOfMemoryException таким образом, чтобы избежать повреждения данных!

1 голос
/ 21 сентября 2010

перехватить исключение вне памяти, запустить пользовательский диалог для установки предела памяти, передать это значение потоку, использующему Runtime.exec (), перезапустить приложение с помощью jav -cp lib jar vmoptions, который запустит новый jvm с памятью размер указан для user.sample:

 Runtime.getRuntime().exec("java -cp
 -Xms2560m -Xmx2560m -XX:NewSize=32M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewG launch.jar");
1 голос
/ 16 сентября 2010

Основная идея будет такой:

  • Запустите ваше основное приложение через скрипт оболочки, подобный следующему:
@echo off
setlocal
REM This reads the JVM command line options from a user configuration file
for /f %x in (%HOMEDRIVE%%HOMEPATH%\myapp.config) do set JVM_OPTIONS=%x
REM Important: call javaw and not java
javaw -jar myApp.jar %JVM_OPTIONS%
endlocal
  • В вашем приложении Swing есть пункт меню Настройки памяти ... . Когда пользователь выберет это, проанализируйте файл конфигурации пользователя и заполните диалоговое окно настроек, чтобы пользователь мог изменить все, что ему подходит. Когда пользователь нажимает Применить или ОК , перезаписать файл конфигурации пользователя параметрами командной строки в соответствии с выбранными пользователем настройками (в вашем случае, -Xmx) и показать сообщение с надписью что-то вроде Перезапустите приложение, чтобы применить эти настройки .
1 голос
/ 09 сентября 2010

Я бы написал короткий файл startup.jar с очень небольшим количеством фиксированных настроек памяти, начиная со скрипта.В свою очередь, startup.jar запустит целевое приложение с Runtime.exec () и настроенными параметрами.

В итоге вы получите 2 экземпляра JVM, которые занимают больше памяти, чем только одна JVM.Но если ваше приложение все равно будет тратить много памяти, первая JVM не имеет значения.

0 голосов
/ 09 сентября 2010

Вы не упомянули, как вы создаете установщик. Если вы еще не используете его, я предлагаю использовать NSIS . Документация хороша и имеет плагин для затмения. Вы можете использовать мастер для создания файла nsi, а затем отредактировать его вручную для параметров, недоступных в мастере.

Что касается вашего текущего требования, просто добавьте страницу в установщик для параметров и, в зависимости от выбранного параметра, скопируйте правильный файл системных свойств в папку пользовательских настроек, которую вы можете использовать для запуска вашей программы. Я не уверен, если это возможно, но я думаю, что после установки программы пользователь может перезапустить программу установки и выбрать другую опцию.

...