Java JVM Детали:
Связанные знания о JVM
1. память кучи и стека
1. Память стека в JVM в основном хранит ссылки на основные типы переменных и объектов.
2. Память кучи в JVM в основном хранит объекты, а массивы, созданные с помощью новых, а строки переменной длины (StringBuilder и StringBuffered) хранятся в памяти кучи.
Преимущество использования кучи состоит в том, что она динамически выделяется пространством для хранения, что является более гибким, но недостаток в том, что он медленнее динамически распределять память; В то время как использование стека быстрее, а обмен данными может быть достигнуто, но недостаток заключается в том, что размер и срок службы данных в стеке должен быть определен и не хватает гибкости
3. Статическое распределение хранилища используется для хранения статических переменных и статических блоков кода.
2. Понимание JVM
JVM - виртуальная машина Java. Он блокирует информацию, связанную с конкретной платформой операционной системы, так что программа Java генерирует только код объекта (байтовый код), работающий на виртуальной машине Java, чтобы быть достигнута кроссплатформенная операция;
Его принцип: исходный файл Java собирается в программы Bytecode через компилятор Java, и каждая инструкция переводится в машинный код различных платформ через JVM и запускается через определенную платформу;
Область памяти JVM в основном разделена на: область метода, стек JVM, куча, локальный стек методов, счетчик программы
Счетчик программы: используется для записи выполненной в настоящее время инструкции, которая является единственной областью без OOM;
JVM Stack: Thread частная. Каждый поток создаст стек JVM одновременно. Он хранит локальные базовые переменные в текущем потоке, результаты частичных возврата, кадр стека и ссылочный адрес объекта;
Куча: обмен потоками, используется для хранения некоторых объектов и массивов; Поскольку он разделяется, требуются замки, что приводит к высоким накладным расходам;
Область метода: эта область метода соответствует постоянной генерации, в которой хранится информация класса (имя, модификатор и т. Д.), Статические переменные в классе, константы, определенные в классе с финалом и т. Д.;
Локальный стек методов: используется для поддержки выполнения собственных методов и для хранения состояния вызова каждого собственного метода;
Сборник мусора Java в основном фокусируется на областях кучи и методов: куча разделена на новое поколение и старое поколение, и, как правило, объекты, которые были только что были только что были новыми, будут помещены в новое поколение; и новое поколение разделено на район Эдема и две области выживших;
Механизм сбора мусора: сначала определите, какие объекты представляют собой мусор, то есть они больше не используются, а затем используйте соответствующие алгоритмы (алгоритм чистки, копирующий алгоритм, алгоритм маркировки, алгоритм сбора поколений) для сбора мусора;
1. Алгоритм чистки марки:
Он разделен на два этапа: этап маркировки и стадия очистки. Сначала отметьте объект, который необходимо переработать, а затем перерабатывать пространство, занятое маркировочным объектом;
Его реализация относительно проста, но его недостаток заключается в том, что ее легко генерировать фрагменты памяти, что приводит к неспособности найти достаточно памяти при распределении пространства для больших объектов в будущем, и заранее вызывает новое действие сбора мусора;
2. Копировать алгоритм:
Чтобы решить недостатки алгоритма очистки марки, алгоритм копирования делит память на две области одинакового размера в зависимости от емкости, и только один из них используется за раз. После того, как одна часть изготовлена, все еще подсудимый объект копируется в другую область, а затем используется подержанная область, так что фрагментация нелегко произойти;
Проблема фрагментации памяти решается, но недостаток в том, что используемая память уменьшается до половины оригинала, а эффективность копирования связана с количеством выживших объектов. Когда число большое, эффективность значительно снижается;
3. Алгоритм маркировки
Чтобы решить дефекты алгоритма копирования, родился алгоритм Mark-Tidy, и этап маркировки также был похож на алгоритм чистки Mark. Во -первых, объекты, которые необходимо переработать, отмечены, но они не перерабатывают их напрямую, но перемещают все выживающие объекты на другую сторону, а затем очищают память за пределами границы;
4. Алгоритм сбора поколений
Это наиболее часто используемый алгоритм в настоящее время. Его основная идея состоит в том, чтобы разделить память на несколько различных областей в соответствии с циклом выживания объекта. Как правило, область кучи разделена на новое поколение и старое поколение. Характеристика старого поколения заключается в том, что существует меньше объектов, которые необходимо переработать каждый раз, когда собирается мусор, в то время как в новом поколении больше нового поколения, поэтому применяются разные алгоритмы;
В настоящее время большинство новых поколений используют алгоритмы копирования, но на самом деле новое поколение не разделено на соотношение 1: 1. Вообще говоря, новое поколение делится на более широкое пространство Эдема и на два меньших пространства для выживших. Каждый раз, когда используются пространство Eden и одно из мест для выживших, при переработке, все еще выживающие объекты в Eden и Survivor копируются в другое пространство выживших, а затем Eden и только что используемые пространства выживших и оставшихся в живых очищаются.
Поскольку старость заключается в том, что только небольшое количество объектов перерабатывается каждый раз, обычно используется алгоритм маркировки.
Обратите внимание, что за пределами области кучи есть еще одно поколение, которая представляет собой постоянную генерацию, которая используется для хранения классов классов, констант, описаний методов и т. Д.
Итак, как мы определим, какой объект является «мусором»?
Метод 1. Способный метод подсчета:
В Java это связано с объектами посредством ссылок, то есть, если вы хотите управлять объектами, это должно быть сделано посредством ссылок. Тогда очевидно, что простым способом является судить, можно ли переработать объект путем отсчета. Не теряя общности, если объект не имеет никаких ссылок, связанных с ним, это означает, что объект в основном вряд ли будет использоваться в другом месте, а затем объект станет утилизируемым объектом. Этот метод становится методом подсчета ссылок.
Преимущества: простая реализация и высокая эффективность
Недостатки: неспособность решить проблему круговых ссылок
Метод 2. Метод анализа доступности:
Основная идея этого метода состоит в том, чтобы искать серию объектов «корней GC» в качестве отправной точки. Если между «корнями GC» и объектом нет доступного пути, объект, как говорят, недоступен. Тем не менее, следует отметить, что объект, оцениваемый как недоступный, не обязательно может стать утилизируемым объектом. Объект, который считается недоступным, должен пройти как минимум два процесса маркировки, чтобы стать утилизируемым объектом. Если во время этих двух процессов маркировки до сих пор нет возможности стать объектом для переработки, он в основном станет утилизируемым объектом.
Какие объекты могут быть корнями GC?
1. Объект, на который ссылаются в стеке JVM (локальная таблица переменных в кадре стека).
2. Объект, на который ссылаются статические атрибуты класса в области метода.
3. Объекты, на которые ссылаются константы в области метода
4. Объект, на который ссылаются JNI (то есть общий нативный метод) в локальном стеке методов.
Для программистов мы также можем уменьшить накладные расходы GC некоторыми методами:
1. Не отображайте метод System.gc ()
2. минимизировать использование временных объектов
3. Когда объект не используется, настройка дисплея установлен на NULL
4. Попробуйте использовать StringBuilder вместо накопленных строк
5. Если вы можете использовать основные типы переменных (int long), не используйте объекты (целое число, длинное)
6. Используйте переменные статического объекта как можно меньше
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!