- Ограничить память процесса JVM
- Русские Блоги
- CentOS 7 Linux Установить оптимизацию памяти Tomcat 8-JVM (
- Настройте память, выделенную при запуске Tomcat JVM
- Описание выделения памяти JVM по умолчанию
- Распределение памяти кучи JVM
- Распределение памяти без кучи JVM
- Ненормальная ошибка в памяти JVM
- OutOfMemoryError: Java heap space
- OutOfMemoryError: PermGen space
- OutOfMemoryError: unable to create new native thread
- Просмотр информации о памяти JVM
- использование jconsole Инструменты для просмотра оперативной памяти JVM
- Используйте программу JAVA для просмотра оперативной памяти JVM
- Настройте Tomcat для запуска с catalina.sh и настройте память JVM
- Настройте Tomcat для запуска daemon.sh в фоновом режиме и настройте память JVM
Ограничить память процесса JVM
Такой вот вопрос организовался. Java при запуске всегда запускается с резервом памяти намного больше размера хипа вм. При этом этот резерв я так понимаю определяется общим размером озу машины на котором стартует вм. Пример: есть микросервис, запускается с Xmx32M, ему для работы этого всегда хватает. У меня на компе процесс вм скушает около гига памяти (16гб озу). На сервере 250мб (2гб озу), на оранжевом пи 64мб (256мб озу). Очевидно что для нормальной работы, ему явно не требуется > 64мб памяти, но по каким-то причинам, он жрет все что дают.
Вопрос — как ограничить память процесса java?
ему явно не требуется > 64мб памяти
Вопрос не в том, сколько памяти берётся, а в том, что взятая память не используется и не высвобождается. А зачем тогда она выделяется?
Сискол ядру на выделение памяти дорогая операция, например в сях в тех местах где нужно избегать пауз не делают malloc, а jvm один раз запрашивает вагон памяти а дальше сама менеджет памятью, т.е. выделение памяти под новые объекты обходятся дешевле нативного malloc’а.
jvm один раз запрашивает вагон памяти а дальше сама менеджет памятью
Так какого рожна именно это «менеджет памятью» не происходит, память не пользуется, но при этом на её обслуживание тратится cpu.
-Xmx -Xms -Xss не имеют отношения к размеру процесса. Все значения зафиксированы на 32М. Вопрос идет о памяти именно процесса ОС, который раздут во много раз больше чем размер хипа.
На её обслуживание cpu не тратится, т.к. как я понимаю jvm не занимается очисткой пока не достигнет некоторого лимита на занимаемую память.
Смотрел всякие конференции с рассказами про работу GC, где говори что jvm создает область для долгоживущих объектов и две области для короткоживущих, в первой области jvm может заняться например дефрагментацией (упреждая проблему фрагментации хипа), а вот области для короткоживущих объектов скорее всего создают «пилу» на графиках использования памяти. Если я не ошибаюсь новые объекты создаются в первой области короткоживущих объектов до тех пор пока не не будет достигнут лимит по выделенной памяти, затем происходит stop-the-world пауза (раньше так было) во время которой объекты на которых хоть кто-то ссыпается копируются из первой области во вторую область короткоживущих объектов, а исходная область уничтожается/отчищается. Т.е. чем меньше хип тем больше stop-the-world пауз, и все повторяется. Про stop-the-wrold так раньше было, сейчас кажется хитрее и пауз таких мало.
На её обслуживание cpu не тратится
Ха-ха-ха. Прочти свой же пост. Нифига себе не тратится.
Ну . 🙂 Призываю stevejobs ‘а
А вообще я хотел сказать, что пока память не кончилась, jvm ничего делать не будет, никакого копирования из одной области в другую и прочего, в этом смысл был мой фразы что cpu не используется, правда из моих слов выходит, что потом должна возникнуть долгая паза, потому надеюсь stevejobs сможет разъяснить по работе gc или хотяб ссылку дать.
если все значения зафиксированы на 32M, то меньше 96 никак быть не может: Xmx + XX:MaxPermSize + 1*Xss и это только для случая 1 треда
При этом этот резерв я так понимаю определяется общим размером озу машины на котором стартует вм.
Если упростить, то да.
Вопрос — как ограничить память процесса java?
Да, старая жаба не отпускает память, которую потрогала.
Частично эта проблема решена только в свежих сборщиках. В том числе, в G1 — только начиная с Java 12
Попробуйте скачать сборку от Azul (в оракловой нет шенанды) и вначале пожить с G1, потом переключиться на шенанду ( -XX:+UseShenandoahGC).
начиная со слов «Promptly Return Unused Committed Memory from G1» (искать ctrl+F, потому что мне лень размечать хтмл-якори)
обратите внимание на флаги, которыми настраивается G1, если используете его
Ну и может быть, начать надо не с GC, а с того что начиная с OpenJDK 8 метаданные лежат не в пермгене, а в Метаспейсе, и метаспейс — это нативная память. По умолчанию она расширяется, но можно зафиксировать. Надо глянуть на ключики -XX:MetaspaceSize и -XX:MaxMetaspaceSize.
Я не уверен, где лежит в хотспоте code cache, но если тоже в оффхипе — проверьте что не делаете ничего *странного* в настройках JIT и тому подобного. То есть, если вы врубили Грааль, выключили tiered compilation и сказали собрать джитом всю программу, то наверное вы сами выпрыгнули без парашюта
Я даже не знаю что сказать. В гугле забанили?
Я рад тебя читать (хоть ты и странный). Кеш Джава машины лежит в среде самой Джава машины. Я вообще не понял, что ты хочешь донести.
Я не уверен, где лежит в хотспоте code cache
А зачем ты тогда ходишь на всякие «посиделки» и рассказываешь что ты мега джавист? Если ты мега круто всё по Джаве — тогда и пиши.
Источник
Русские Блоги
CentOS 7 Linux Установить оптимизацию памяти Tomcat 8-JVM (
Настройте память, выделенную при запуске Tomcat JVM
Описание выделения памяти JVM по умолчанию
JAVA_OPTS=»-server -Xms2048m -Xmx2048m -XX:PermSize=128M -XX:MaxPermSize=128m»
Параметры конфигурации памяти JVM | описание |
---|---|
-Xmx | Максимальное значение Java Heap, значение по умолчанию составляет 1/4 физической памяти; |
-Xms | Начальное значение Java Heap. Лучше установить для -Xms и -Xmx одинаковое значение в JVM на стороне сервера. Значение по умолчанию можно сохранить для JVM машины разработки и тестирования; |
-Xmn | Размер области Java Heap Young, если вы незнакомы, лучше оставить значение по умолчанию; |
-XX:PermSize | Установить область постоянного хранения памяти; |
-XX:MaxPermSize | Установить область постоянного хранения максимальной памяти; |
-XX:NewSize | Установите кучу JVM Новое поколение Размер по умолчанию; |
-XX:MaxNewSize | Установите кучу JVM Новое поколение Максимальный размер |
-Xss | Размер стека каждого потока, лучше сохранить значение по умолчанию, если вы не знакомы с ним; |
Распределение памяти кучи JVM
-Xms Принято считать, что при запуске JVM изначально выделяется физическая память, а по умолчанию используется 1/64 физической памяти;
-Xmx Максимальная физическая память, выделяемая при работе JVM, согласована, и по умолчанию она составляет 1/4 физической памяти;
Когда JVM работает, когда объем свободной памяти кучи JVM превышает 70% ее собственной памяти, JVM автоматически освобождает память, пока не достигнет -Xms Согласованное минимальное значение, которое обычно возникает после GC, когда JVM настраивает свою собственную память кучи.
Оптимизация памяти
, поэтому мы можем установить его вручную -Xms против -Xmx Равно избегать корректировки размера кучи после каждого GC.
-рекомендованная максимальная настройка памяти кучи -Xmx 80% от максимально доступной памяти.
Переполнение памяти
— -Xms -Xmx , JVM не запускается;
— -Xmx > Когда физическая память доступна, JVM не запускается;
— Объем памяти, используемой приложением при запуске и запуске, превышает -Xmx Когда, переполнение памяти JVM (OutOfMemoryError: пространство кучи Java);
Распределение памяти без кучи JVM
-XX:PermSize Установите начальное значение памяти без кучи, по умолчанию 1/64 физической памяти;
-XX:MaxPermSize Установите максимальный объем памяти без кучи, по умолчанию это 1/4 физической памяти;
Память без кучи JVM (область постоянной памяти), используемая для хранения информации о классах и мета-версиях, все классы приложения помещаются в эту область при загрузке JVM. Это и экземпляр класса хранения ( Instance ) Куча области ( Heap ) Разное, GC GC ( Garbage Collection ) Не влияет на область памяти без кучи во время выполнения основной программы ( PermGen space ) Очистить.
Оптимизация памяти
-Рекомендуется выделить в соответствии с реальной ситуацией приложения развертывания сервера, вы можете передать jconsole Инструмент наблюдает за использованием памяти после запуска JVM и выделяет ее;
— рекомендуется -XX:PermSize против -XX:MaxPermSize Значение установлено равным.
Переполнение памяти
— Когда JVM начинает загружать приложение, объем памяти, используемой для загрузки класса, превышает -XX:MaxPermSize , Ошибка переполнения памяти без кучи (OutOfMemoryError: пространство PermGen);
— когда -Xmx + -XX:MaxPermSize Когда память, установленная этими двумя, превышает доступную физическую память системы, JVM не запускается;
Ненормальная ошибка в памяти JVM
OutOfMemoryError: Java heap space
Основная проблема с переполнением памяти в этом случае. Это сообщение об исключении будет сгенерировано в JVM, если 98% времени используется для GC, а доступный размер кучи составляет менее 2%.
OutOfMemoryError: PermGen space
Эта ошибка распространена, когда веб-сервер предварительно компилирует JSP. Если вы используете много сторонних jar-файлов под своим веб-приложением, размер которых превышает размер jvm по умолчанию, то это сообщение об ошибке будет сгенерировано. Если веб-приложение использует большое количество сторонних jar-файлов или в приложении слишком много файлов классов, а для MaxPermSize задано малое значение, его превышение также вызовет чрезмерное использование памяти и переполнение, или не очистит переднюю часть при горячем развертывании tomcat Загруженная среда только изменит контекст на вновь развернутый, и будет появляться все больше и больше некомпетентного контента.
OutOfMemoryError: unable to create new native thread
Это явление относительно редкое и странное, в основном связанное с соотношением jvm и системной памяти. Эта странная вещь связана с тем, что JVM была выделена системой большой объем памяти (например, 1,5 ГБ), и она должна занимать как минимум половину доступной памяти.
Просмотр информации о памяти JVM
использование jconsole Инструменты для просмотра оперативной памяти JVM
в window Установка системы JDK Приходит в сумке jconsole Инструменты могут быть переданы jconsole Инструменты для связи с удаленными серверами JVM Примеры, просмотр JVM Память во время выполнения.
Кстати, представьте еще один инструмент, который поставляется с JDK jvisualvm Вы можете использовать этот инструмент для выполнения тестов производительности программ JAVA, анализа данных о производительности программ и т. Д. (Вы можете использовать Baidu для конкретного использования).
Кстати, представьте еще один инструмент, который поставляется с JDK jmc Вы можете использовать этот инструмент для удаленного мониторинга JVM. После запуска этого инструмента основной интерфейс представит инструмент «Что такое Oracle Java Mission Control?».
позиция: %JAVA_HOME%/bin/jconsole.exe
Расположение: %JAVA_HOME%/bin/jvisualvm.exe
Расположение: %JAVA_HOME%/bin/jmc.exe
Используйте программу JAVA для просмотра оперативной памяти JVM
Настройте Tomcat для запуска с catalina.sh и настройте память JVM
Таким образом, было уделено внимание некоторым аспектам памяти JVM. Ниже приведено прямое описание того, как Tomcat начинает настраивать выделение памяти JVM через catalina.sh.
войти %TOMCAT_HOME%/bin Под каталогом найдите catalina.sh скрипт.
1. Проверьте это catalina.sh Работает ли служба нормально.
Выполните следующую команду, вы увидите некоторую информацию о запуске Tomcat.
2. Используйте vim Редактор открывается catalina.sh скрипт. Добавьте следующий код, прежде чем скрипт выполнит оператор.
Затем повторно запустите сценарий, чтобы запустить службу Tomcat.
Замечания: в исполнении ./catalina.sh stop После этого журнал предлагает нам следующие два предложения, основное значение в Tomcat 8.0 Начало версии, не нужно устанавливать -PermSize 、 -MaxPermSize Эти два параметра. Так что просто удалите его в конфигурации.
OpenJDK 64-Bit Server VM warning: ignoring option PermSize=128M; support was removed in 8.0
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
Настройте Tomcat для запуска daemon.sh в фоновом режиме и настройте память JVM
Таким образом, было уделено внимание некоторым аспектам памяти JVM. Ниже приведено прямое описание того, как Tomcat начинает настраивать выделение памяти JVM через catalina.sh.
войти %TOMCAT_HOME%/bin Под каталогом найдите daemon.sh скрипт.
1. Проверьте это daemon.sh Работает ли служба нормально.
Выполните следующую команду, вы увидите некоторую информацию о запуске Tomcat.
Примечания: Мы не видели из процесса информации -server -Xms896m -Xmx896m Информация о распределении памяти, то есть Tomcat daemon.sh Скрипт запуска не наследуется catalina.sh Информация о конфигурации в скрипте, поэтому вам нужно вручную daemon.sh Настройте параметры выделения памяти JVM.
2. Используйте vim Редактор открывается daemon.sh скрипт. Добавьте следующий код, прежде чем скрипт выполнит оператор.
JAVA_OPTS=»-server -Xms896m -Xmx896m»
Поиск под vim JAVA_OPTS= Как показано ниже, настройте параметры выделения памяти JVM сзади.
Затем сохраните и выйдите.
Остановите службу и перезапустите службу.
Источник