Java Blog
Если вы являетесь Java-разработчиком или администратором Java приложения, вам поможет в работе знание того, что означают опции JVM, а также их важность и как они влияют на ваше приложение.
Обзор параметров JVM
Если говорить о параметрах JVM, то есть три типа параметров, которые вы можете включить в JVM: стандартные, нестандартные и расширенные параметры. Если вы используете расширенную опцию, вы всегда используете опцию с -XX. Точно так же, если вы применяете нестандартную опцию, вы используете -X. Стандартные опции ничего не добавляют к опции.
Какие параметры JVM используются вашим приложением?
Если приложение работает в Linux, вы можете использовать
ps -ef | grep java
для идентификации процесса Java и просмотра параметров JVM, напечатанных как аргументы процесса. Если в системе выполняется более одного Java-процесса, вам может потребоваться использовать ключевое слово, уникальное для вашего Java-приложения.
Если ваш аргумент слишком длинный, попробуйте использовать
ps -auxww | grep java
так как эта команда также покажет длинный список аргументов.
Имея список флагов JVM, вы можете получить представление о поведении любого Java-приложения, например Tomcat.
1. Размер кучи (heap) Java
-Xms - установить начальный размер кучи Java -Xmx - установить максимальный размер кучи Java -Xss - установить размер стека Java-потока (java thread stack)
-Xms — эта опция определяет начальный размер кучи для JVM, например, Xms2048m, что означает, что начальный размер кучи JVM составляет около 2 ГБ. Итак, когда JVM запускается, куча памяти будет очень большой. Это делается для предотвращения изменения размера во время запуска и увеличения времени запуска JVM.
-Xmx — этот параметр определяет максимальный размер кучи JVM, например, Xmx2048m, что означает, что максимальный размер кучи JVM будет составлять только 2 ГБ.
По сути, вы всегда будете иметь -Xms и -Xmx вместе.
2. Задание процента кучи
-XX:MaxHeapFreeRatio — устанавливает максимальный процент свободного пространства кучи после GC (Garbage Collecting, сборки мусора), чтобы избежать сжатия.
-XX:MinHeapFreeRatio — устанавливает минимальный процент свободного пространства кучи после GC, чтобы избежать расширения; для мониторинга использования кучи вы можете использовать JConsole.
3. Включить обмен данными класса
Укажите опцию Xshareclasses, чтобы включить общий доступ к данным класса в общем кэше классов. JVM подключается к существующему кэшу или создает кэш, если он не существует. У вас может быть несколько кэшей, и вы можете указать правильный кэш, добавив подопцию в опцию -Xshareclasses.
4. PermGen размер
Ранее параметры JVM определяли размер кучи памяти, но -XX:PermSize — для определения размера пространства PermGen, в котором сохраняются пул строк и метаданные класса. Этот параметр особенно эффективен для веб-сервера, такого как Tomcat, который часто загружает классы веб-приложения во время развертывания.
Кстати, стоит понимать, что пространство PermGen занято Metaspace в Java 8, и этот параметр неприменим, если вы работаете с JRE 8 JVM.
5. Распечатать GC (Garbage Collector)
-verbose:gc - регистрирует, запуски сборщика мусора и сколько времени они занимают. -XX:+PrintGCDetails - включает в себя данные из -verbose:gc, но также добавляет информацию о размере нового поколения и более точных временных параметрах. -XX:-PrintGCTimeStamps - печатать метки времени при сборке мусора.
Эти параметры JVM используются для включения ведения журнала сбора мусора, что очень эффективно для чувствительной к задержке операции. Обычно работа идет в системах, где ведется поиск задержек в микросекундах, но большая сборка мусора может длиться несколько миллисекунд.
Эта удобная опция подскажет вам важную статистику GC. Станет известно, будет ли это большая или небольшая сборка мусора, какой тип сборщика мусора применяется, как часто восстанавливается память, сколько времени он занимал и т.д.
6. Обработка ошибки «OutOfMemory»
Чтобы вызвать дамп кучи при нехватке памяти, вы можете использовать -XX:+HeapDumpOnOutOfMemoryError
Эта опция JVM создает дамп стека, когда ваша JVM завершается с ошибкой OutOfMemory. Там нет никаких затрат, если ошибка OutOfMemory действительно не происходит. Этот флаг является обязательным для производственных систем, поскольку обычно это единственный способ глубоко определить проблему.
Дамп кучи будет установлен в «текущем каталоге» JVM по умолчанию. Если вы хотите создать дамп кучи в определенном каталоге, запустите
-XX:HeapDumpPath=[путь к каталогу дампа кучи] -XX:+UseGCOverheadLimit -XX:OnOutOfMemoryError="; "
Файл дампа кучи может быть огромного размера, вплоть до гигабайт, поэтому убедитесь, что целевая файловая система обеспечивает достаточную емкость.
Если мы хотим перезапустить сервер сразу после возникновения нехватки памяти, мы можем установить этот параметр с той же целью:
XX:OnOutOfMemoryError="shutdown -r"
7. Trace загрузки классов и выгрузки
-XX:+TraceClassLoading и -XX:+TraceClassUnloading — это две опции JVM, которые мы используем для печати информации журналов всякий раз, когда классы загружаются в JVM или выгружаются из JVM. Эти флаги JVM полезны, если у вас есть какой-либо тип утечки памяти, связанный с загрузчиком классов и есть подозрение, что классы не выгружаются или не собирается мусор.
8. Java classpath (путь к классу)
Говоря о Java Classpath а затем -Xbootclasspath определяет записи classpath, которые мы хотим загрузить без проверки. JVM проверяет все классы, которые она загружает, чтобы убедиться, что она не пытается разыменовать объект с помощью int, выталкивает дополнительные записи из стека или выталкивает слишком много, и так далее.
Помещение class в bootclasspath также снижает стоимость, но его следует использовать только тогда, когда вы знаете, что классы проверялись много раз раньше. В JRuby это сократило время запуска вдвое и более для простого скрипта.
9. Профилирование
Java профилирование — это процесс мониторинга различных параметров уровней JVM, таких как выполнение методов, выполнение потоков, сборка мусора и создание объектов. Java профилирование обеспечивает более точное представление о выполнении целевого приложения и использовании его ресурсов.
-Xprof -Xrunhprof
10. 64-битная среда
В среде ОС, в которой установлены 32- и 64-разрядные пакеты, JVM автоматически выбирает 32-разрядные пакеты среды по умолчанию.
Если мы хотим установить 64-битную среду вручную, мы можем сделать это с помощью параметра -d . OS bit может быть 32 или 64.
Как правильно редактировать использование памяти Java
-Xmn определяет объём занятой памяти до которой сборщик мусора должен освобождать память (если это возможно);
-Xms определяет размер начальной выделенной памяти под объекты;
-Xmx определяет максимальный размер памяти, выше которого приложение не задействует;
Правило настроек запуска:
А также:
Xms примерно равно Xmx ;
Xmn примерно половина от Xms ;
Java «Heap» is a continous memory region where all Objects data will be stored (by data, we mean instance of class, primitive and references). It’s a big part of the process heap. It can be configured using the following parameters:
-Xmx : max heap size (ex: -Xmx1024);
-Xms : min heap size. Having -Xms = 1.8GB (32bit) can be bad, because you don’t let memory for anything else;
-Xmn : the size of the heap for the young generation.
Young generation represents all the objects which have a short life of time. Young generation objects are in a specific location into the heap, where the garbage collector will pass often. All new objects are created into the young generation region (called «eden»). When an object survive is still «alive» after more than 2-3 gc cleaning, then it will be swap has an «old generation» : they are «survivor» .
Good size is 33%
-XX:NewRatio : the same as Wmn, but using a % (dynamic fs static -Xmn option);
-XX:NewRatio=3 means that the ratio between the old and young generation is 1:3;
-XX:NewSize — Size of the young generation at JVM init. Calculated automatically if you specify -XX:NewRatio ;
-XX:MaxNewSize — The largest size the young generation can grow to (unlimited if this value is not specified at command line);
-XX:SurvivorRatio : «old generation» called tenured generation, ratio, in %. For example, -XX:SurvivorRatio=6 sets the ratio between each survivor space and eden to be 1:6 (eden is where new objects are created);
-XX:MinHeapFreeRatio: default is 40%. JVM will allocate memory to always have as minimum 40% of free memory. When -Xmx = -Xms, it’s useless;
-XX:MaxHeapFreeRatio: default is 70%. The same as Min, to avoid unecessary memory allocation.
Настройка JVM и HTTPS в Tomcat
Необходимо создать файл setenv в CATALINA_BASE/bin с нужным расширением, в зависимости от ОС: linux — .sh , windows — .bat .
Добавить в файл:
export JAVA_OPTS=»» для linux
set JAVA_OPTS= для windows
Добавить в JAVA_OPTS необходимые параметры:
- для установки JVM в режим сервера:
- для настройки памяти:
В общем виде это выглядит так:
для windows — setenv.bat:
set JAVA_OPTS=-server -Xmx2g -Xms2g -Dfile.encoding=UTF-8 -XX:MaxPermSize=768m
для linux — setenv.sh:
export JAVA_OPTS=»-server -Xmx2g -Xms2g -Dfile.encoding=UTF-8 -XX:MaxPermSize=768m»
Настройка HTTPS в Tomcat
Настройка HTTPS в Tomcat:
Создайте хранилище ключей при помощи библиотеки keytool, которая обычно входит в JDK:
Для этого перейдите в каталог %JAVA_HOME%/bin
keytool -genkey -alias tomcat -keyalg RSA
Введите пароль changeit
Заполните данными ssl хранилище
В пункте имя сайте нужно указать адрес сайта!
Например localhost или www.вашСайт.org
Введите пароль для tomcat: changeit
Подтвердите ввод данных нажатием клавиши Y затем Enter. Ключ должен сохраниться в документах и иметь имя .keystore
Скопируйте ключ в каталог %TOMCAT_HOME%/conf/
Откройте для редактирования файл %TOMCAT_HOME%/conf/sever.xml
В случае использования Native APR замените на
Java opts как правильно выставить параметры
2. Если используется база данных MSSQL, см. раздел Использование MSSQL в качестве поставщика хранилища данных . Выполните шаги, описанные в этом разделе, чтобы настроить базу данных, и вы будете снова отсылаться к этому разделу.
5. Убедитесь, что переменная среды Java сконфигурирована правильно:
1. Найдите папку установки Java и скопируйте путь. По умолчанию путь к папке равен C:\Program Files\Java\jdk_ <номер версии>.номер>
2. Из меню «Пуск» в Windows перейдите к Дополнительным параметрам системы . Путь к этим свойствам будет изменяться в зависимости от версии Windows. Например, для Windows 10 выполните поиск Переменные среды и выберите Изменить системные переменные среды .
3. Щелкните Переменные среды .
4. В разделе Системные переменные щелкните Создать .
5. В поле Имя переменной введите JAVA_HOME .
6. В поле Значение переменной введите путь к установке Java, как определено на шаге a.
7. Нажмите кнопку ОК .
7. Посетите веб-сайт Tomcat , чтобы загрузить файл 32-bit/64-bit Windows Service Installer (pgp, sha1, sha512) .

8. Запустите Apache Tomcat Setup Wizard. Нажмите кнопку Next .

9. Щелкните I Agree .

10. В разделе Choose Components используйте настройки по умолчанию. Нажмите кнопку Next .

11. В поле HTTP/1.1 Connector Port введите 80 (или другой доступный порт).
12. В полях Учетные данные администратора Tomcat (Tomcat Administrator Login) необходимо ввести имя пользователя Tomcat и уникальный безопасный пароль для администрирования Tomcat. В ThingWorx это необходимое действие, а не факультативное.
13. Нажмите кнопку Next .

14. Нажмите кнопку Next .

15. Щелкните Install .

16. Нажмите кнопку Finish .

17. Запустите Tomcat. Щелкните Configure Tomcat . В окне Configure Tomcat щелкните вкладку Java .
18. В поле Java Options добавьте следующий код в конце поля опций:
-Dserver -Dd64
-XX:+UseG1GC
-Dfile.encoding=UTF-8
-Djava.library.path= \webapps\Thingworx\WEB-INF\extensions
Пример для Djava.library.path :
-Djava.library.path=C:\Program Files\Apache Software Foundation\Tomcat8.5\webapps\
Thingworx\WEB-INF\extensions
При первой установке ThingWorx Platform необходимо задать опцию Java -Duser.timezone=UTC , которая не распознает переход на летнее время UTC . Задание этой опции предотвращает перезапись данных при смене летнего времени. В данный момент существующие клиенты не должны изменять эту настройку.

20. Нажмите кнопку ОК .
21. В расположении установки Tomcat откройте файл conf/web.xml . Замените страницу с ошибками по умолчанию (значение по умолчанию: stacktrace), добавив в файл web.xml следующие данные. Поместите следующий код в тег web-app (после тега welcome-file-list ). В правильно сконфигурированном веб-приложении это значение по умолчанию будет переопределено в файле webapps/APP_NAME/WEB-INF/web.xml , поэтому проблемы не возникнут.
22. В расположении установки Tomcat откройте файл conf/server.xml . Добавьте внутрь тегов следующее:
По соображениям безопасности критически важно отключить соединитель AJP, если это еще не сделано, выполнив следующий шаг.
23. В расположении установки Tomcat откройте файл conf/server.xml и выполните поиск следующей строки. Если она найдена, закомментируйте ее и сохраните файл:
В Apache Tomcat 9.0 и более поздних версиях для атрибута rejectIllegalHeader по умолчанию задано значение true. Изменение вручную файла conf/web.xml , чтобы задать значение false для этого атрибута, не рекомендуется или поддерживается PTC.
24. Удалите все веб-приложения Tomcat, расположенные в папке /<путь_к_tomcat>/webapps/ . Удаление этих приложений предотвращает нежелательный доступ к Tomcat, особенно в контексте, который позволит пользователям просматривать файлы cookie других пользователей.путь_к_tomcat>
25. Если для приложения требуется специальный набор шифров, обратитесь к следующей документации для получения информации о конфигурации:
27. (НЕОБЯЗАТЕЛЬНЫЙ ШАГ) Чтобы увеличить значения по умолчанию настроек кэша, влияющих на кэширование статических файлов, добавьте следующую строку, заключенную в теги , в файл $CATALINA_HOME/conf/context.xml :
Увеличение этой настройки улучшает производительность и предотвращает появление следующего сообщения в Tomcat:
WARNING: Unable to add the resource at [/Common/jquery/jquery-ui.js] to the cache
because there was insufficient
free space available after evicting expired cache entries —
consider increasing the maximum size of the cache