Удачи: сбросьте десять основных очков знаний JVM, быстро соберите пакеты

Java

在这里插入图片描述

Танский монах: Драконы не такие, как ты, чтобы ездить верхом

Желание улучшить собственную внутреннюю силу программиста — это не что иное, как数据结构跟算法 + 操作系统 + 计网 + 底层И весь Java-код выполняется на JVM, понимание преимущества JVM заключается в следующем:

Пишите более качественный и надежный код.
Повышение производительности Java и устранение неполадок.
面试必问, иметь определенную глубину знаний.

1. Краткое описание модели памяти JVM

在这里插入图片描述
С точки зрения макросов JVMобласть памятиразделен на три части线程共享区域,线程私有区域,直接内存区域.

1.1, общая область потока

1.1.1, область кучи

Область кучи Куча — это самая большая область памяти в JVM, и в основном все экземпляры объектов размещаются в куче. Площадь кучи делится намолодое поколениеа такжестарость, в котором молодое поколение разделено на три части: Эдем, S0 и S1, их соотношение по умолчанию равно8:1:1размер.

1.1.1 Метапространство

область метода:

  1. В «Спецификации виртуальной машины Java» оговаривается только наличие方法区такой概念с этим作用.HotSpotСделано до JDK8永久代Понимаю эту концепцию. Он в основном используется для хранения данных, таких как информация о классе, постоянного пула, статических переменных и скомпилированного кода JIT.
  2. Информация о метаданных классов в PermGen (постоянная генерация)FullGCмогут быть собраны, но оценки едва ли удовлетворительны. А сколько места выделено под PermGen потому что трудно определить размер для хранения вышеперечисленных различных данных. Поэтому официалы убрали постоянную генерацию в JDK8.

Официальное объяснение состоит в том, чтобы удалить постоянное поколение:

  1. This is part of the JRockit and Hotspot convergence effort. JRockit customers do not need to configure the permanent generation (since JRockit does not have a permanent generation) and are accustomed to not configuring the permanent generation.
  2. То есть: удаление постоянного поколения — это попытка интегрировать HotSpot JVM и JRockit VM, потому что у JRockit нет постоянного поколения и ему не нужно настраивать постоянное поколение.

метапространство:

использовать в Java永久代Это не лучший способ хранения таких данных, как информация о классах, константы, статические переменные и т. д., поскольку легко вызвать переполнение памяти. В то же время настроить производительность постоянного поколения также сложно, поэтому в JDK8 ставим永久代удалено, введено метапространствоmetaspace, исходный класс, поле и другие переменные помещаются в метапространство.

Суммировать:

元空间的本质和永久代类似,都是对JVM规范中方法区的实现. Но самая большая разница между метапространством и постоянной генерацией заключается в следующем:元空间并不在虚拟机中,而是使用本地内存. Поэтому по умолчанию размер метапространства ограничен только локальной памятью, но размер метапространства можно указать параметрами.

1.2, прямая область памяти

прямая память:

Общее использованиеNativeФункции манипулируют кодом C++ для прямого выделения памяти вне кучи, которая не является частью области данных среды выполнения виртуальной машины и не является областью памяти, определенной в спецификации виртуальной машины Java. Эта память не ограничена размером пространства кучи Java, но ограничена общим объемом памяти машины, поэтому также возникнет исключение OOM. После выделения местаИзбегайте копирования данных туда и обратно между областью кучи Java и собственной кучей., что может эффективно повысить эффективность чтения и письма,Но его создание и уничтожение происходит медленнее, чем у обычного буфера..

PS: если используетсяNIO, локальная область памяти будет использоваться часто.В настоящее время память jvm ≈ область методов + куча + стек + прямая память

1.3, приватная область потока

Счетчик программ, стек виртуальной машины и стек собственных методов аналогичны циклу объявления потока.

1.3.1, счетчик программ

В классе, например, вы читаете роман "Чжу Сянь". Когда вы видите главу 1412, учитель просит вас ответить на вопрос. В это время вы должны сначала ответить на вопрос учителя, а затем продолжить чтение после ответа. В это время вы можете использовать закладки или полагаться на то, что память запоминает, где вы ищете, и таким образом вы можете продолжать чтение.

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

  1. приватный поток

В случае многопоточности каждый поток должен одновременно иметь свой независимый счетчик программ, чтобы поток все еще мог быть восстановлен в исходное положение после переключения.

  1. OutOfMemoryError не указан

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

  1. Значение пусто, когда выполняется метод Native.

NativeБольшинство методов реализованы на C и не компилируются в инструкции байт-кода, которые необходимо выполнить, поэтому нет необходимости хранить номер строки файла байт-кода.

1.3.2, стек виртуальных машин

Метод в стеке и вне стека: вызываемый метод будет упакован вкадр стека, кадр стека должен содержать по крайней мере одну таблицу локальных переменных, стек операндов, область данных кадра и динамическую ссылку.
在这里插入图片描述

динамическая ссылка:

При условии, что кадр стека содержит ссылку на пул констант времени выполнения, синтаксический анализ и замена ссылки символической ссылки на прямую ссылку будут выполняться при загрузке класса.

таблица локальных переменных:

Таблица локальных переменных — одна из важных частей фрейма стека. В основном он сохраняет параметры функций и информацию о локальных переменных. Областью переменных в таблице локальных переменных является вызываемая в данный момент функция. После завершения вызова функции с разрушением кадра стека функций. Таблица локальных переменных также будет уничтожена, освободив место.

стек операндов:

Сохраняет данные во время выполнения виртуальной машины Java.

адрес возврата метода:

Место, где вызывается метод, фактически эквивалентно извлечению текущего кадра стека при выходе из метода.

Например, чтобы выполнить простое сложение и вычитание:

public class ShowByteCode {
    private String xx;
    private static final int TEST = 1;
    public ShowByteCode() {
    }
    public int calc() {
        int a = 100;
        int b = 200;
        int c = 300;
        return (a + b) * c;
    }
}

воплощать в жизньjavap -c *.class:
在这里插入图片描述

1.3.3, локальный стек методов

Подобно стеку виртуальных машин, он обслуживает только используемые собственные методы.

2. Определить, жив ли объект

Требуется, если места JVM недостаточноGarbage CollectionТеперь необходимо восстановить общую общую область, такую ​​как область кучи и область методов. Что нужно сделать, прежде чем делать восстановление памяти, этоОпределить, какие объекты мертвы, а какие живы. Есть два распространенных метода引用计数法а также可达性分析.

2.1, метод подсчета ссылок

Идея состоит в том, чтобы добавить счетчик ссылок к объекту Java. Всякий раз, когда есть ссылка на него, счетчик будет +1; если ссылка недействительна, он будет -1. Когда счетчик не равен 0, объект оценивается как живой; в противном случае он считается мертвым (счетчик = 0) .
преимущество:

Прост в реализации и эффективен в оценке.

недостаток:

Невозможно разрешить между объектамивзаимная циклическая ссылкаПроблема

class GcObject {
    public Object instance = null;
}
public class GcDemo {
    public static void main(String[] args) {
        GcObject object1 = new GcObject(); // step 1 
        GcObject object2 = new GcObject(); // step 2
        
        object1.instance = object2 ;//step 3
        object2.instance = object1; //step 4
        
        object1 = null; //step 5
        object2 = null; // step 6
    }
}

шаг 1: счетчик ссылок экземпляра GcObject 1 + 1, счетчик ссылок экземпляра 1 = 1
Шаг 2: счетчик ссылок экземпляра GcObject 2 + 1, счетчик ссылок экземпляра 2 = 1.
шаг 3: счетчик ссылок экземпляра GcObject 2 + 1, счетчик ссылок экземпляра 2 = 2
шаг 4: счетчик ссылок экземпляра GcObject 1 + 1, счетчик ссылок экземпляра 1 = 2
Шаг 5: Счетчик ссылок экземпляра GcObject 1 равен -1, результат равен 1.
Шаг 6: Счетчик ссылок экземпляра GcObject 2 равен -1, результат равен 1.

Приведенный выше анализ показывает, что ссылочные номера экземпляра 1 и экземпляра 2 не равны 0, а ссылаются друг на друга, и память, занятая этими двумя экземплярами, не может быть освобождена.

2.2, анализ доступности

Используются многие основные коммерческие языки (такие как Java, C#).引用链法Чтобы судить о том, является ли объект живым, общая идея состоит в том, чтобы объединить рядGC RootsОбъекты используются в качестве отправных точек для поиска вниз. В языке Java его можно использовать какGC RootsК объектам относятся следующие:

  1. ПервыйСсылочные объекты в стеке виртуальной машины, создайте объект нормально в программе, объект откроет пространство в куче, и при этом сохраните адрес этого пространства как ссылку на стек виртуальной машины, если жизненный цикл объекта закончится, ссылка будет быть удаленным из стека виртуальной машины. Он выталкивается из стека, поэтому, если в стеке виртуальной машины есть ссылка, это означает, что объект все еще полезен, что является наиболее распространенной ситуацией.
  2. Второе это мыГлобальный статический объект определен в классе, то есть используяstaticключевое слово, так как стек виртуальной машины является частным для потока, ссылка на этот объект будет сохранена в области общих методов, очевидно, необходимо использовать статическую ссылку в области методов в качестве корней GC.
  3. Третийпостоянная ссылка, это использоватьstatic finalПоскольку эта ссылка не будет изменена после инициализации, объекты, на которые ссылаются в постоянном пуле области метода, также должны использоваться в качестве корней GC.
  4. Четвертое — использоватьJNIКогда дело доходит до технологии, иногда чистый код Java не может удовлетворить наши потребности, нам может потребоваться вызвать код C или C++ в Java, поэтому мы будем использоватьСобственный метод, в памяти JVM есть специальный локальный стек методов для сохранения ссылок на эти объекты, поэтому объекты, на которые есть ссылки в локальном стеке методов, также будут использоваться как корни GC.

Шаг GC Root в основном включает следующие три шага:

2.1.1 Анализ доступности

在这里插入图片描述
Когда объект переходит в GC RootsКогда никакая цепочка ссылок не связана, объект считается недостижимым.
Уведомление: анализ достижимости предназначен только для определения того, достижим ли объект, но этого недостаточно, чтобы определить, является ли объект живым/мертвым.

2.1.2 Первая маркировка и проверка

Отфильтрованный объект условия如果没有重写finalize或者调用过finalizeЗатем добавьте объект в F-очередь

2.1.3 Вторая маркировка и досмотр

Когда объект был помечен и отфильтрован в первый раз, он будет помечен и готов к просмотру во второй раз.После фильтрации по F-Queue, если объект не установил ссылочную связь с GC Root, он будет переработан, который принадлежит второму шансу.

在这里插入图片描述

2.3 Четыре основных типа ссылок

2.3.1 Сильные ссылки

Сильная ссылка (StrongReference) является наиболее часто используемой ссылкой. Сборщик мусора никогда не будет его перерабатывать, а при нехватке памяти скорее выбросит OOM, чтобы вызвать исключение программы, которым является обычный новый объект.

2.3.2 Мягкие ссылки

Сборщик мусора не будет перерабатывать объект SoftReference, когда памяти достаточно, и будет перерабатывать его, когда памяти недостаточно, что особенно подходит для создания кешей.

2.3.3 Слабые ссылки

Слабая ссылка (WeakReference) предназначена для восстановления объекта при сканировании объекта независимо от того, достаточно ли памяти.ThreadLocalКлюч является слабой ссылкой.

2.3.4 Фантомные ссылки

Если объект имеет только фантомные ссылки (PhantomReference), то, как если бы ссылок вообще не было, любое соответствие может быть восстановлено. В основном используется для отслеживания объектов и действий по сбору мусора.

3. Алгоритм сборки мусора

Для того, чтобы махнуть руками на переработку мусора, операционная система вообще использует标记清除,复制算法,标记整理Кратко представим три алгоритма, каждый из которых имеет свои преимущества и недостатки:

3.1. Удаление меток

在这里插入图片描述
принцип:

Алгоритмы делятся на标记а также清除Два этапа: сначала отметить все объекты, которые необходимо переработать, и равномерно переработать все отмеченные объекты после завершения маркировки.

недостаток:

После того, как метка будет очищена, будет сгенерировано большое количество прерывистых фрагментов памяти, что приведет к запуску GC.

3.2, отметить копию

在这里插入图片描述
принцип:

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

недостаток:

Этот алгоритм достигается за счет сокращения памяти вдвое и перемещения данных туда и обратно.

3.3, отметьте отделку

在这里插入图片描述
принцип:

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

недостаток:

Включает перемещение большого количества объектов, что неэффективно.

Суммировать:

показатель очистка разметки разметка Копия тега
скорость Средняя самый медленный быстро
пространство над головой Меньше (но будет накапливаться мусор) Меньше (не накапливает мусор) Обычно в 2 раза больше живого объекта (без скопления мусора)
движущийся объект нет да да

3.4, трехцветная метка и барьер чтения-записи

在这里插入图片描述
Все три алгоритма переработки, упомянутые выше, были упомянуты первыми.标记, как обозначена проблема?说话说一半,小心没老伴!

Следующие пункты знания лично чувствуют, что интервью должно быть не таким глубоким, но для того, чтобыПритворись, что должен отметить!CMS,G1Обычно используется для обозначениятрехцветная маркировка, в соответствии с анализом достижимости доступ к обходу начинается с корней GC, достижимые объекты — это уцелевшие объекты, а конечный недостижимый означает, что объекты необходимо GCировать. Общий процесс заключается в том, чтобы взять объекты, встречающиеся в процессе обхода графа объектов, нажать是否访问过Это состояние отмечено следующими тремя цветами:

белый: еще не посещал.
чернить: Был осуществлен доступ к этому объекту, а также доступ ко всем другим объектам, на которые ссылается этот объект.
серый: к этому объекту был осуществлен доступ, но другие объекты, на которые ссылается этот объектНе все посетили. Он будет преобразован в черный после всех посещений.

在这里插入图片描述
Предполагая, что теперь есть три набора белого, серого и черного (представляющих цвет текущего объекта), выполните процесс доступа:

1. Изначально все объекты находятся в белом наборе.
2. Переместите объекты, на которые непосредственно ссылается GC Roots, в серый набор.
3. Получить объект из серого набора: первый шаг — переместить все другие объекты, на которые ссылается этот объект, в серый набор, а второй шаг — переместить этот объект в черный набор.
4. Повторяйте шаг 3, пока серый набор не станет пустым.
5. Объекты, которые остаются в белой коллекции после окончания, являются GC Rootsнедостижимый, вы можете попробовать переработать.

Ссылки между объектами не меняются во время STW, и маркировку можно легко сделать. Когда параллельная маркировка поддерживается, ссылки между объектами могут изменяться, а также могут возникать множественные маркировки и отсутствующие маркировки.

3.4.1,плавающий мусор

ситуация: Поток GC переходит к E (E выделен серым цветом), бизнес-поток выполняет D.E = null, и в это время E должен быть перезапущен. Но поток GC уже думает, что E серый, и будет продолжать обход, в результате чего E не будет переработан.

在这里插入图片描述

3.4.2,Отсутствует отметка

在这里插入图片描述

Поток GC переходит к E (затенен). Бизнес-поток выполняет операции отключения E->G и связи D->G. Поток GC обнаруживает, что E не может достичь G, потому что он черный и больше не будет пересекать маркеры. В конечном итоге привести к отсутствующей метке G.
Есть два необходимых условия для пропущенных ставок:от серого к белому разъединение,черно-белая сборка.

Object G = E.G;    // 第一步 :读
Object E.G = null; // 第二步:写
Object D.G = G;   // 第三步:写

Отсутствует решение для этикетки:

Сохраните объект G в определенной коллекции, а затем выполните операции над объектами в коллекции после прохождения параллельной метки.重新标记.

3.4.2.1 Схема CMS

Вот, например, B указывает на C в начале, но затем B не указывает на C, а A указывает на D. Проще всегопревратить А в серый, и дождитесь следующего обхода.
在这里插入图片描述
CMS может вызватьABAвопрос:

1. Поток рециркуляции m1 маркирует A, маркирует атрибут A.1 и маркирует атрибут A.2.
2. Бизнес-поток m2 указывает атрибут 1 на C, потому что схема CMS повторно использует поток m3 и помечает A серым цветом.
3. Перерабатывающая нить m1 считает, что все атрибуты помечены, и устанавливает A в черный цвет, в результате C отсутствует. Поэтому этап CMS необходимо перемаркировать.

在这里插入图片描述

3.4.2.2, барьеры чтения и записи

Реализация отсутствующих целей состоит из трех шагов: JVM добавляет барьер чтения-записи, барьер чтения используется для перехвата первого шага, а барьер записи используется для перехвата второго и третьего шагов.

Напишите барьер + SATB (исходный снимок), чтобы разрушить разрыв между серым и белым.
Напишите барьер + добавочное обновление, чтобы сломать черно-белую сборку.
Барьер чтения Консервативный способ уничтожить хранилище белого после отключения серого-белого, в данном случае барьер чтения в порядке.

Современные сборщики мусора, использующие анализ достижимости, почти все заимствуют идею алгоритма трехцветной маркировки, хотя реализации различаются. Для барьеров чтения-записи, взяв в качестве примера Java HotSpot VM, егоОтсутствует отметка при одновременной отметкеСхема обработки следующая:

CMS:Барьер записи + добавочное обновление
G1:Барьер записи + SATB
ZGC:прочитать барьер

Инкрементные обновления, используемые в CMS, помимо необходимости обхода записей барьера записи на этапе перемаркировки, такженужно пересканироватьGC Roots (отмечены не должны быть отмечены снова), это связано с тем, что CMS не добавляет барьеры записи для таких инструкций, как astore_x.

4. Процесс GC

Основная идеяВ соответствии с особенностями каждого возраста выбираются разные алгоритмы сборки мусора..

  1. 年轻代:использоватьалгоритм репликации
  2. 老年代: использоватьразметкаилипометить как очищенныйалгоритм.

Зачем молодому поколению:

Преимущество генерации в том, что优化GC性能, если нет генерации, каждое сканирование всех регионов может исчерпать GC. Поскольку многие объекты почти朝生夕死Да, если это генерация, мы помещаем вновь созданный объект в определенное место и сохраняем этот блок первым при использовании GC.朝生夕死(более 80%) площади объекта переработано, что освободит много места.

4.1 Молодое поколение

HotSpot JVM делит молодое поколение на три части: 1.EdenРайон и 2SurvivorРайон (соответственно именуемыйfromа такжеto). Масштаб по умолчанию8:1:1. Как правило, вновь созданные объекты назначаютсяEdenОбласть (специальная обработка некоторых крупных объектов), после первого Minor GC, если эти объекты еще живы, они будут перемещены вSurvivorПлощадь. Каждый раз, когда субъект выживает в зоне SurvivorMinor GCвозраст увеличится на 1 год, когда его возраст будет увеличен до определенного количества раз (по умолчанию15раз), он будет перемещен в старое поколение. Алгоритм сборки мусора молодого поколения используеталгоритм репликации.

在这里插入图片描述
Процесс GC молодого поколения:
До запуска GC объекты молодого поколения будут существовать только вEdenРайон и им.FromизSurvivorрайон названToизSurvivorРайон всегда пустой. Если вновь выделенный объект находится вEdenНедостаток места для приложения приведет к GC.

yang GC:EdenВсе уцелевшие объекты в зоне копируются вTo, пока вFromВ зоне уцелевшие объекты будут решать, куда идти, исходя из значения их возраста. Возраст достигает определенного значения (возрастной порог может быть пройден через-XX:MaxTenuringThresholdустановить) будут перемещены в старое поколение, а объекты, не достигшие порога, будут скопированы вToплощадь. После этого ГК,EdenРайон иFromЗона очищена. В настоящее время,Fromа такжеToпоменялись бы ролями, что является новымToперед последним ГКFrom,новыйFromперед последним ГКTo. так или иначе都会保证名为To的Survivor区域是空的.Minor GCЭтот процесс будет повторяться до тех пор, покаToплощадь заполнена,ToПосле заполнения региона все объекты перемещаются в старое поколение. Обратите внимание, что если места по-прежнему недостаточно после Ян GC,космическая гарантияМеханизм отправки данных в старую область

Карточный стол:

  1. В целях поддержки высокой частоты переработки молодого поколения, виртуальная машина использует метод, называемый卡表(Карточная таблица) структура данных, карточная таблица как набор битов,Каждый бит может использоваться для указания, все ли объекты в определенной области старого поколения содержат ссылки на объекты молодого поколения..
  2. GC нового поколения не нужно тратить много времени на сканирование всех объектов старого поколения, чтобы определить отношение ссылок каждого объекта,Сначала отсканируйте карточный стол, только когда бит флага таблицы карт равен 1, объекты старого поколения в данной области необходимо сканировать. Объект старого поколения в области, где эпитоп карты равен 0, не должен содержать ссылку на молодое поколение.

4.2, старость

Процесс старости GC:

Объекты, хранящиеся в старости, — это объекты, которые сохранились в течение длительного времени, а их возраст превышает 15 лет или вызывает старость.分配担保механизм для хранения крупных предметов. Вызовы GC срабатывают в старостиmajor gcТакже известен какfull gc.полный сборщик мусора будет включать сборщик мусора молодого поколения.full gcиспользуетсяотметка-ясноилиразметка. в исполненииfull gcВ этом случае нормальная работа программы будет заблокирована. Сборщик мусора старого поколения более эффективен, чем сборщик мусора молодого поколения.в 10 раз медленнее. сильно влияют на эффективность. так一定要尽量避免老年代GC!

4.3. Метапространство

Последует переработка постоянного поколенияfull gcЧтобы двигаться, потребляйте производительность. Каждый тип сборки мусора требует специальной обработкиметаданные. Удаление метаданных упрощает сборку мусора и повышает эффективность.

-XX:MetaspaceSize Размер начального пространства. Достижение этого значения вызовет сборку мусора для выгрузки типа, и GC скорректирует значение:

Если освобождается много места, уменьшите это значение соответствующим образом;
Если освобождается очень мало места, увеличьте это значение соответствующим образом, если оно не превышает MaxMetaspaceSize.

-XX:MaxMetaspaceSize:

Максимальное пространство, по умолчанию не ограничено.

4.4 、Обзор процесса сборки мусора

在这里插入图片描述
ГрубоПроцесс переработки ГХТакие какНад, и еще одна настройкаКрупные предметы уходят прямо в старость:

  1. Если в молодом поколении происходит сбой выделения и объект представляет собой большой массив без каких-либо ссылок на объекты, его можно выделить непосредственно в старое поколение. Избегайте сборки мусора в молодом поколении, выделяя в старом поколении.
  2. Если задано значение -XX:PretenureSizeThreshold, любой объект, превышающий это значение, не будет пытаться выделить память в молодом поколении и будет выделять память в старом поколении.

Стратегия высвобождения и распределения памяти

  1. Приоритет отдается размещению объектов в Эдеме, где сбор мусора происходит часто и быстро.
  2. Крупные объекты переходят непосредственно в старое поколение.
  3. Older (по умолчанию 15 раз для долгоживущих объектов) и введите старое поколение.
  4. В пространстве Survivor сумма размеров всех объектов одного возраста больше половины пространства Survivor, и объекты, возраст которых больше или равен этому возрасту, войдут в старое поколение.
  5. Гарантия распределения пространства (гарантированный второстепенный GC), если область Survivor не может содержать объекты, которые все еще выживают в новом поколении после Minor GC, объекты, которые не могут быть размещены Survivor, будут напрямую введены в старое поколение.

5. Сборщик мусора

5.1 Сборщик мусора

Куча — это область фокуса механизма сборки мусора. Мы знаем, что существует три механизма сборки мусора.minor gc,major gcа такжеfull gв. Для кучи есть первые два. молодое поколениеminor gc, старый звонокmajor gc.

  1. Сборщик мусора JDK7, JDK8 по умолчаниюParallel Scavenge(新生代)+ Parallel Old(老年代)
  2. Сборщик мусора JDK9 по умолчаниюG1, обычная комбинация серверной разработки:ParNew + CMS

在这里插入图片描述
При использовании в инженерии используйте указанный сборщик мусора в комбинации.Прежде чем объяснять сборщик мусора, популяризируйте несколько важных моментов знаний:

STW

ДжаваStop-The-WorldЭтот механизм называется STW, что означает выполнение алгоритма сборки мусора в приложении Java.Все остальные темы приостановлены(Кроме помощников по сбору мусора). Это явление глобальной паузы в Java.Глобальная пауза, весь код Java останавливается, хотя собственный код может выполняться, но не может взаимодействовать с JVM, если происходит STWЯвление в основном вызвано gc.

吞吐量

Пропускная способность = время выполнения пользовательского кода / (время выполнения пользовательского кода + время сборки мусора). Например: виртуальная машина работает 100 минут и сборщик мусора тратит 1 минуту, значит пропускная способность 99%

垃圾收集时间

Частота сбора мусора * время одной сборки мусора

并行收集

Относится к нескольким потокам сборки мусора, работающим параллельно, но в это время пользовательский поток все ещев состоянии ожидания.

并发收集

Ссылаться наПользовательские потоки работают одновременно с потоками сборки мусора(не обязательно параллельно может выполняться попеременно). Пользовательская программа продолжает работать, а сборщик мусора работает на другом процессоре.

5.2, новое поколение

Новое поколение имеетSerial,ParNew,Parallel ScavengeТри сборщика мусора.

имя Последовательный/параллельный/параллельный алгоритм утилизации сцены, которые будут использоваться Может сотрудничать с CMS
Serial сериал копировать Один ЦП, виртуальная машина в клиентском режиме да
ParNew Parallel (параллельная версия Serial) копировать Несколько процессоров, часто в режиме сервера да
Parallel Scavenge параллельно копировать Несколько процессоров и ориентация на пропускную способность нет

5.3 Старость

старость естьSerial Old,Parallel Old,CMSТри сборщика мусора.

имя Последовательный/параллельный/параллельный алгоритм утилизации сцены, которые будут использоваться Объединение молодого поколения
Serial Old сериал разметка один процессор Серийный, ParNew, Параллельный Scavenge
Parallel Old параллельно разметка Несколько процессоров Parallel Scavenge
CMS параллелизм пометить как очищенный Несколько процессоров и акцент на пропускную способность, обычно используемые на стороне сервера Серийный, ParNew
5.3.1. Система управления контентом

CMS(Concurrent Mark Sweep) здесь важнееСосредоточьтесь на этом.

Первоначальный замысел и цель CMS:

Чтобы исключить длительные паузы в цикле Full GC для коллекторов Throught и Serial. это以获取最短回收停顿时间为目标Коллектор с самоадаптирующейся стратегией настройки подходит для интернет-сайтов и сервисных приложений B/S.

Применимые сценарии CMS:

Если ваше приложение требуетболее быстрый ответ, не хотите делать длинные паузы во времяРесурсы процессора также относительно богаты, подходит для сборщика CMS. Например, общие задачи на стороне сервера.

преимущество:

Параллельный сбор, низкая пауза.

недостаток:

  1. CMS收集器对CPU资源非常敏感: в параллельной фазе, хотя пользовательский поток не будет приостановлен, он будет занимать ресурсы ЦП и вызывать замедление работы эталонной программы и снижение общей пропускной способности.
  2. 无法处理浮动垃圾: Поскольку пользовательский поток все еще работает в параллельной фазе очистки CMS, новый мусор будет непрерывно генерироваться с запуском программы.Эта часть мусора появляется после процесса маркировки, и CMS не может обработать их в этой коллекции , поэтому он должен ждать следующего GC при очистке. Эта часть мусора называется浮动垃圾.Если память не может вместить плавающий мусор, то JVM запускает Serial Old вместо CMS.
  3. 空间碎片: CMS основана на标记-清除Реализованный алгоритмом коллектор, использующий标记-清除После того, как алгоритм собран, он сгенерируетмного мусора.

Процесс утилизации CMS:

  1. 初始标记:триггер STW, просто отметьте объекты, с которыми GC ROOTS может напрямую ассоциироваться, что очень быстро.
  2. 并发标记:Не вызывает STW, нормальная работа, можно ли привязать все объекты Old к GC Roots
  3. 重新标记:триггер STW, чтобы исправить разметку, которая изменяется по мере того, как пользовательская программа продолжает работать во время параллельной разметки. Время паузы на этом этапе будет немного больше, чем на начальной фазе маркировки, но короче, чем на параллельной фазе маркировки.
  4. 并发清除:Не вызывает STW, работает нормально, а алгоритм очистки меток очищает и удаляет мертвые объекты, обнаруженные на этапе маркировки.

Суммировать:

  1. 并发标记а также并发清除Это занимает больше всего времени, но не требует остановки пользовательского потока.初始标记а также重新标记Затраты времени короче, но пользовательский поток нужно остановить, поэтому время паузы, вызванное всем процессом GC, короче, и большую часть времени он может работать с пользовательским потоком.

5.4.G1

Предыдущее подразделение коллектора GC в куче:
在这里插入图片描述
Ранее сборщик мусора былновое поколение + старое поколение, эффект от использования CMS не очень.Для уменьшения влияния STW на систему введен G1 (Garbage-First Garbage Collector).G1Это сборщик мусора для серверных приложений со следующими характеристиками:

1,并行与并发: G1 может в полной мере использовать преимущества аппаратного обеспечения в многопроцессорной и многоядерной среде и позволяет программам Java продолжать выполняться одновременно.
2,分代收集: концепция генерации по-прежнему сохраняется в G1, она может использовать разные способы работы с вновь созданными объектами и старыми объектами, которые сохранились в течение определенного периода времени и пережили несколько GC, чтобы получить лучшие результаты сбора.
3.空间整合: G1 в целом основан на标记-整理Алгоритм реализован, с локальной (между двумя Регионами) точки зрения, основан на复制算法Реализовано, во время операции G1 не будет генерироваться фрагментация пространства памяти.
4.可预测停顿: G1 может построить предсказуемую модель времени паузы лучше, чем CMS, позволяя пользователям явно указать, что в сегменте времени длиной M миллисекунд время, затрачиваемое на сборку мусора, не должно превышать N миллисекунд.

Как сборщик по умолчанию сервера после JDK9, G1 больше не различает молодое поколение и старое поколение для сборки мусора.По умолчанию G1 делит память кучи на N разделов, каждый 1~32M (всегда степень 2). И предоставляет четыре разных тега региона.Eden,Survivor,Old,Humongous. Область H можно рассматривать как специальный столбец в области Old, специально предназначенный для хранения больших данных.Тип хранения данных области H обычно соответствует следующим условиям:

Когда область 0,5 Когда размер объекта > 1 Регион сохраняется в последовательных H регионах.

在这里插入图片描述
В то же время G1 представилRememberSets,CollectionSetsПомогает лучше выполнять GC.

1,RememberSets:RSetЗаписывает взаимосвязь между объектами в других регионах, ссылающихся на объекты в этом регионе, и относится к структуре point-in (кто ссылается на мой объект)
2,CollectionSets:CsetsЭто набор регионов, которые необходимо очистить в GC.Обратите внимание, что G1 не участвует во всех регионах в каждом GC и может очищать только некоторые из них, которые называются Csets. Во время GC для межпоколенческих ссылок на объекты старых -> молодых и старых -> старых просто отсканируйте соответствующийCSetсерединаRSetВот и все.

Когда G1 выполняет GC, он обычно делится наYang GCа такжеMixed GC.

Young GC:CSetЭто Регион во всех молодых поколениях
Mixed GC:CSetЭто все регионы в молодом поколении плюс регионы с высокой урожайностью, отмеченные на этапе глобальной одновременной маркировки.

5.4.1 Ян ГК

在这里插入图片描述
Стандартный алгоритм GC молодого поколения, общая идея аналогична CMS.

5.4.2 Смешанный GC

Да в G1НетЕсть старый GC, а есть Mixed GC, который GC старого и нового поколения одновременно.процесс переработки:

1,初始标记:событие STW, который выполняет работу по маркировке объектов, непосредственно доступных GC ROOTS. Бит флага RootRegion.
2,根区域扫描:Не событие STW, берем RootRegion, сканируем все Regions во всей Старой области и видимRsetЕсть ли в нем RootRegion. идентифицируется.
3.并发标记: Параллельная маркировка с CMSСТВ не требуется, диапазон обхода уменьшается, и только вторым шагом является обход объекта RSet, который помечен как относящийся к старости.
4.最终标记: Перемаркировать с CMS будет STW, использоватьSATBоперация, быстрее.
5.清除:операция STW,использоватьАлгоритм очистки копирования, Подсчитайте регионы с уцелевшими объектами и регионы (пустые регионы) без уцелевших объектов и обновите Rset. Соберите пустые регионы в назначаемую очередь регионов.

Сводка по переработке:

1. После глобальной параллельной маркировки сборщик знает, в каких регионах есть уцелевшие объекты. И соберите эти полностью перерабатываемые регионы (без уцелевших объектов) и добавьте их в очередь выделяемых регионов, чтобы реализовать восстановление этой части памяти. Для регионов с уцелевшими объектами G1 найдет несколько регионов с наибольшим доходом и накладными расходами, не превышающими верхний предел, указанный пользователем в соответствии со статистической моделью восстановления объектов. Коллекция этих выбранных и переработанных регионов называется набором коллекции или сокращенно Cset!
2. Cset = в MIX GCВсе регионы в молодом поколении + несколько старых регионов с высоким доходом от сбора получены по глобальной статистике одновременной маркировки.
3. Cset в YGC =Все регионы в молодом поколении + контролируют накладные расходы молодого GC, контролируя количество регионов в молодом поколении.
4. И YGC, и MIXGC используют многопоточную репликацию и очистку, и весь процесс будет STW. G1Принцип низкой задержкиВ том, что площадь, которую он перерабатывает, становится точной, а диапазон уменьшается.

Точка ускорения G1:

1 перемаркироватьКогда область X удаляется напрямую.
2 RsetУменьшен объем проверки, два пункта в предыдущем вопросе.
3 Использование фазы примечанияSATBБыстрее, чем CMS.
4 Процесс очистки выбирает для очистки некоторые области с низкой выживаемостью, но не все, что повышает эффективность очистки.

Суммировать:

Точно так же, как ваша мать просила вас убрать вашу спальню, вы можете убирать только бросающийся в глаза и крупный мусор, и вы не убирали углы. Есть еще много подробностей о G1, которые я еще не видел. Обобщите мышление G1 одним предложением:每次选择性的清理大部分垃圾来保证时效性跟系统的正常运行.

6. Новые объекты

Класс Java в основном включает два процесса от кодирования до окончательного выполнения, компиляции и запуска.

Компиляция: скомпилируйте файл .java, который мы написали, в файл .class с помощью команды Javac.
Запуск: отправьте скомпилированный файл .class в JVM для выполнения.

Когда JVM запускает класс класса, она не загружает все классы в память одновременно.Вместо этого загрузите то, что используется, и загрузите его только один раз..

6.1, жизненный цикл класса

在这里插入图片描述

6.1.1, загрузка

Под загрузкой понимается загрузка файлов байт-кода класса из различных источников в память через загрузчик классов.Здесь есть два важных момента:

  1. источник байт-кода: Общие источники загрузки включают файлы .class, скомпилированные из локальных путей, файлы .class в пакетах jar, из удаленных сетей и компиляцию динамических агентов в реальном времени.
  2. загрузчик классов: обычно включает загрузчик классов запуска, загрузчик классов расширений, загрузчик классов приложений и определяемый пользователем загрузчик классов (тип шифрования и дешифрования).
6.1.2 Проверка

Основная цель — убедиться, что загруженный поток байтов соответствует спецификации виртуальной машины и не вызовет ошибок безопасности. Проверка формата файла, проверка метаданных, проверка байт-кода, проверка ссылки на символ.

6.1.3 Подготовка

Выделите место в памяти для статических переменных класса, просто выделите место, например, public static int age = 14, age = 0 после подготовки, age = 14 во время инициализации, если добавленоfinalЗатем на данном этапе он напрямую назначается 14.

6.1.4 Анализ

в постоянном пулеСимволическая ссылказаменитьпрямая цитата.
在这里插入图片描述

6.1.5 Инициализация

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

6.1.6 Использование

Сразу после загрузки класса место в памяти выделяется и инициализируется для объекта:

  1. Выделите соответствующий размер памяти для объекта
  2. Присвоить значения по умолчанию переменным экземпляра
  3. Установите информацию заголовка объекта, хэш-код объекта, возраст генерации GC, информацию о метаданных и т. д.
  4. Выполнить инициализацию конструктора (init).
6.1.7. Удаление

В итоге нечего сказать и ждать, то есть объект восстанавливается по алгоритму GC.

6.2 Объекты занимают байты

Проблема с заголовком объекта вSynchronizedСтатья написана подробно, шапка объекта состоит из трех частей对象头(MarkWord、classPointer),实例数据Instance Data,对齐Padding, хотите увидеть подробный вызов IDEA по использованию памятиjol-coreупаковка.

Вопрос 1: Сколько байтов занимает новый Object()

  1. markword 8 байт + classpointer 4 байта (сжатый с помощью calssPointer по умолчанию) + padding 4 байта =16байт
  2. Если сжатие указателя класса не включено: markword 8 байт + classpointer 8 байт =16байт

Вопрос 2: Пользователь (int id, имя строки) Пользователь u = новый пользователь (1, "Li Si")

markword 8 байт + classpointer 4 байта после включения сжатия classPointer + данные экземпляра int 4 байта + String4 байта после нормального сжатия указателя объекта + заполнение 4 =24 байта

6.3 Метод доступа к объекту

在这里插入图片描述
использовать ручку:

Самым большим преимуществом использования дескрипторов для доступа является то, что то, что хранится в ссылке,Стабильный адрес дескриптора, когда объект перемещается (перемещение объектов — очень распространенное поведение во время сборки мусора), изменяется только указатель данных экземпляра в дескрипторе, а саму ссылку изменять не нужно.

прямой указатель:

Адрес объекта хранится непосредственно в ссылке. Самым большим преимуществом являетсяБыстрее, это экономит время на позиционирование указателя.Поскольку доступ к объектам очень частый в Java, этот вид накладных расходов также является очень значительными затратами на выполнение. Использование Sun HotSpotпрямой доступ по указателюдля доступа к объектам.

7. Должен ли объект создаваться в куче?

结论: Не обязательно зависит от проходящего мимо объекта逃逸分析Позже, когда обнаружится, что переменная используется только в области метода, JVM автоматически оптимизирует и создаст объект в стеке.

7.1, анализ побега

Escape Analysis просто означает, что виртуальная машина Java Hotspot может анализировать область использования вновь созданных объектов и решать, следует ли выделять память в куче Java.

7.2, скалярная замена

скалярная замена: JVM определяет, что объект не будет доступен извне с помощью escape-анализа. Затем скалярная замена объекта декомпозируется для выделения памяти в стеке, чтобы пространство памяти, занимаемое объектом, могло быть уничтожено, когда кадр стека выталкивается из стека, что снижает нагрузку на сборку мусора.

Скаляр: величина, которая не может быть далее разложена, а базовый тип данных JAVA — скаляр.
Агрегация: в JAVA объект представляет собой совокупность, которую можно дополнительно разложить.

7.3, распределение стека

Объекты JVM размещаются вкучаВ , когда на объект нет ссылки, сборщик мусора используется для повторного использования памяти.Если количество объектов велико, это оказывает большее давление на сборщик мусора и косвенно влияет на производительность приложения.

Чтобы уменьшить количество временных объектов, выделенных в куче, JVM используетанализ побегаУбедитесь, что объект не будет доступен извне. затем передать объектскалярная заменаДекомпозиция выделяет память в стеке, так что пространство памяти, занимаемое объектом, может быть уничтожено при извлечении кадра стека, что снижает нагрузку на сборку мусора.

7.4 Устранение синхронизации

Устранение синхронизацииЭто технология оптимизации, предоставляемая виртуальной машиной Java. С помощью escape-анализа можно определить, будет ли к объекту обращаться другие потоки.Если у объекта нет escape-потока, то чтение и запись объекта будутНе будетЕсли конкуренция за ресурсы есть, а конкуренции за ресурсы нет, блокировку синхронизации на объекте можно снять. Например, вызов тела методаStringBuffer.

Заключение анализа побега:

Хотя после анализа побега можно сделать标量替换,栈上分配,а также锁消除. Но сам анализ побега также требует серии сложных анализов, что на самом деле является относительно трудоемким процессом. Если объект анализируется слой за слоем и обнаруживается, что оптимизация анализа выхода не может быть выполнена, это займет много времени, поэтому используйте его с осторожностью.

8. Загрузчик классов

Как правило, вмешательство на этапе подключения невозможно, и большинство вмешательствэтап загрузки класса,对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性, есть три важных метода при загрузке класса:

1,loadClass(): загрузить запись целевого класса, он сначала будет искать текущий ClassLoader и будет ли целевой класс загружен в своих родителях, найдет его и вернет напрямую
2,findClass(): если он не найден, он позволит родителям попытаться загрузить его.Если родители не могут его загрузить, он вызовет findClass(), чтобы позволить пользовательскому загрузчику загрузить целевой класс самостоятельно.
3.defineClass(): после получения байт-кода вызовите метод defineClass(), чтобы преобразовать байт-код в объект класса.

8.1. Механизм родительского делегирования

在这里插入图片描述
определение:

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

эффект:

1,Может предотвратить повторную загрузку одного и того же .class. Спросите выше через делегацию.После загрузки повторно загружать не нужно. Храните данные в безопасности.
2,Гарантированное ядро.class нельзя подделать* через делегирование не будет вмешиваться в основной .class. ’

загрузчик классов:

1. BootstrapClassLoader: написан на C++, загружает основную библиотеку Java java.*, JAVA_HOME/lib
2. ExtClassLoader (стандартный загрузчик классов расширений): загрузка библиотеки расширений, написанной java, JAVA_HOME/lib/ext
3. AppClassLoader (загрузчик системных классов): каталог, в котором находится загрузчик, например ClassPath, где находится user.dir.
4. CustomClassLoader (определяемый пользователем загрузчик классов): определяемый пользователем загрузчик классов, который может загружать файл класса по указанному пути.

8.2, о механизме заряжания

双亲委派机制只是Java类加载的一种常见模式, есть и другие механизмы загрузки, такие какTomcatВсегда пытайтесь сначала загрузить класс, если вы не можете его найти, используйте предыдущий загрузчик в порядке родительского загрузчика.ровно наоборот. Другой пример — при использовании стороннего фреймворка.JDBCКогда дело доходит до конкретной реализации, это вызовет ошибку, потому что JDK поставляется сJDBCинтерфейс отстартовый классзагружается, в то время как третья сторона реализует интерфейс путемКласс приложениянагрузка. Таким образом, они не знают друг друга, поэтому JDK представила механизм SPI.загрузчик контекста потокаДобиться загрузки (не такой, как у Dubbo SPI).

9. ООМ, ЦП100%

Общие команды для анализа производительности системы:

инструмент использовать
jps Вывод информации о состоянии процессов, запущенных в JVM
jstack Создание моментального снимка потока текущего момента виртуальной машины
jstat Инструмент мониторинга статистики виртуальных машин
jinfo Просмотр и настройка различных параметров виртуальных машин в режиме реального времени
jmap Создание моментальных снимков дампа памяти виртуальных машин, файлов heapdump
JConsole Инструменты визуального управления, обычно используемые

9.1 ООМ

9.1.1 Почему ООМ

Короче говоря, OOM возникает по двум причинам:

  1. Внешне поднят: назначен JVMпамяти недостаточно.
  2. Внутренне поднят: бесполезный объект не освобождается или не освобождается вовремя.При выполнении программы занимаемая память становится все больше и больше, и в конечном итоге память переполняется, напримерThreadLocalНеправильное освобождение может привести к утечке памяти.
9.1.2, три типа ООМ
9.2.1, переполнение кучи памяти:

Это наиболее распространенное пространство кучи Java. Обычно моментальный снимок дампа кучи из Dump сначала используется средством создания образов памяти, а затем определяется, является ли онутечка памятивсе ещепереполнение памяти.
утечка памяти

Просмотрите цепочку ссылок утекших объектов в GC Roots с помощью инструмента. Найдите утекший объект, по какому пути он связан с корнями сборщика мусора, чтобы механизм сборки мусора не смог его собрать, и, наконец, более точно найдите утекший код.

нет утечек

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

9.2.2, стек виртуальных машин и переполнение стека собственных методов

На виртуальной машине HotSpot нет различия между стеком виртуальной машины и стеком собственных методов, поэтому размер стека можно задать только параметром **-Xss**. В Спецификации виртуальной машины Java описаны два типа исключений:

StackOverflowError: Глубина стека, запрошенная потокомПревышена максимальная глубина, разрешенная для виртуальной машины, будет выброшено исключение.
OutOfMemoryError: Когда виртуальная машина расширяет стекНе удалось подать заявку на достаточно места, будет выброшено исключение.

В однопоточной среде, будь то из-за того, что кадр стека слишком велик или емкость стека виртуальной машины слишком мала, когда память не может быть выделена, виртуальная машина бросаетStackOverflowErrorаномальный.

В многопоточной среде чем больше памяти, выделенной для стека каждого потока, тем больше пространство, получаемое каждым потоком, тем меньше количество потоков, которые можно создать, и тем проще генерировать исключения OOM.уменьшить максимальную кучуа такжеуменьшить размер стекав обмен на большее количество потоков.

9.2.3 Переполнение постоянного поколения:

Пространство PermGen — это переполнение области метода. Область метода используется для хранения соответствующей информации о классе, такой как имя класса, модификатор доступа, постоянный пул, описание поля, описание метода и т. д. Некоторые текущие основные платформы, такие как Spring и Hibernate, будут использоваться при расширении классов.Технология байт-кода, такая как CGLib, чем больше классов расширяется, тем больше требуется область метода для обеспеченияДинамически генерировать классОн может быть загружен в память, что может вызвать исключение OOM в области метода.

9.2.4, команда просмотра OOM
  1. Просмотрите соответствующий номер процесса с помощью команды:

Например: jps или ps -ef | необходимые задачи grep

  1. Введите команду для просмотра команды gc status:

jstat -gcutil идентификатор процесса количество обновленных миллисекунд количество отображаемых записей
Например: jstat -gcutil 1412 1000 10 (проверьте номер процесса 1412, получайте его каждую 1 секунду и отображайте 10 записей)

  1. Проверьте конкретную занятость:

Команда: jmap -histo ID процесса | больше (по умолчанию отображается в консоли)
Команда: jmap -histo 1412 | подробнее > exceptionlog.txt
Например: jmap -histo 1412 | more Просмотр конкретного имени класса, есть ли класс разработчика, или вывод в определенный файл для анализа

9.3 CPU 100%

Интернет-приложения вызывают 100% загрузку ЦП, При возникновении такой проблемы код входит в бесконечный цикл.Этапы анализа следующие:

  1. Узнайте соответствующий идентификатор сервисного процесса:

Используйте ps -ef | grep для запуска имени службы, и вы также можете увидеть использование ЦП каждым процессом непосредственно с помощью команды top.

  1. Запросите текущее состояние всех потоков в целевом процессе:

top -Hp pid, -H означает отображение в измерении потока, по умолчанию оно отображается в измерении процесса.

  1. Преобразуйте целевой поток из десятичного в шестнадцатеричный:

printf '%x\n' идентификатор потока

  1. Используйте идентификатор процесса jstack | шестнадцатеричный идентификатор потока grep, чтобы найти информацию о потоке, конкретный анализ:

идентификатор процесса jstack | grep -A 20 шестнадцатеричный идентификатор потока

10. Настройка GC

Для общих проектов достаточно добавить параметры xms и xmx.Настройка выполняется вслепую без всестороннего мониторинга и сбора данных о производительности.. Если есть проблема, сначала посмотрите, не является ли код или параметры необоснованными, ведь не каждый может написать базовый код JVM. Как правило, необходимо уменьшить количество создаваемых объектов, сократить использование глобальных переменных и больших объектов, а оптимизация сборщика мусора — это крайняя мера. ежедневноПроанализируйте ситуацию с GCОптимизация кода — это гораздо больше, чем просто оптимизация параметров сборщика мусора.. Как правило, настройка не требуется в следующих случаях:

1. Небольшое единовременное потребление GC<50 мс, частота более 10 секунд. Объясните, что с молодым поколением все в порядке.
2. Однократное потребление полного GC<1 секунда, частота более 10 минут, что указывает на то, что старое поколение в порядке.

Цель настройки GC:GC时间够少,GC次数够少.

Предложения по настройке:

  1. -Xms5m устанавливает начальную кучу JVM на 5M,-Xmx5m устанавливает максимальный размер кучи JVM равным 5M. -Xms аналогичен -Xmx, чтобы избежать перераспределения памяти JVM после каждой сборки мусора.
  2. -Xmn2g: установите размер молодого поколения на 2G, что обычно по умолчанию составляет от 1/3 до 1/4 всей области кучи.-XssНастройка пространства стека каждого потока.
  3. -XX:SurvivorRatio, установите соотношение площади Эдема к площади Выживших в молодом поколении, по умолчанию 8, соотношение 8:1:1.
  4. -XX:+HeapDumpOnOutOfMemoryErrorКогда в JVM возникает OOM, автоматически создается файл DUMP.
  5. -XX:PretenureSizeThresholdКогда созданный объект превышает указанный размер, объект непосредственно выделяется в старости.
  6. -XX:MaxTenuringThresholdУстановите максимальный возрастной порог для объектов в области Survivor.При превышении порога он будет переведен в старость.По умолчанию 15.
  7. Включение журнала GC мало влияет на производительность и может помочь нам найти проблему, -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:gc.log

11. Теплое благополучие

在这里插入图片描述
Если ты увидишь, что это определенно настоящая любовь, высочайший этикет в Цзянху подарит тебе это.

  1. Карта разума JVM:woohoo.process on.com/view/lincoln/5…
  2. Метод трехцветной маркировки и барьер чтения-записи:blog.CSDN.net/QQ_21383435…
  3. Ловушки параметров настройки JVM:Позже Лу Мэн-group.ITeye.com/group/topic…