JVM управляет двумя типами памяти: кучной и некучей. Куча предназначена для использования разработчиками, как упоминалось выше, она создается при запуске JVM; не-куча зарезервирована для самой JVM для хранения информации о классе. В отличие от кучи GC не освобождает место во время выполнения.
1. Тип переполнения памяти
1. java.lang.OutOfMemoryError: пространство PermGen
JVM управляет двумя типами памяти: кучной и некучей. Куча предназначена для использования разработчиками, как упоминалось выше, она создается при запуске JVM; не-куча зарезервирована для самой JVM для хранения информации о классе. В отличие от кучи GC не освобождает место во время выполнения. Если веб-приложение использует большое количество сторонних jar-файлов или в приложении слишком много файлов классов, а параметр MaxPermSize мал, превышение предела также приведет к слишком большому занятию памяти и переполнению, или tomcat будет не очищать фронт при горячем развертывании Загруженная среда будет только менять контекст на вновь развернутый, а нестакающегося контента будет все больше.
Полное имя пространства PermGen — пространство постоянного поколения, которое относится к области постоянного хранения памяти. Эта память в основном используется JVM для хранения информации о классах и мета-классах, когда она размещается в пространстве PermGen. загружается загрузчиком и хранит экземпляры классов. (Экземпляр) Область кучи отличается, GC (сборка мусора) не будет очищать пространство PermGen во время работы основной программы, поэтому, если в вашем приложении много CLASS, PermGen скорее всего появится. space, эта ошибка часто встречается, когда веб-сервер предварительно компилирует JSP. Если ваше веб-приложение использует большое количество сторонних jar-файлов и их размер превышает размер jvm по умолчанию (4 МБ), будет создано это сообщение об ошибке.
Лучший пример конфигурации: (После моей проверки, поскольку с момента использования этой конфигурации Tomcat больше никогда не умирал)
установите JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
В Linux добавьте строку кода, как показано красным, в tomcathome/conf/catalina.sh: вы можете увеличить память tomcat jvm, чтобы вероятность перелива памяти была меньше!
# ----- Выполнение запрошенной команды ---------------------------------------- -
JAVA_OPTS="-server -Xms512m -Xmx2048m -XX:PermSize=128m -XX:MaxNewSize=256m -XX:MaxPermSize=256m"
# Bugzilla 37848: выводить это, только если у нас есть TTY
2. java.lang.OutOfMemoryError: пространство Javaheap.
Первая ситуация — это добавка, и в этой ситуации возникает основная проблема. Его пространство по умолчанию (т. е. -Xms) составляет 1/64 физической памяти, а максимальное пространство (-Xmx) составляет 1/4 физической памяти. Если остается менее 40% памяти, JVM увеличит кучу до значения, установленного Xmx. Если оставшаяся память превышает 70%, JVM уменьшит кучу до значения, установленного Xms. Поэтому настройки Xmx и Xms сервера обычно следует устанавливать одинаковыми, чтобы избежать изменения размера кучи виртуальной машины после каждого GC. Предполагая, что физическая память бесконечна, максимальный объем памяти JVM зависит от операционной системы. Обычно для 32-разрядной машины она составляет от 1,5 до 3 ГБ, а для 64-разрядной машины ограничений нет.
Примечание. Если Xms превышает значение Xmx или сумма максимального значения кучи и максимального значения без кучи превышает максимальный предел физической памяти или операционной системы, сервер не запустится.
Роль сборщика мусора GC
Частота вызова GC JVM по-прежнему очень высока, а сборка мусора выполняется в двух основных ситуациях:
Когда поток приложения простаивает; другой вариант — когда кучи памяти Java недостаточно, GC будет постоянно вызываться. Если непрерывная перезапуск не может решить проблему нехватки кучи памяти, будет сообщено об ошибке нехватки памяти. Поскольку это исключение зависит от операционной среды системы, невозможно предсказать, когда оно произойдет.
Согласно механизму GC, запуск программы вызовет изменения в операционной среде системы, увеличивая вероятность срабатывания GC.
Чтобы избежать этих проблем, при проектировании и написании программ следует избегать использования памяти мусорными объектами и накладных расходов на сборщик мусора. Явный вызов System.GC() может лишь означать, что JVM необходимо переработать мусорные объекты в памяти, но не обязательно перерабатывать их немедленно.
Во-первых, это не может решить проблему нехватки ресурсов памяти, а также увеличит потребление GC.
2. Состав области памяти JVM <BR>Просто поговорим о куче и стеке в Java
Java делит память на два типа: один — стековая память, другой — куча.
1. Переменные базового типа и переменные ссылки на объект, определенные в функции, размещаются в стековой памяти функции;
2. Память кучи используется для хранения объектов и массивов, созданных функцией new. Когда переменная определена в функции (блоке кода), Java выделяет пространство памяти для переменной в стеке. Когда область действия переменной будет превышена, Java будет. автоматически освободить пространство памяти, выделенное для переменной; память, выделенная в куче, управляется автоматическим сборщиком мусора виртуальной машины Java. Преимущество кучи заключается в том, что размер памяти может распределяться динамически, а время жизни — автоматически. не нужно сообщать компилятору заранее, поскольку он находится в памяти и динамически выделяется во время выполнения. Недостатком является то, что память должна распределяться динамически во время выполнения, а скорость доступа низкая;
Преимущество стека заключается в том, что скорость доступа выше, чем у кучи. Недостаток заключается в том, что размер и время жизни данных, хранящихся в стеке, должны быть детерминированными и негибкими.
Куча Java разделена на три области: новая, старая и постоянная.
GC имеет два потока:
Вновь созданные объекты помещаются в новую область. Когда область заполняется, она перемещается в старую область вспомогательным потоком GC. Когда старая область также заполняется, основной поток GC запускается для обхода всех объектов в ней. куча памяти. Размер Старой области равен Xmx минус -Xmn.
Настройка стека хранилища стека Java: параметры +UseDefaultStackSize -Xss256K, что означает, что каждый поток может претендовать на 256 КБ пространства стека. Каждый поток имеет свой собственный стек.
3. Как настроить виртуальную память в JVM <BR>Совет. Если в JVM 98 % времени используется сборщик мусора, а доступный размер кучи составляет менее 2 %, будет выдано это сообщение об исключении.
Совет: Максимальный размер кучи не должен превышать 80% доступной физической памяти. Как правило, для параметров -Xms и -Xmx должно быть установлено одинаковое значение, а -Xmn должно составлять 1/4 значения -Xmx.
Совет: Начальная память, выделяемая JVM, указывается с помощью параметра -Xms, значение по умолчанию составляет 1/64 от физической памяти, а максимальная память, выделяемая JVM, указывается с помощью -Xmx, а значение по умолчанию составляет 1/4 от физической памяти; память.
По умолчанию, когда свободная память в куче меньше 40 %, JVM будет увеличивать кучу до максимального предела -Xmx, когда свободная память в куче превышает 70 %, JVM будет уменьшать кучу до минимального предела; -Xms. Поэтому сервер обычно устанавливает -Xms и -Xmx равными, чтобы избежать изменения размера кучи после каждого GC.
Совет: Если предположить, что физическая память бесконечна, максимальное значение памяти JVM тесно связано с операционной системой.
Проще говоря, хотя 32-битный процессор имеет контролируемый объем памяти в 4 ГБ, конкретная операционная система накладывает ограничения.
Обычно этот предел составляет 2–3 ГБ (вообще говоря, это 1,5–2 ГБ в системах Windows и 2–3 ГБ в системах Linux), и для процессоров выше 64-битных ограничений не будет.
Примечание. Если Xms превышает значение Xmx или сумма максимального значения кучи и максимального значения без кучи превышает максимальный предел физической памяти или операционной системы, сервер не запустится.
Совет: установите NewSize и MaxNewSize равными, а размер «нового» не должен превышать половины «старого». Причина в том, что если старая область недостаточно велика, «основной» сборщик мусора будет запускаться часто. , что значительно снижает производительность.
JVM использует -XX:PermSize для установки начального значения памяти без кучи. Значение по умолчанию — 1/64 физической памяти;
Максимальный размер памяти без кучи задается параметром XX:MaxPermSize. Значение по умолчанию — 1/4 физической памяти.
Решение. Установите размер кучи вручную.
Измените TOMCAT_HOME/bin/catalina.bat.
Добавьте следующие строки выше «echo «Использование CATALINA_BASE: $CATALINA_BASE»»:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
4. Используйте инструменты проверки производительности для обнаружения утечек памяти:
Инструмент JProfiler в основном используется для проверки и отслеживания производительности систем (ограничено разработкой на Java). JProfiler может в любое время отслеживать работу и производительность JVM, постоянно отслеживая использование памяти системы, сбор мусора, состояние выполнения потоков и другие средства.
1. Память сервера приложений неоправданно занята в течение длительного времени. Память часто занята на высоком уровне и ее сложно восстановить до низкого уровня.