Классовый загрузочный область включает четыре загрузчика: загрузчик запуска (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.
Память кучи 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, хранит объекты с долгим сроком жизни в приложении |
Алгоритм подсчета ссылок довольно прост. Он заключается в том, чтобы выделить место в заголовке объекта для хранения количества ссылок на этот объект. Если объект ссылается на другой объект, счетчик ссылок увеличивается на единицу. Если ссылка на объект удаляется, счетчик ссылок уменьшается на единицу. Когда счетчик ссылок на объект становится равным нулю, объект считается мусором и подлежит сборке.
Преимущества
Недостатки1. В каждом присваивании значений требуется выполнение значительных вычислений, особенно если есть рекурсивные вызовы. Это усложняет процесс.
2. Один из самых серьезных недостатков — циклические ссылки, то есть когда objA ссылается на objB, а objB ссылается на objA, но больше нигде нет ссылок на эти два объекта. В этом случае счетчики ссылок на эти два объекта будут равны 1, и они не смогут быть собраны. Как показано на следующем рисунке:
Это самый серьёзный недостаток метода подсчёта ссылок.
Основная идея RA: начать поиск с объектов, которые являются "корнями сборки мусора (GC Roots)", и продолжать поиск вниз по ссылкам. Путь, по которому проходит поиск, называется ссылочной цепью. Если объект не связан ни одной ссылочной цепью с корнем сборки мусора, он считается недоступным и подлежит сборке.
В Java могут быть корнями сборки мусора следующие объекты:
Параметры, которые остаются относительно стабильными во всех версиях JVM: -help -server -client -version -showversion -cp -classpath
Не стандартизованные параметры, которые меняются мало: -Xint: интерпретаторный режим -Xcomp: компиляция в машинный код при первом использовании -Xmixed: смешанный режим, когда JVM сама решает, компилировать ли в машинный код, по умолчанию используется смешанный режим
Формат: -XX[+-], где +- указывает на активацию или деактивацию параметра .
Пример: -XX:+UseConcMarkSweepGC активирует сборщик мусора CMS, -XX:+UseG1GC активирует сборщик мусора G1.
Формат: -XX:=, где значение параметра равно .
Пример: -XX:MaxGCPauseMillis=500 устанавливает максимальное время паузы сборки мусора в 500 миллисекунд, -XX:GCTimeRatio=19.
Использует 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
Команда jinfo входит в состав JDK и используется для просмотра расширенных параметров запущенного Java приложения, включая системные свойства Java и параметры командной строки JVM; также позволяет динамически изменять некоторые параметры JVM. При сбоях системы jinfo может получить информацию о конфигурации Java приложения из файла core.
Пример 1: без опций
Команда: jinfo pid Описание: выводит все параметры и системные свойства текущего процесса JVM.
Пример 2: -flag name
Команда: jinfo -flag name pid Описание: выводит параметр с указанным именем.
Используйте эту команду, чтобы просмотреть значение указанного параметра JVM. Например, проверьте, включен ли вывод логов сборки мусора (GC) в текущем процессе JVM.## 8. Изменения в Perm Space после JDK 8
После JDK 8 Perm Space был заменен на Metaspace; строковые константы переместились в кучу (heap).
Размер Metaspace по умолчанию не ограничен, обычно он зависит от объема памяти системы. JVM динамически изменяет этот параметр.
-XX:MetaspaceSize: начальный размер пространства метаданных (в байтах), выделенный для классов (начальное значение верхней границы на логическом уровне Oracle). Это значение является оценочным, слишком большое значение MetaspaceSize может увеличивать время сборки мусора. После сборки мусора размер пространства метаданных, вызывающий следующую сборку мусора, может увеличиться.
-XX:MaxMetaspaceSize: максимальный размер пространства метаданных, превышение которого приведет к полной сборке мусора (Full GC). По умолчанию это значение не ограничено, но должно зависеть от объема памяти системы. JVM динамически изменяет этот параметр.
Общие алгоритмы сборки мусора включают маркировку-удаление, маркировка-копирование, маркировка-упаковка, поколенческую сборку мусора.
Алгоритм маркировка-удаление состоит из двух этапов: маркировка и удаление. Сначала все объекты, которые должны быть собраны, помечаются, а затем все помеченные объекты удаляются.Этап маркировки: Процесс маркировки представляет собой анализ достижимости, который начинается с объектов GC Roots. Все объекты, достижимые от этих объектов, помечаются как достижимые, обычно путем записи информации в заголовок объекта.
Этап удаления: Процесс удаления включает проход по всей куче. Если объект не помечен как достижимый (по информации в заголовке объекта), он удаляется.
Недостатки:
Алгоритм маркировки-упаковки похож на алгоритм маркировки-очистки, но вместо копирования живых объектов в другую область памяти, они перемещаются в одну сторону памяти, а затем очищаются все области памяти за пределами границы. Таким образом, этот алгоритм не создаёт фрагментацию памяти. Алгоритм маркировки-упаковки повышает использование памяти и подходит для очистки старого поколения, где объекты живут длительное время.
Недостатки:
Эффективность низкая, так как требуется не только помечать живые объекты, но и упаковывать все адреса живых объектов, что менее эффективно, чем алгоритм копирования.
### 4) Генерационная коллекция (Generational Collection)
Алгоритм генерационной сборки мусора фактически представляет собой сочетание алгоритма копирования и алгоритма помечивания с последующей компактификацией; это не новый отдельный алгоритм. Обычно он делится на две категории: старшее поколение (Old Generation) и младшее поколение (Young Generation). В старшем поколении требуется мало сборки мусора, так как объекты, которые попадают в него, уже несколько раз помечены и не являются потенциально удаляемыми. В младшем поколении требуется много сборки мусора, так как здесь создаются временные объекты, которые требуются для выполнения операций.
Младшее поколение: Поскольку в младшем поколении создаётся множество временных объектов, большинство которых требуют сборки мусора, использование алгоритма копирования является наиболее эффективным.
Старшее поколение: В старшем поколении требуется сборка мусора для небольшого количиства объектов, которые уже несколько раз помечены и не являются потенциально удаляемыми. Поэтому используются алгоритмы помечивания с последующей очисткой или компактификацией.
java -XX:+PrintCommandLineFlags -version
UseSerialGC
UseParallelGC
UseConcMarkSweepGC
UseParNewGC
UseParallelOldGC
UseG1GC
CMS (Concurrent Mark Sweep) конкурентный сборщик, низкие паузы, подходит для приложений, чувствительных к времени отклика.
CMS (Concurrent Mark Sweep) обеспечивает низкие паузы при сборке мусора.
Неспособность обрабатывать плавающий мусор (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
Региональный подход к сборке мусора имеет главное преимущество в том, чтобы избежать сканирования всей памяти, а только отдельных областей. Сборщик мусора G1 (Garbage-First) предназначен для серверных приложений и используется в средах с несколькими процессорами и большим объемом памяти. Он обеспечивает высокую пропускную способность, при этом старается удовлетворить требования к времени пауз сборки мусора.
Цели дизайна G1-сборщика заключаются в замене CMS-сборщика. В сравнении с CMS, G1 проявляет следующие преимущества:
Основные характеристики G1-сборщика- Минимизация времени пауз STW: G1 может максимально использовать преимущества многопроцессорной и многокорневой среды, минимизируя время пауз STW;
Исключение полного сканирования всей памяти: требуется только сканирование по областям.## 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.
G1 требует использования памяти помноженной (в частности, карт помноженной, Remembered Set) для отслеживания отношений ссылок между молодым и старым поколениями, что приводит к значительному потреблению памяти, которое может достигать 20% или даже больше от общего объема кучи. Кроме того, поддержание памяти помноженной в G1 требует значительных затрат, увеличивая нагрузку выполнения и снижая эффективность.## 20. Сравнение G1 и CMS
Пример для Java 8:
-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, если заметно ограничение этого значения, можно увеличить его适度增加大小,通常情况下足够使用即可-XX:+UseSerialGC
, использовать последовательный сборщик-XX:+UseParallelGC
, использовать параллельный сборщик-XX:+UseConcMarkSweepGC
, использовать сборщик CMS-XX:ParallelGCThreads
, установить количество потоков для параллельной сборки мусора-XX:MaxGCPauseMillis
, максимальное время паузы сборки мусора в миллисекундах-XX:+UseG1GC
, использовать сборщик мусора G1-XX:CMSInitiatingOccupancyFraction, используется вместе с первым параметром, чтобы указать момент начала MajorGC -XX:+ExplicitGCInvokesConcurrent, позволяет вызову System.gc() запустить параллельную полную сборку мусора, рекомендуется использовать этот параметр -XX:+CMSScavengeBeforeRemark, позволяет включить или выключить попытку очистки (YGC) перед этапом переоценки в CMS, что может уменьшить время переоценки, рекомендуется использовать -XX:+ParallelRefProcEnabled, позволяет параллельно обрабатывать ссылки, что может увеличить скорость обработки и уменьшить время выполнения
-XX:MaxGCPauseMillis, используется для установки целевой длительности паузы, G1 будет стремиться достичь этой цели -XX:G1HeapRegionSize, используется для установки размера региона кучи, рекомендуется оставить значение по умолчанию -XX:InitiatingHeapOccupancyPercent, указывает, что когда использование всей кучи достигнет определенного процента (по умолчанию 45%), начнется этап параллельной переоценки -XX:ConcGCThreads, указывает количество потоков, используемых параллельным сборщиком мусора, значение по умолчанию зависит от платформы JVM, на которой он работает, не рекомендуется его изменять
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )