Как я могу позволить пользователю легко выбрать, сколько памяти выделить в приложении Java Swing?
У нас есть приложение Swing, которое обрабатывает относительно большие объемы данных. Например, в настоящее время мы обрабатываем CSV-файлы с миллионами строк данных. Из соображений производительности и простоты мы просто храним все данные в памяти. Однако разные пользователи будут иметь разные объемы данных, которые им нужно обработать, а также разные объемы оперативной памяти. При создании установщика, конечно, нам нужно указать размер кучи. Есть ли простой способ позволить пользователю указать кучу без них нужно вручную редактировать конфигурацию или .файл летучей мыши? Я предполагаю, что не все пользователи будут довольны этим.
Я видел один пример, когда приложение указывало три разных ярлыка, каждый с разным объемом памяти. Это может сработать, но я хотел бы иметь более гибкий вариант. Пользователь может просто выбрать тот, который будет работать лучше для него.
5 ответов:
Я рекомендую иметь что-то похожее на IntelliJ. Он вызывает диалоговое окно конфигурации, когда происходит исключение OutOfMemoryException. Это диалоговое окно позволяет пользователю настроить размер кучи и сохраняет его в
idea.exe.vmoptions
. Вам нужно будет вложить содержимое файла в команду запуска java / javaw или иметь одну программу Java bootstrap и запустить настоящую.Действительно классный вариант - предложить размер памяти, основанный на размере данных. Пользователь действительно не имеет возможности узнать, сколько память, необходимая вашей программе, поэтому любое руководство, которое вы можете предоставить при выборе значения, очень им поможет.
Для поддержки этого решения чрезвычайно важно, чтобы вы ожидали и обрабатывали OutOfMemoryExceptions таким образом, чтобы избежать повреждения данных!
Я бы написал короткий стартап.jar с очень небольшим количеством фиксированных настроек памяти, начиная со скрипта. В свою очередь стартап.банки начнут целевого приложения во время выполнения.exec () и скорректированные параметры.
В итоге вы получаете 2 экземпляра JVM, которые тратят больше памяти, чем только один JVM. Но если ваше приложение потратит много памяти, то в любом случае первый JVM не имеет значения.
Основная идея будет такой:
- запустите основное приложение с помощью сценария оболочки, аналогичного этому:
@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 выберите пункт меню настройки памяти.... Когда пользователь выберет это, проанализируйте файл конфигурации пользователя и заполните диалоговое окно настроек, чтобы пользователь мог изменить все, что ему подходит. Когда пользователь нажимает Apply или Ok, перезапишите файл конфигурации пользователя с помощью командной строки параметры в соответствии с выбранными пользователем настройками (в вашем случае
-Xmx
), и показать сообщение, говорящее что-то вроде перезагрузите приложение, чтобы применить эти настройки.
Перехватите исключение outofmemory, откройте диалоговое окно swing user, чтобы установить ограничение памяти, передайте это значение потоку, использующему среду выполнения.exec() перезапустит приложение, используя jar vmoptions java-cp lib, который запустит новый jvm с размером памяти, указанным пользователю.Пример:
Runtime.getRuntime().exec("java -cp -Xms2560m -Xmx2560m -XX:NewSize=32M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewG launch.jar");
Вы не упомянули, как вы создаете установщик. Если вы еще не используете его, я предлагаю использовать NSIS. Документация хорошая, и в ней есть плагин для eclipse. С помощью мастера можно создать файл nsi, а затем вручную отредактировать его для параметров, недоступных с помощью мастера.
Что касается вашего текущего требования, просто добавьте страницу в установщик для параметров и на основе выбранного параметра скопируйте правильный файл системных свойств пользователю папка настроек, которую можно использовать для запуска программы. Я не уверен, что это возможно, но я думаю, что после установки программы пользователь может повторно запустить программу установки и выбрать другой вариант.