моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Формат настройки параметров JVM программы Spring Boot (запуск Tomcat напрямую добавляется в файл catalina.sh в каталоге bin):
java -Xms2048M -Xmx2048M -Xmn1024M -Xss512K -XX:Размер метапространства=256M -XX:Макс.размер метапространства=256M -jar microservice-eureka-server.jar
в заключение:
Чем меньше параметр -Xss, тем меньше значение счетчика, а это означает, что в стеке потоков можно выделить меньше кадров стека, но количество потоков, которые можно открыть, будет больше для JVM в целом.
-Xss: размер стека каждого потока, по умолчанию 1M.
-Xms: установить начальный доступный размер кучи, по умолчанию — 1/64 физической памяти.
-Xmx: установить максимально доступный размер кучи, по умолчанию — 1/4 физической памяти.
-Xmn: размер нового поколения
-XX:NewRatio: значение по умолчанию 2 означает, что на новое поколение приходится 1/2 старого поколения и 1/3 всей памяти кучи.
-XX:SurvivorRatio: значение по умолчанию 8 означает, что область выжившего занимает 1/8 памяти Эдема, то есть 1/10 памяти нового поколения.
В метапространстве есть два параметра JVM: -XX:MetaspaceSize=N и -XX:MaxMetaspaceSize=N.
-XX: MaxMetaspaceSize: установить максимальный размер метапространства. По умолчанию установлено значение -1, что означает отсутствие ограничений или ограничение только размером локальной памяти.
-XX: MetaspaceSize: укажите начальный порог метапространства для запуска Fullgc (фиксированного начального размера метапространства не существует), в байтах. При достижении этого значения будет запущен полный сборщик мусора для выгрузки типа. сборщик отрегулирует это значение: если высвобождается большой объем пространства, уменьшите значение соответствующим образом; если высвобождается небольшой объем места, увеличьте значение соответствующим образом, не превышая -XX:MaxMetaspaceSize (если установлено). Это значение отличается от значения параметра -XX:PermSize в более ранних версиях jdk. -XX:PermSize представляет начальную емкость постоянного поколения.
Поскольку для изменения размера метапространства требуется полный сбор мусора, это очень дорогостоящая операция. Если при запуске приложения происходит большое количество полных сборок мусора, это обычно связано с изменением размера постоянного поколения или метапространства. обычно рекомендуется в параметрах JVM установить для MetaspaceSize и MaxMetaspaceSize одно и то же значение и установить их больше исходного значения. Для машины с физической памятью 8 ГБ я обычно устанавливаю оба значения равными 256 МБ.
В виртуальной машине HotSpot расположение объектов, хранящихся в памяти, можно разделить на три области: заголовок объекта (Header), данные экземпляра (Instance Data) и заполнение выравнивания (Padding). Заголовок объекта виртуальной машины HotSpot включает в себя две части информации. Первая часть используется для хранения данных времени выполнения самого объекта, таких как хэш-код (HashCode), возраст генерации GC, флаг состояния блокировки, блокировка, удерживаемая потоком. , смещенный идентификатор потока, временные метки предпочтения и т. д. Другая часть заголовка объекта — это указатель типа, который является указателем объекта на его метаданные класса. Виртуальная машина использует этот указатель, чтобы определить, экземпляром какого класса является объект.
1. Использование 32-битных указателей (фактическое хранилище использует 64-битные) в HotSpot на 64-битной платформе будет использовать примерно в 1,5 раза больше памяти. Использование указателей большего размера для перемещения данных между основной памятью и кэшем требует большей пропускной способности. в то же время GC также окажется под большим давлением
2. Чтобы уменьшить потребление памяти на 64-битных платформах, включите функцию сжатия указателя.
3. В jvm 32-битные адреса поддерживают до 4 ГБ памяти (2 в 32-й степени), что можно оптимизировать, сжимая и кодируя указатель объекта, когда он хранится в динамической памяти, и декодируя его после извлечения. в регистр процессора (указатель объекта находится в куче. Он имеет размер 32 бита, 35 бит в регистре, 2 в 35-й степени = 32 ГБ), что позволяет jvm поддерживать конфигурации памяти большего размера (меньше или равно 32 ГБ), используя только 32-битные адреса
4. Если объем кучи меньше 4 ГБ, нет необходимости включать сжатие указателя. JVM напрямую удалит старший 32-битный адрес, то есть будет использовать нижнее виртуальное адресное пространство.
5. Когда объем кучи превышает 32 ГБ, указатель сжатия станет недействительным и 64-битный (т. е. 8 байт) будет вынужден обращаться к объекту Java. Это вызовет проблему 1, поэтому его лучше не использовать. объем кучи памяти превышает 32 ГБ.
В этом случае JVM может оптимизировать место выделения памяти объекта, включив параметр escape-анализа (-XX:+DoEscapeAnalysis), чтобы она сначала выделялась в стеке посредством скалярной замены (выделение в стеке). включен по умолчанию после JDK7. Если вы хотите, отключите его с помощью параметров (-XX:-DoEscapeAnaанализ).
Скалярная замена: когда с помощью escape-анализа определяется, что к объекту не будет осуществляться доступ извне и объект может быть дополнительно разложен, JVM не будет создавать объект, но разложит переменные-члены объекта на несколько переменных-членов, используемых этим методом, и замените их. Эти замещающие переменные-члены выделяют пространство в кадре стека или регистре, чтобы для объекта не было недостаточного выделения памяти из-за отсутствия большого непрерывного пространства. Включите скалярные параметры замены (-XX:+EliminateAllocations), которые включены по умолчанию после JDK7.
Скалярные и агрегатные величины. Скаляр — это величина, которую невозможно разложить дальше, а базовый тип данных JAVA — это скаляр (например, int, long и другие базовые типы данных, ссылочные типы и т. д.). Противоположность скаляра. представляет собой количество, которое может быть дополнительно разложено, и это количество называется количеством полимеризации. В JAVA объекты представляют собой агрегаты, которые можно дополнительно разложить.
Большие объекты — это объекты, которым требуется большой объем непрерывной памяти (например, строки и массивы). Параметр JVM -XX:PretenureSizeThreshold может устанавливать размер больших объектов. Если объект превышает установленный размер, он напрямую войдет в старое поколение и не попадет в молодое поколение. Этот параметр действителен только для двух сборщиков Serial и ParNew.
Например, установите параметры JVM: -XX:PretenureSizeThreshold=1000000 (единица измерения — байты) -XX:+UseSerialGC. Если вы выполните первую программу выше, вы обнаружите, что большой объект напрямую входит в старое поколение.
Почему должно быть так?
Во избежание операций копирования при выделении памяти под большие объекты и снижения эффективности.
В области Выжившего, где в данный момент размещен объект (одна из областей, область s, где находится объект), общий размер пакета объектов превышает 50% размера памяти этой области Выживания (-XX :TargetSurvivorRatio), то в это время оно больше, чем Объекты, равные максимальному возрасту этой партии объектов, могут напрямую войти в старый возраст. Например, в зоне Survivor есть партия объектов. Сумма нескольких возрастных объектов с возрастом 1 + возрастом 2 + возрастом n превышает 50% области Выжившего. В это время все объекты с возрастом n (включительно) и выше будут помещены в старое поколение. Это правило на самом деле надеется, что объекты, которые могут выжить в течение длительного времени, вступят в старость как можно скорее. Механизм оценки динамического возраста объекта обычно срабатывает после незначительного сбора данных.
Перед каждым второстепенным сборщиком мусора в молодом поколении JVM вычисляет оставшееся свободное пространство в старом поколении.
Если доступное пространство меньше суммы размеров всех существующих объектов молодого поколения (включая мусорные объекты)
Он проверит, установлен ли параметр «-XX:-HandlePromotionFailure» (установленный по умолчанию в jdk1.8).
Если этот параметр присутствует, он проверит, превышает ли размер доступной памяти в старом поколении средний размер объектов, поступивших в старое поколение после каждого предыдущего второстепенного сборщика мусора.
Если результат предыдущего шага меньше или параметры, упомянутые ранее, не установлены, то будет запущен полный сборщик мусора, и старое поколение и молодое поколение будут собраны вместе, если для хранения нового все еще недостаточно места. объектов после переработки произойдет «ООМ».
Конечно, если размер оставшихся уцелевших объектов, которые необходимо переместить в старое поколение после второстепенного сборщика мусора, все еще больше, чем доступное пространство в старом поколении, после полного сборщика мусора также будет запущен полный сборщик мусора, если таковой имеется. все еще нет места для уцелевших объектов после второстепенного gc, тоже произойдет "ООМ"
Несколько основных загрузчиков классов tomcat:
commonLoader: самый простой загрузчик классов Tomcat. Доступ к классам в пути загрузки может осуществляться самим контейнером Tomcat и каждым веб-приложением;
catalinaLoader: частный загрузчик классов контейнера Tomcat. Классы в пути загрузки не видны веб-приложению;
SharedLoader: загрузчик классов, общий для каждого веб-приложения. Классы в пути загрузки видны всем веб-приложениям, но не контейнеру Tomcat.
WebappClassLoader: частный загрузчик классов каждого веб-приложения. Классы в пути загрузки видны только текущему веб-приложению, например, загрузка связанных классов в военном пакете. Каждое приложение военного пакета имеет свой собственный WebappClassLoader для обеспечения взаимной изоляции, например, другого военного пакета. приложения представлены различные версии Spring, чтобы реализация могла загружать соответствующие версии Spring;