1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/yangdechao_admin-guage-notes

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
02JVM知识点总结.md 55 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 24.06.2025 02:12 0782333

1. Архитектура JVM

2. Типы загрузчиков классов

Классовый загрузочный область включает четыре загрузчика: загрузчик запуска (Bootstrap), расширение загрузчик (Extension), приложение загрузчик (Application) и пользовательский загрузчик (User-defined).

Загрузчики, встроенные в виртуальную машину:

Загрузчик запуска также известен как корневой загрузчик (Bootstrap), написан на C++, содержит встроенные классы программы, хранящиеся в $JAVA_HOME/jre/lib/rt.jar, такие как класс Object ② Расширение загрузчик (Extension), написан на Java, все классы, начинающиеся с javax, являются расширениями, хранящимися в $JAVA_HOME/jre/lib/ext/*.jar ③ Приложение загрузчик (Application), это загрузчик классов, созданных в приложении, также называемый системным загрузчиком классов, загружает все классы текущего приложения из classpath.

Пользовательский загрузчик Подкласс класса java.lang.ClassLoader, позволяющий пользователю настраивать способ загрузки классов. Если ваша программа имеет специальные требования, вы можете создать свой загрузчик классов. Исходный код загрузчика классов является абстрактным классом, поэтому при настройке загрузчика классов вам нужно определить свой загрузчик классов, который наследует от абстрактного класса ClassLoader, то есть MyClassLoader extends ClassLoader.

3. Структура распределения памяти кучи JVM

Память кучи JVM = молодое поколение (1/3) + старшее поколение (2/3)

Молодое поколение = Eden (рай) + Survivor0 (выживший 0) + Survivor1 (выживший 1)

Память кучи JVM разделена на молодое поколение (Young Generation) и старшее поколение (Old Generation). Молодое поколение состоит из области Eden и области Survivor. Область Survivor разделена на From Survivor и To Survivor.

Как видно из приведенной выше диаграммы, молодое поколение обычно занимает 1/3 памяти кучи JVM, так как молодое поколение хранит новые созданные объекты, а старшее поколение содержит большие объекты, живущие дольше, поэтому оно занимает большую часть памяти кучи JVM. Также можно заметить, что область Eden обычно занимает 4/5 молодого поколения, а две области Survivor занимают по 1/10 молодого поколения. Это связано с тем, что области Survivor содержат выжившие после сборки мусора объекты, и фактически только небольшая часть объектов выживает, поэтому они занимают меньшую часть памяти.

Компонент Описание
Young Generation Включает Eden + From Space + To Space
Eden Хранит новые объекты
Survivor Space Состоит из двух частей, хранит объекты, выжившие после каждой сборки мусора
Old Generation Tenured Generation Включает Old Space, хранит объекты с долгим сроком жизни в приложении

4. Определение JVM объекта как мусора

1) Метод подсчета ссылок

Алгоритм подсчета ссылок довольно прост. Он заключается в том, чтобы выделить место в заголовке объекта для хранения количества ссылок на этот объект. Если объект ссылается на другой объект, счетчик ссылок увеличивается на единицу. Если ссылка на объект удаляется, счетчик ссылок уменьшается на единицу. Когда счетчик ссылок на объект становится равным нулю, объект считается мусором и подлежит сборке.

Преимущества

  1. Возможность немедленной сборки мусора. Когда количество ссылок на объект становится равно нулю, это сразу же известно.
  2. Отсутствие времени паузы. Это легко понять, так как сборка мусора не требует специального потока GC, она выполняется бизнес-потоками. Поэтому нет необходимости приостанавливать работу всего мира (stop the world), хотя в многопоточной среде необходимы синхронизация и блокировка.

Недостатки1. В каждом присваивании значений требуется выполнение значительных вычислений, особенно если есть рекурсивные вызовы. Это усложняет процесс. 2. Один из самых серьезных недостатков — циклические ссылки, то есть когда objA ссылается на objB, а objB ссылается на objA, но больше нигде нет ссылок на эти два объекта. В этом случае счетчики ссылок на эти два объекта будут равны 1, и они не смогут быть собраны. Как показано на следующем рисунке:img

Это самый серьёзный недостаток метода подсчёта ссылок.

2) Метод поиска корней (анализ доступности RA)

Основная идея RA: начать поиск с объектов, которые являются "корнями сборки мусора (GC Roots)", и продолжать поиск вниз по ссылкам. Путь, по которому проходит поиск, называется ссылочной цепью. Если объект не связан ни одной ссылочной цепью с корнем сборки мусора, он считается недоступным и подлежит сборке.

В Java могут быть корнями сборки мусора следующие объекты:

  1. Объекты, на которые ссылаются в стеке виртуальной машины
  2. Объекты, на которые ссылаются статические свойства классов в области классов
  3. Объекты, на которые ссылаются константы в области классов
  4. Объекты, на которые ссылаются native методы в стеке native методов

5. Типы параметров JVM и их значения

1) Стандартные параметры

Параметры, которые остаются относительно стабильными во всех версиях JVM: -help -server -client -version -showversion -cp -classpath

2) X-параметры

Не стандартизованные параметры, которые меняются мало: -Xint: интерпретаторный режим -Xcomp: компиляция в машинный код при первом использовании -Xmixed: смешанный режим, когда JVM сама решает, компилировать ли в машинный код, по умолчанию используется смешанный режим

3) XX параметрыХарактеризуются ненормализованными параметрами, что делает их относительно нестабильными. Используются в основном для оптимизации JVM и отладки.

  1. Логический тип

Формат: -XX[+-], где +- указывает на активацию или деактивацию параметра .

Пример: -XX:+UseConcMarkSweepGC активирует сборщик мусора CMS, -XX:+UseG1GC активирует сборщик мусора G1.

  1. Нелогический тип

Формат: -XX:=, где значение параметра равно .

Пример: -XX:MaxGCPauseMillis=500 устанавливает максимальное время паузы сборки мусора в 500 миллисекунд, -XX:GCTimeRatio=19.

6. Часто используемые параметры JVM

  • -Xms: эквивалентен -XX:InitialHeapSize
  • -Xmx: эквивалентен -XX:MaxHeapSize
  • -Xms: начальный размер кучи
  • -Xmx: максимальный размер кучи
  • -XX:NewSize=n: устанавливает размер молодого поколения
  • -XX:NewRatio=n: устанавливает соотношение между молодым и старым поколениями. Например, если это 3, то соотношение между молодым и старым поколениями равно 1:3, а молодое поколение составляет 1/4 от общего размера молодого и старого поколений.
  • -XX:SurvivorRatio=n: устанавливает соотношение между областью Eden и двумя областями Survivor. Например, если это 3, то соотношение между Eden и Survivor равно 3:2, а одна область Survivor составляет 1/5 от общего размера молодого поколения.
  • -XX:MaxPermSize=n: устанавливает максимальный размер области постоянной памяти.## 7. Инструменты для оптимизации JVM

1) jps

Использует jps (JVM process Status) для просмотра всех запущенных процессов JVM, имени основного класса, параметров запуска JVM. Например, после запуска метода main класса JPSTest (метод main продолжает работу), выполнение команды jps -l показывает PID класса JPSTest равным 31354, а также параметры запуска JVM с помощью параметра -v.

3265
32914 sun.tools.jps.Jps
31353 org.jetbrains.jps.cmdline.Launcher
31354 com.danny.test.code.jvm.JPSTest
380

2) jinfo

Команда jinfo входит в состав JDK и используется для просмотра расширенных параметров запущенного Java приложения, включая системные свойства Java и параметры командной строки JVM; также позволяет динамически изменять некоторые параметры JVM. При сбоях системы jinfo может получить информацию о конфигурации Java приложения из файла core.

Пример 1: без опций

Команда: jinfo pid Описание: выводит все параметры и системные свойства текущего процесса JVM.

Пример 2: -flag name

Команда: jinfo -flag name pid Описание: выводит параметр с указанным именем.

img

img

Используйте эту команду, чтобы просмотреть значение указанного параметра JVM. Например, проверьте, включен ли вывод логов сборки мусора (GC) в текущем процессе JVM.## 8. Изменения в Perm Space после JDK 8

1) Какие изменения произошли в Perm Space после JDK 8?

После JDK 8 Perm Space был заменен на Metaspace; строковые константы переместились в кучу (heap).

2) Является ли размер Metaspace по умолчанию бесконечным?

Размер Metaspace по умолчанию не ограничен, обычно он зависит от объема памяти системы. JVM динамически изменяет этот параметр.

-XX:MetaspaceSize: начальный размер пространства метаданных (в байтах), выделенный для классов (начальное значение верхней границы на логическом уровне Oracle). Это значение является оценочным, слишком большое значение MetaspaceSize может увеличивать время сборки мусора. После сборки мусора размер пространства метаданных, вызывающий следующую сборку мусора, может увеличиться.

-XX:MaxMetaspaceSize: максимальный размер пространства метаданных, превышение которого приведет к полной сборке мусора (Full GC). По умолчанию это значение не ограничено, но должно зависеть от объема памяти системы. JVM динамически изменяет этот параметр.

9. Алгоритмы сборки мусора JVM

Общие алгоритмы сборки мусора включают маркировку-удаление, маркировка-копирование, маркировка-упаковка, поколенческую сборку мусора.

1) Маркировка-удаление (Mark-Sweep)

Алгоритм маркировка-удаление состоит из двух этапов: маркировка и удаление. Сначала все объекты, которые должны быть собраны, помечаются, а затем все помеченные объекты удаляются.Этап маркировки: Процесс маркировки представляет собой анализ достижимости, который начинается с объектов GC Roots. Все объекты, достижимые от этих объектов, помечаются как достижимые, обычно путем записи информации в заголовок объекта.

Этап удаления: Процесс удаления включает проход по всей куче. Если объект не помечен как достижимый (по информации в заголовке объекта), он удаляется.

Недостатки:

  • Низкая эффективность маркировки и удаления
  • Возможность образования большого количества фрагментов, что может привести к невозможности выделения памяти для больших объектов.

2) Маркировка-копирование (Copying)

2) Маркировка-копирование

2) Маркировка-копированиеПамять разделена на две равные части. В каждый момент времени используется только одна часть. Когда эта часть заполнена, все ещё живые объекты копируются в другую часть, а затем первая часть очищается. В настоящее время коммерческие виртуальные машины используют этот сборочный алгоритм для очистки молодого поколения, но не разделяют память на две равные части. Вместо этого память делится на большую область Eden и две меньшие области Survivor. При каждом проходе используется область Eden и одна из областей Survivor. При очистке живые объекты из Eden и одной из областей Survivor копируются одновременно в другую область Survivor. После этого очищаются Eden и использованная область Survivor. По умолчанию размеры области Eden и одной из областей Survivor в виртуальной машине HotSpot соотносятся как 8:1, что обеспечивает использование памяти на уровне 90 %. Если при каждой очистке выживает более 10 % объектов, то одной области Survivor будет недостаточно, и тогда потребуется использовать старое поколение для обеспечения распределения, то есть использовать пространство старого поколения.Недостатки:

  • Уменьшение памяти до половины приводит к потере половины памяти, что слишком дорого; если не хочется терять половину памяти, то требуется дополнительное пространство для обеспечения распределения, чтобы противостоять крайнему случаю, когда все объекты в используемой памяти являются живыми. Поэтому в старом поколении обычно нельзя использовать этот алгоритм напрямую.
  • Алгоритм копирования при высокой выживаемости объектов требует большого количества операций копирования, что снижает эффективность.

image

3) Маркировка-упаковка (Mark-Compact)

Алгоритм маркировки-упаковки похож на алгоритм маркировки-очистки, но вместо копирования живых объектов в другую область памяти, они перемещаются в одну сторону памяти, а затем очищаются все области памяти за пределами границы. Таким образом, этот алгоритм не создаёт фрагментацию памяти. Алгоритм маркировки-упаковки повышает использование памяти и подходит для очистки старого поколения, где объекты живут длительное время.

Недостатки:

Эффективность низкая, так как требуется не только помечать живые объекты, но и упаковывать все адреса живых объектов, что менее эффективно, чем алгоритм копирования.

image### 4) Генерационная коллекция (Generational Collection)

Алгоритм генерационной сборки мусора фактически представляет собой сочетание алгоритма копирования и алгоритма помечивания с последующей компактификацией; это не новый отдельный алгоритм. Обычно он делится на две категории: старшее поколение (Old Generation) и младшее поколение (Young Generation). В старшем поколении требуется мало сборки мусора, так как объекты, которые попадают в него, уже несколько раз помечены и не являются потенциально удаляемыми. В младшем поколении требуется много сборки мусора, так как здесь создаются временные объекты, которые требуются для выполнения операций.

Младшее поколение: Поскольку в младшем поколении создаётся множество временных объектов, большинство которых требуют сборки мусора, использование алгоритма копирования является наиболее эффективным.

Старшее поколение: В старшем поколении требуется сборка мусора для небольшого количиства объектов, которые уже несколько раз помечены и не являются потенциально удаляемыми. Поэтому используются алгоритмы помечивания с последующей очисткой или компактификацией.

10. Остановка всего мира (STW) в JVMОстановка всего мира (stop-the-world) означает, что JVM при выполнении сборки мусора останавливает выполнение приложения, и это происходит при использовании любого алгоритма сборки мусора. Когда происходит остановка всего мира, все потоки, кроме тех, которые необходимы для сборки мусора, находятся в состоянии ожидания до завершения задач сборки мусора. На самом деле, многие оптимизации сборки мусора направлены на сокращение времени остановки всего мира, чтобы обеспечить высокую пропускную способность системы и низкие задержки.## 11. Классификация сборщиков мусора в JVM

1) Последовательный сборщик (Serial)

  • Сборщик с одним потоком (все остальные рабочие потоки должны быть приостановлены во время сборки мусора, время приостановки называется паузой)
  • Прост и эффективен (в случае ограничения одним процессором, отсутствие затрат на взаимодействие потоков позволяет сосредоточиться на сборке мусора)
  • По умолчанию используется как сборщик мусора для молодого поколения в режиме client виртуальной машины

2) Параллельный сборщик (Parallel)

  • Многопоточный вариант последовательного сборщика, сборка мусора выполняется многими потоками
  • Первый выбор для сборщика мусора молодого поколения в режиме server виртуальной машины
  • Использует алгоритм копирования

3) Конкурентный сборщик (CMS)

  • Пользовательские потоки и потоки сборки мусора выполняются параллельно, что уменьшает время пауз
  • Использует алгоритм помечивания и очистки
  • Процесс: начальное помечивание -> конкурентное помечивание -> повторное помечивание -> конкурентное помечивание
  • Чувствителен к ресурсам CPU, использование ресурсов CPU замедляет программу
  • Неспособен обрабатывать плавающий мусор

4) Сборщик G1 (G1)- Параллелизм и конкурренция (способен уменьшить время пауз в условиях многопроцессорной среды, G1 может использовать конкурентность для обеспечения продолжения работы Java-программы)

  • Сборка по поколениям
  • Интеграция пространства, в целом: алгоритм помечивания и уплотнения, локально: алгоритм копирования## 12. Как узнать, какой сборщик мусора по умолчанию используется на сервере?
java -XX:+PrintCommandLineFlags -version

13. Какие сборщики мусора используются по умолчанию в JVM?

UseSerialGC
UseParallelGC
UseConcMarkSweepGC
UseParNewGC
UseParallelOldGC
UseG1GC

14. CMS сборщик в JVM

CMS (Concurrent Mark Sweep) конкурентный сборщик, низкие паузы, подходит для приложений, чувствительных к времени отклика.

1) Процесс выполнения

  • Начальное помечивание (CMS initial mark) ----- помечается все объекты, которые могут быть напрямую связаны с GC Roots, быстро, остановка всего мира.
  • Конкурентное помечивание (CMS concurrent mark) -------- этап конкурентного помечивания представляет собой процесс трассировки GC Roots.
  • Повторное помечивание (CMS remark) ----------- для исправления помеченных записей, которые были изменены в результате работы пользователя во время конкурентного помечивания, остановка всего мира.
  • Конкурентное очищение (CMS concurrent sweep) -------- процесс очистки помеченных объектов.

2) Преимущества

CMS (Concurrent Mark Sweep) обеспечивает низкие паузы при сборке мусора.

3) Недостатки- Конкурентная фаза занимает CPU-ресурсы, замедляет пользовательские программы и снижает пропускную способность. По умолчанию CMS использует (CPU + 3)/4 потоков.

  • Неспособность обрабатывать плавающий мусор (Floating Garbage). Мусор, созданный программой во время конкурентной фазы очистки, становится плавающим мусором и не может быть обработан в текущей операции. Чтобы оставить место для работы пользовательских программ, CMS начинает сборку мусора, когда объем использованной памяти в старом поколении достигает определенного процента. Это можно настроить с помощью параметра -XX:CMSInitiatingOccupancyFraction.

  • Использование алгоритма маркировки и очистки CMS приводит к образованию множества фрагментов свободной памяти в старом поколении, что затрудняет использование больших объектов. Параметр -UseCMSCompactAtFullCollection (по умолчанию true) позволяет настроить компактацию памяти при полной сборке мусора, вызванной CMS. Этот параметр увеличивает время паузы. Можно также настроить параметр -XX:CMSFullGCsBeforeCompaction (по умолчанию 0, то есть полная сборка мусора с компактацией выполняется после каждой полной сборки мусора) для определения количества полных сборок мусора без компактации перед выполнением сборки мусора с компактацией.## 15. Выбор сборщика мусора

  • Для одноядерных процессоров или систем с малым объемом памяти:

    -XX:+UseSerialGC

  • Для многопроцессорных систем, требующих максимальной пропускной способности (например, вычислительных приложений):

    -XX:+UseParallelGC или -XX:+UseParallelOldGC (взаимосвязанные параметры)

  • Для многопроцессорных систем, где требуется низкая продолжительность пауз и быстрое реагирование (например, интернет-приложений):

    -XX:+UseParNewGC или -XX:+UseConcMarkSweepGC

Пример развертывания и настройки Java SpringBoot микросервиса:

java -server -Xms1024m -Xmx1024m -XX:+UseG1GC -jar xxx.jar

16. Недостатки CMS-сборщика

  • Формирование фрагментированной памяти, что может привести к вызову полной сборки мусора для очистки памяти. Для крупных серверов полная сборка мусора может длиться несколько часов;
  • В процессе конкурентной очистки образуется плавающий мусор;
  • Сборка мусора должна сканировать всю память старого поколения, что не подходит для систем с большим объемом памяти;
  • Размеры молодого и старого поколений заранее определяются и не могут быть изменены динамически;
  • CMS-сборщик очень чувствителен к ресурсам CPU. Хотя конкурентная фаза не приводит к остановке пользовательских потоков, она использует часть потоков, что замедляет работу приложения и снижает его пропускную способность.## 17. Обзор G1-сборщика

Региональный подход к сборке мусора имеет главное преимущество в том, чтобы избежать сканирования всей памяти, а только отдельных областей. Сборщик мусора G1 (Garbage-First) предназначен для серверных приложений и используется в средах с несколькими процессорами и большим объемом памяти. Он обеспечивает высокую пропускную способность, при этом старается удовлетворить требования к времени пауз сборки мусора.

Цели дизайна G1-сборщика заключаются в замене CMS-сборщика. В сравнении с CMS, G1 проявляет следующие преимущества:

  • Не создает фрагментацию памяти: G1 — это сборщик мусора с процессом упорядочивания памяти, который не создает много фрагментации памяти;
  • Контролируемое время пауз: G1 обеспечивает более контролируемое время пауз Stop-The-World (STW), добавляя предсказательные механизмы для времени пауз, что позволяет пользователям указывать желаемое время пауз.

Основные характеристики G1-сборщика- Минимизация времени пауз STW: G1 может максимально использовать преимущества многопроцессорной и многокорневой среды, минимизируя время пауз STW;

  • Отсутствие фрагментации памяти: G1 использует алгоритм пометки и упорядочивания в общем, а локально — алгоритм копирования, что позволяет избежать фрагментации памяти;
  • Макроскопически G1 больше не делит память на молодую и старую: память разделена на несколько независимых подобластей (region);
  • Молодая и старая генерации больше не физически разделены: в G1-сборщике вся память объединена, но внутри она все еще делится на молодую и старую генерации, хотя они больше не физически разделены, а представляют собой набор region, которые не обязательно должны быть последовательными. Это значит, что различные области могут обрабатываться различными методами сборки мусора;
  • Логическая последовательность областей: хотя G1 и является поколенческим сборщиком мусора, весь процесс деления памяти не имеет физического разделения на молодую и старую генерации. Также не требуется полностью независимый область для выживания (to space) для подготовки к копированию. У G1 есть только логическое понятие поколений, то есть каждая область может быть частью различных поколений в зависимости от текущего состояния;- Области памяти стали одинакового размера: основное изменение касается Eden, Survivor и Tenured областей памяти, которые больше не являются последовательными, а представлены множеством областей одинакового размера (Region). Размер области может варьироваться от 1М до 32М. Одна область может относиться к Eden, Survivor или Tenured областям памяти;
  • Исключение полного сканирования всей памяти: требуется только сканирование по областям.## 18. Настройка и оптимизация параметров сборщика мусора G1 Опции и значения по умолчанию Описание
    -XX:+UseG1GC Использование сборщика мусора Garbage First (G1)
    -XX:MaxGCPauseMillis=n Установка максимальной паузы при сборке мусора. Это приближенное значение, JVM будет стремиться его удовлетворить.
    -XX:InitiatingHeapOccupancyPercent=n Установка порогового значения использования Java-кучи для запуска маркировки. По умолчанию это 45% всей Java-кучи. Значение по умолчанию 45.
    -XX:NewRatio=n Соотношение размеров young и old генераций. Значение по умолчанию 2.
    -XX:SurvivorRatio=n Соотношение размеров областей Eden и Survivor. Значение по умолчанию 8.
    -XX:MaxTenuringThreshold=n Максимальное значение порога для перехода объектов в старшие генерации. Значение по умолчанию 15. Обратите внимание: максимальное значение — 15, не превышайте его, иначе это может вызвать насмешки. Причина: JVM использует 4 бита (1111) для представления этого значения.
    -XX:ParallelGCThreads=n Установка количества потоков для параллельной фазы сборки мусора. Значение по умолчанию зависит от платформы, на которой работает JVM.

| -XX:G1ReservePercent=n | Установка процента зарезервированного пространства для снижения вероятности неудачного перехода объектов. Значение по умолчанию 10. | | -XX:G1HeapRegionSize=n | При использовании G1 Java-куча разбивается на равные области. Этот параметр устанавливает размер каждой области. Значение по умолчанию определяется вручную в зависимости от размера кучи. Минимальное значение — 1Мб, максимальное — 32Мб. | | -XX:G1PrintRegionLivenessInfo | Значение по умолчанию false. Выводит информацию о живых областях кучи во время параллельной маркировки. | | -XX:G1PrintHeapRegions | Значение по умолчанию false. Выводит информацию о распределении и освобождении областей кучи. | | -XX:+PrintSafepointStatistics | Выводит информацию о причинах остановок. | | -XX:PrintSafepointStatisticsCount=1 | Выводит информацию о причинах остановок. | | -XX:+PrintGCApplicationStoppedTime | Выводит время остановок при сборке мусора в лог GC. | | -XX:-UseBiasedLocking | Отключает использование предвзятого琐碎的翻译信息已经纠正,请查看完整和正确的翻译:

| -XX:ConcGCThreads=n | Установка количества потоков для конкурентной фазы сборки мусора. Значение по умолчанию зависит от платформы, на которой работает JVM. | | -XX:G1ReservePercent=n | Установка процента зарезервированного пространства для снижения вероятности неудачного перехода объектов. Значение по умолчанию 10. | | -XX:G1HeapRegionSize=n | При использовании G1 Java-куча разбивается на равные области. Этот параметр устанавливает размер каждой области. Значение по умолчанию определяется вручную в зависимости от размера кучи. Минимальное значение — 1Мб, максимальное — 32Мб. | | -XX:G1PrintRegionLivenessInfo | Значение по умолчанию false. Выводит информацию о живых областях кучи во время параллельной маркировки. | | -XX:G1PrintHeapRegions | Значение по умолчанию false. Выводит информацию о распределении и освобождении областей кучи. | | -XX:+PrintSafepointStatistics | Выводит информацию о причинах остановок. | | -XX:PrintSafepointStatisticsCount=1 | Выводит информацию о причинах остановок. | | -XX:+PrintGCApplicationStoppedTime | Выводит время остановок при сборке мусора в лог GC. | | -XX:-UseBiasedLocking | Отключает использование предвзятого замка.| -XX:-UseBiasedLocking | Отключить использование предвзятого замка | | -XX:+UseGCLogFileRotation | Включить вращение файла лога сборки мусора, чтобы избежать потери памяти | | -XX:+PerfDisableSharedMem | Отключить общую память для статистики производительности jstat, использовать JMX вместо этого | | | | G1 GC — это региональный, параллельный-конкурентный, инкрементальный сборщик мусора, который по сравнению с другими сборщиками мусора HotSpot обеспечивает более предсказуемые приостановки. Инкрементальная природа делает G1 GC подходящим для больших куч, обеспечивая хорошую реакцию даже в худшем случае. Адаптивные возможности G1 GC позволяют JVM работать с минимальной информацией на командной строке, такой как максимальное значение целевых приостановок реального времени, максимальное и минимальное значения размера кучи Java.

19. Недостатки G1 сборщика мусора

G1 требует использования памяти помноженной (в частности, карт помноженной, Remembered Set) для отслеживания отношений ссылок между молодым и старым поколениями, что приводит к значительному потреблению памяти, которое может достигать 20% или даже больше от общего объема кучи. Кроме того, поддержание памяти помноженной в G1 требует значительных затрат, увеличивая нагрузку выполнения и снижая эффективность.## 20. Сравнение G1 и CMS

  • G1 имеет преимущество в компактном использовании памяти
  • G1 избегает проблем фрагментации памяти путём разделения памяти на области (Regions)
  • Eden, Survivor, Old области больше не являются фиксированными, что делает использование памяти более гибким
  • G1 позволяет контролировать время приостановок сборки мусора, устанавливая целевые времена приостановок, чтобы избежать эффекта "снежного кома" приложения, что делает его более управляемым
  • После сборки мусора G1 сразу же объединяет свободные области памяти, в то время как CMS по умолчанию выполняет это во время STW (stop the world)
  • G1 используется в Young GC, в то время как CMS может использоваться только в O области
  • Алгоритм SATB (Snapshot At The Begining) позволяет значительно снизить задержку на этапе remark и избегает полного сканирования всей кучи благодаря использованию RSet, что делает G1 более подходящим для больших куч, а также делает его более управляемым

21. Часто используемые параметры конфигурации JVM

Пример для Java 8:

1) Логи

-XX:+PrintFlagsFinal — вывод всех параметров JVM -XX:+PrintGC — вывод информации о сборке мусора -XX:+PrintGCDetails — вывод подробной информации о сборке мусора -XX:+PrintGCTimeStamps — вывод меток времени сборки мусора -Xloggc:filename — установка местоположения файла логов сборки мусора -XX:+PrintTenuringDistribution — вывод распределения возраста объектов после сборки мусора### 2) Настройки памяти

  • -Xms, установка начального размера памяти стека
  • -Xmx, установка максимального размера памяти стека
  • -Xmn, установка размера молодого поколения
  • -Xss, установка размера стека потока
  • -XX:NewRatio, соотношение молодого и старшего поколений
  • -XX:SurvivorRatio, соотношение областей Eden и двух областей Survivor в молодом поколении, по умолчанию равно 8, то есть Eden:Srv:Srv = 8:1:1
  • -XX:MaxTenuringThreshold, максимальный возраст для перехода из молодого поколения в старшее, по умолчанию 6 для CMS и 15 для G1
  • -XX:MetaspaceSize, установка размера метасpaces, превышение которого вызывает сборку мусора
  • -XX:MaxMetaspaceSize, максимальный размер метасpaces
  • -XX:MaxDirectMemorySize, установка максимального размера прямой памяти, ограничивающей память, запрошенную через DirectByteBuffer
  • -XX:ReservedCodeCacheSize, установка размера области хранения скомпилированных методов JIT, если заметно ограничение этого значения, можно увеличить его适度增加大小,通常情况下足够使用即可

3) Настройка сборщиков мусора

  • -XX:+UseSerialGC, использовать последовательный сборщик
  • -XX:+UseParallelGC, использовать параллельный сборщик
  • -XX:+UseConcMarkSweepGC, использовать сборщик CMS
  • -XX:ParallelGCThreads, установить количество потоков для параллельной сборки мусора
  • -XX:MaxGCPauseMillis, максимальное время паузы сборки мусора в миллисекундах
  • -XX:+UseG1GC, использовать сборщик мусора G1

4) Настройки сборщика мусора CMS-XX:+UseCMSInitiatingOccupancyOnly

-XX:CMSInitiatingOccupancyFraction, используется вместе с первым параметром, чтобы указать момент начала MajorGC -XX:+ExplicitGCInvokesConcurrent, позволяет вызову System.gc() запустить параллельную полную сборку мусора, рекомендуется использовать этот параметр -XX:+CMSScavengeBeforeRemark, позволяет включить или выключить попытку очистки (YGC) перед этапом переоценки в CMS, что может уменьшить время переоценки, рекомендуется использовать -XX:+ParallelRefProcEnabled, позволяет параллельно обрабатывать ссылки, что может увеличить скорость обработки и уменьшить время выполнения

5) Настройки сборщика мусора G1

-XX:MaxGCPauseMillis, используется для установки целевой длительности паузы, G1 будет стремиться достичь этой цели -XX:G1HeapRegionSize, используется для установки размера региона кучи, рекомендуется оставить значение по умолчанию -XX:InitiatingHeapOccupancyPercent, указывает, что когда использование всей кучи достигнет определенного процента (по умолчанию 45%), начнется этап параллельной переоценки -XX:ConcGCThreads, указывает количество потоков, используемых параллельным сборщиком мусора, значение по умолчанию зависит от платформы JVM, на которой он работает, не рекомендуется его изменять

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/yangdechao_admin-guage-notes.git
git@api.gitlife.ru:oschina-mirror/yangdechao_admin-guage-notes.git
oschina-mirror
yangdechao_admin-guage-notes
yangdechao_admin-guage-notes
master