Руководство по наиболее важным параметрам JVM
Узнайте о наиболее важных параметрах JVM, которые могут быть использованы для повышения производительности веб-приложений.
1. Обзор
В этом кратком руководстве мы рассмотрим наиболее известные параметры, которые можно использовать для настройки виртуальной машины Java.
2. Явная кучная память – Параметры Xms и Xmx
Одной из наиболее распространенных практик, связанных с производительностью, является инициализация памяти кучи в соответствии с требованиями приложения.
Вот почему мы должны указать минимальный и максимальный размер кучи. Для его достижения можно использовать следующие параметры:
Здесь unit обозначает единицу, в которой должна быть инициализирована память (обозначаемая размером кучи ). Единицы измерения могут быть помечены как ‘g’ для ГБ, ‘m’ для МБ и ‘k’ для КБ.
Например, если мы хотим назначить JVM минимум 2 ГБ и максимум 5 ГБ, нам нужно написать:
Начиная с Java 8, размер Metaspace не определен. Как только он достигает глобального предела, JVM автоматически увеличивает его, однако, чтобы преодолеть любую ненужную нестабильность, мы можем установить Metaspace size с помощью:
Мы можем назначить их явно:
3. Сбор Мусора
Для лучшей стабильности приложения очень важен выбор правильного алгоритма Сборки мусора|/.
JVM имеет четыре типа реализаций GC :
Эти реализации могут быть объявлены с помощью следующих параметров:
4. Ведение журнала ГК
Используя следующие параметры, мы можем регистрировать активность GC :
UseGCLogFileRotation указывает файл журнала rollingpolicy, очень похожий на log4j, s4lj и т. Д. NumberOfGCLogFiles обозначает максимальное количество файлов журнала, которые могут быть записаны за один жизненный цикл приложения. GCLogFileSize указывает максимальный размер файла. Наконец, логика обозначает его местоположение.
Например, если мы хотим назначить максимум 100 GC log файлов, каждый из которых имеет максимальный размер 50 МБ, и хотим сохранить их в ‘ home/user/log/’/location, мы можем использовать следующий синтаксис:
Однако проблема заключается в том, что один дополнительный поток демона всегда используется для мониторинга системного времени в фоновом режиме. Такое поведение может создать некоторое узкое место в производительности, поэтому всегда лучше не играть с этим параметром в производстве.
5. Обработка нехватки памяти
Вот почему JVM поставляется с некоторыми параметрами, которые сбрасывают память кучи в физический файл, который может быть использован позже для обнаружения утечек:
Здесь следует отметить несколько моментов:
6. 32/64 Бит
Если мы хотим установить среду на 64 бит вручную, мы можем сделать это с помощью приведенного ниже параметра:
7. Разное
8. Заключение
В этой краткой статье мы узнали о некоторых важных параметрах JVM, которые можно использовать для настройки и повышения общей производительности приложений.
Некоторые из них также могут быть использованы для отладки.
Развеиваем мифы об управлении памятью в JVM
Структура памяти JVM
Сначала давайте посмотрим на структуру памяти JVM. Эта структура применяется начиная с JDK 11. Вот какая память доступна процессу JVM, она выделяется операционной системой:
Это нативная память, выделяемая ОС, и её размер зависит от системы, процессор и JRE. Какие области и для чего предназначены?
Куча (heap)
Здесь JVM хранит объекты и динамические данные. Это самая крупная область памяти, в ней работает сборщик мусора. Размером кучи можно управлять с помощью флагов Xms (начальный размер) и Xmx (максимальный размер). Куча не передаётся виртуальной машине целиком, какая-то часть резервируется в качестве виртуального пространства, за счёт которого куча может в будущем расти. Куча делится на пространства «молодого» и «старого» поколения.
Стеки потоков исполнения
Метапространство
Кеш кода
Здесь компилятор Just In Time (JIT) хранит скомпилированные блоки кода, к которым приходится часто обращаться. Обычно JVM интерпретирует байткод в нативный машинный код, однако код, скомпилированный JIT-компилятором, не нужно интерпретировать, он уже представлен в нативном формате и закеширован в этой области памяти.
Общие библиотеки
Здесь хранится нативный код для любых общих библиотек. Эта область памяти загружается операционной системой лишь один раз для каждого процесса.
Использование памяти JVM: стек и куча
Теперь давайте посмотрим, как исполняемая программа использует самые важные части памяти. Воспользуемся нижеприведённым кодом. Он не оптимизирован с точки зрения корректности, так что игнорируйте проблемы вроде ненужных промежуточных переменных, некорректных модификаторов и прочего. Его задача — визуализировать использование стека и кучи.
Здесь вы можете увидеть, как исполняется вышеприведённая программа и как используются стек и куча:
Управление памятью JVM: сборка мусора
Давайте разберёмся с автоматическим управлением кучей, которое играет очень важную роль с точки зрения производительности приложения. Когда программа пытается выделить в куче больше памяти, чем доступно (в зависимости от значения Xmx ), мы получаем ошибки нехватки памяти.
JVM управляет куче с помощью сборки мусора. Чтобы освободить место для создания нового объекта, JVM очищает память, занятую потерянными объектами, то есть объектами, на которые больше нет прямых или опосредованных ссылок из стека.
Сборщик мусора в JVM отвечает за:
Сборщик мусора Mark & Sweep
JVM использует отдельный поток демона, который работает в фоне для сборки мусора. Этот процесс запускается при выполнении определённых условий. Сборщик Mark & Sweep обычно работает в два этапа, иногда добавляют третий, в зависимости от используемого алгоритма.
JVM предлагает на выбор несколько разных алгоритмов сборки мусора, и в зависимости от вашего JDK может быть ещё больше вариантов (например, сборщик Shenandoah в OpenJDK). Авторы разных реализаций стремятся к разным целям:
Сборщики в JDK 11
Процесс сборки мусора
Вне зависимости от того, какой выбран сборщик, в JVM используется два вида сборки — младший и старший сборщик.
Младший сборщик
Он поддерживает чистоту и компактность пространства молодого поколения. Запускается тогда, когда JVM не может получить в раю необходимую память для размещения нового объекта. Изначально все области кучи пусты. Рай заполняется первым, за ним область выживших, и в конце хранилище.
Здесь вы можете увидеть процесс работы этого сборщика:
Старший сборщик
Следит за чистотой и компактностью пространства старого поколения (хранилищем). Запускается при одном из таких условий:
Заключение
Мы рассмотрели структуру и управление памятью JVM. Это не исчерпывающая статья, мы не говорили о многих более сложных концепциях и способах настройки под особые сценарии использования. Подробнее вы можете почитать здесь.
Но для большинства JVM-разработчиков (Java, Kotlin, Scala, Clojure, JRuby, Jython) этого объёма информации будет достаточно. Надеюсь, теперь вы сможете писать более качественный код, создавать более производительные приложения, избегая различных проблем с утечкой памяти.
Каковы параметры Xms и Xmx при запуске JVMs? [дубликат]
этот вопрос уже есть ответ здесь:
Пожалуйста, объясните использование Xms и Xmx параметры в JVMs. Какие значения по умолчанию для них?
4 ответов
флаг Xmx задает максимальный пул выделения памяти для виртуальной машины Java (JVM), в то время как Xms задает начальный пул выделения памяти.
это означает, что ваш JVM будет запущен с Xms объем памяти и будет иметь возможность использовать максимум Xmx объем памяти. Например, запуск JVM, как показано ниже, запустит его с 256 МБ памяти и позволит процессу использовать до 2048 Мб памяти:
память флаг также может быть указан в нескольких размерах, таких как килобайты, мегабайты и так далее.
при использовании этих настроек имейте в виду, что эти настройки предназначены для JVM кучу, и что JVM может / будет использовать больше памяти, чем просто размер, выделенный куче. От в Oracle документация:
обратите внимание, что JVM использует больше памяти, чем просто кучи. Например, методы Java, стеки потоков и собственные дескрипторы выделяются в памяти отдельно от кучи, а также внутренние структуры данных JVM.
параметры-X являются нестандартными и могут быть изменены без предварительного уведомления.
Я надеюсь, что это поможет вам понять Xms, Xmx, а также многие другие вещи, которые имеют наибольшее значение. 🙂
основная часть вопроса уже была рассмотрена выше. Просто добавляю часть значений по умолчанию.
значение по умолчанию Xmx значение будет зависеть от платформы, и объема памяти, доступной в системе.
Какие аргументы означают, что в параметрах памяти JVM?
4 ответов
-Xms: этот параметр задает начальный и минимальный размер кучи Java.
-Xmx: Этот параметр задает максимальный размер кучи Java. Куча Java («куча») является частью памяти, где блоки памяти выделяются объектам и освобождаются во время сборки мусора.
-XX:PermSize: -XX:MaxPermSize: используются для установки размера для постоянного поколения. Постоянное пространство-это место, где хранятся классы, методы, интернализованные строки и аналогичные объекты, используемые виртуальной машиной и никогда не освобожденные (отсюда и имя).
-Xss: задает размер стека потока. Стеки потоков-это области памяти, выделенные для каждого потока Java для их внутреннего использования. Здесь поток сохраняет свое локальное состояние выполнения.
есть сотни вариантов JVM доступны. В основном они подразделяются на три вида:
список из нескольких стандартных опций: [чтобы увидеть полный список, выполните команду «java» без какой-либо опции]
список из нескольких нестандартных вариантов XX: [полный список доступен здесь]
используется для установки размера стека. Значения стека существуют только в области функции, в которой они созданы. Как только функция возвращается, они отбрасываются.
самый простой способ исчерпать пространство стека-слишком глубоко рекурсировать.
используется для установки размера вашей кучи. Куча-это место, где вы выделяете объекты. Объекты сохраняются до тех пор, пока они не станут мусором собранный.
самый простой способ запустите из памяти выделить что-то массивное.
— XX: MaxPermSize: постоянное поколение.
постоянное поколение является особенным, потому что оно содержит данные, необходимые виртуальной машине для описания объектов, которые не имеют эквивалентности на уровне языка Java. Например, объекты, описывающие классы и методы, хранятся в постоянном поколении.
обычно вы кончатся permgen пространства, если вы каким-то образом просачивается ссылки на классы, вы динамически загружать. Это поражает некоторые веб-контейнеры, в частности.
читать параметры JVM объяснены. Вот выдержки из него:
7 наиболее распространенных ошибок при установке ограничений памяти Java
1. Отсутствие m, M, g или G в конце (регистр не имеет значения). Например:
2. Лишний пробел или использование =. Например:
4. Установка размера кучи большего чем объем доступной физической памяти. Пример:
Устанавливайте размер кучи меньше чем размер физической памяти:
5. Использование mb в качестве единицы измерения, вместо m или M.
6. Установка размера кучи в большее значение, чем позволяет JVM. Пример:
Укажите размер поменьше:
7. Указание дробного чиста в качестве значения. Пример:
Правильная команда должна выглядеть так:
Как установить размер кучи(heap) в Tomcat?
Остановите сервер Tomcat, установите переменную окружения CATALINA_OPTS, затем запустите Tomcat снова. Смотрите файлы tomcat-install/bin/catalina.sh или catalina.bat чтобы узнать как используется эта переменная окружения.
Примеры:
(Windows, значение не в кавычках)
(ksh/bash, значение в кавычках)
(tcsh/csh, значение в кавычках)
Как установить размер кучи в JBoss?
Как установить размер кучи в Eclipse?
Как установить размер кучи в NetBeans?
Закройте NetBeans, отредактируйте файл netbeans-install/etc/netbeans.conf. Пример:
Как установить размер кучи в Apache Ant?
Установите переменную окружения ANT_OPTS. Примеры:
(Windows)
(ksh/bash)
(tcsh/csh)
Как установить размер кучи в JavaEE SDK/J2EE SDK/Glassfish/Sun Java System Application Server?





