[Ежедневный свежий гриб] Что нужно знать для изучения JAVA

Java
[Ежедневный свежий гриб] Что нужно знать для изучения JAVA

При кратком разборе знаний по Java систематизирую записи и делюсь ими, если есть ошибки, поправьте меня, спасибо🙏🙏

Работает на разных платформах

Bytecode не отличительная система, аJDKЭто значит отличить систему. Compabled Byte Code Каждая платформа соответствует спецификации JVM, что приводит к тому, что приведет к компиляции, когда-то запускается везде.

Кроссплатформенное преимущество Java исчезло, а другие языки могут быть кроссплатформенными через Docker. иJavaвиртуальная машина вDockerОднако средняя операция стала недостатком, в основном из-за размера контейнера и времени запуска.Конечно, есть и некоторые черные технологии, которые могут уменьшить влияние этих проблем, напримерjlink,AOTи т.д

процесс компиляции

Компиляция выполняется компилятором исходного кода Java (javac).

Процесс: Исходный код --- [Лексический анализатор] --- Поток токенов --- [Синтаксический анализатор] --- Синтаксическое дерево --- [Семантический анализатор] --- Абстрактное синтаксическое дерево аннотаций --- [Генератор байт-кода слова] --- Байт-код JVM

три процесса

  • Разобрать и заполнить таблицу символов
  • Обработка аннотаций
  • Анализ и генерация байт-кода

Синтаксический сахар [общий]

Generics будут существовать только в исходном коде Java, и будет заменен исходным сырьевым типом (сырой тип, также известный как обнаженный тип) после компиляции. Этот процесс также известен как «общий стирание».

  • Код стал более лаконичным [без принудительного преобразования]
  • Программа более надежна [пока нет предупреждения во время компиляции, не будет исключения ClassCastException во время выполнения]
  • Читабельность и стабильность [При написании коллекции тип ограничен]

загрузка класса

Не все классы будут загружены вJVMиз,JavaДинамическая загрузка классов используется только тогда, когда это необходимо, что позволяет экономить память.

Загрузчик классов по умолчанию

  1. Запустите загрузчик классов: [Bootstrap ClassLoader] отвечает за загрузку jre/lib/ в $JAVA_HOME.rt.jarВсе классы в нем, реализованные на C++, не являются подклассами ClassLoader.
  2. Загрузчик класса расширения [Extension ClassLoader] отвечает за загрузку платформы javaрасширенияНекоторые пакеты jar, включая jre/lib/*.jar в $JAVA_HOME или пакеты jar в каталоге, указанном параметром -Djava.ext.dirs.
  3. Загрузчик класса приложений [Classer Classer] отвечает за записьclasspathКласс в пакете JAR и каталоге, указанном в указанном файле.
  4. Пользовательский загрузчик классов [User ClassLoadder]

Родительское делегирование [решение вопросов безопасности]

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

  • Преимущества: предотвратить несколько копий одного и того же базового кода в памяти (перспектива безопасности)

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

Путем настройки ClassLoader и переопределения метода loadClass родительского классаМеханизм родительского делегирования может быть нарушен, и SPI Java (Механизм обнаружения поставщика услуг) также нарушает механизм родительского делегирования.

Подробный процесс

  1. Загружаем, ищем бинарные данные и тоже загружаем класс кучи JavaСоздайте объект класса java.lang.Class.
  2. Подключение, подключение включает в себя три части: проверка, подготовка, инициализация.
    • 1) проверка, формат файла, метаданные, байткод, проверка справки символа;
    • 2) Подготовка, выделение памяти для статической переменной класса и инициализация значениями по умолчанию;
    • 3) Разбор, преобразуйте символическую ссылку в класс к прямой ссылке
  3. Инициализируйте, присвойте правильное начальное значение статическим переменным класса.

JIT компилятор точно в срок

[Как раз вовремя] Перекомпилируйте и оптимизируйте байт-код горячего кода и позвольте процессору выполнить его напрямую, что сделает выполнение более эффективным. HotSpot обнаруживает горячий код на основе счетчиков, а не выборки.

иGraalvmизAOTпо сравнению сJITЕще раз, напрямую переведено вNative ImageПредоставьте меньший след и более быстрое время загрузки.

После загрузки класса

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

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

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

  • Серийный коллектор, серийный коллектор самый старый,Самый стабильный и эффективный коллектор, но может производитьдолгая пауза, используя только один поток для повторного использования.
  • Коллектор ParNew, коллектор ParNew на самом деле является последовательным коллекторомМногопоточная версия.
  • Параллельный сборщик, сборщик Parallel Scavenge похож на сборщик ParNew, параллельный сборщикУделите больше внимания пропускной способности системы.
  • Сборщик Parallel Old, Parallel Old — это более старая версия сборщика Parallel Scavenge, использующая многопоточный алгоритм «пометки и очистки».
  • Сборщик CMS, сборщик CMS (Concurrent Mark Sweep) являетсяПолучите минимальное время паузы на переработку为目标的收集器。 это нужноПотреблять дополнительные ресурсы ЦП и памяти, когда ресурсы ЦП и памяти ограничены, а ЦП меньше, это увеличивает нагрузку на систему. CMSНе справляется с плавающим мусором. Алгоритм маркировки и очистки CMS, который приводит к большому количествуСоздание космического мусора.
  • Сборщик G1, G1 (Garbage-First) — сборщик мусора, ориентированный на сервер, в основном для машин, оснащенных несколькими процессорами и памятью большого объема.Чрезвычайно высокая вероятность того, что время пауз GC соответствует требованиям, но также имеет высокие характеристики пропускной способности.

Модель памяти JVM

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

Трубка стека работает, а трубка стека сохраняет.

Память JVM делится на память кучи и память без кучи, память кучи также делится на молодое поколение и старое поколение, а память без кучи — это постоянное поколение (область методов, метапространство).

Молодое поколение будет разделено на зоны Eden и Survivor. Выживший также разделен на FromPlace и ToPlace, а область выжившего toPlace пуста. Соотношение по умолчанию Eden, FromPlace и ToPlace составляет 8:1:1.

Конечно, эту вещь также можно динамически настроить в соответствии со скоростью сгенерированного объекта с помощью параметра -XX:+UsePSAdaptiveSurvivorSizePolicy.

Утечки памяти и переполнение памяти

  • Утечка памяти: объект доступен, но не будет использоваться.
  • Переполнение памяти: Недостаток места для загрузки классов, нехватка памяти, утечки памяти и т. д. могут вызвать переполнение.

стек потоков

Спецификация JVM позволяет каждому потоку Java иметь свой собственный независимый стек JVM, который представляет собой стек вызовов метода Java.

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

Во время выполнения потока активен только один кадр стека, который называется «текущий активный кадр стека», и текущий активный кадр стека всегда является верхним элементом стека виртуальной машины.

Каковы условия оценки процесса продвижения от молодого поколения к старому поколению JVM?

  • Некоторые объекты будут скопированы для репликации в области "от" и "куда".Так обменяйте 15 раз(определяется параметром JVM MaxTenuringThreshold, этот параметр по умолчанию равен 15), если он все еще выживает, он будет сохранен в старом возрасте;
  • еслиОбъекты больше половины размера Эдема будут размещены непосредственно в старом, если старый не может быть аллоцирован, будет выполняться majorGC, если его меньше половины eden но места не хватает, будет выполняться minorgc, то есть GC нового поколения;
  • После незначительного gc, если оставшийся в живых все еще не может быть усыплен, поместите его в старость;
  • Динамическое суждение о возрасте, объекты определенного возраста или старше превышают половину оставшегося пространства, а объекты определенного возраста или старше непосредственно входят в старость;

JVM имеет частое Fullgc, как устранить проблему онлайн

  • Да или нетЧасто создаются большие объекты (также возможно, что область eden установлена ​​слишком маленькой)(Большие объекты прямо выделяются в старом возрасте, что приводит к нехватке места в старом возрасте ---> таким образом, частый gc)
  • Да или нетКосмическая установка старости слишком мала(Некоторые объекты в Minor GC больше, чем оставшееся пространство в старом поколении) 1. Если после полного GC осталось не так много объектов, это означает, что настройка пространства Eden слишком мала, что приводит к большому количеству объекты с коротким жизненным циклом отнесены к старому поколению. 2. Если в старом поколении мало изменений после полной сборки мусора, то пространство размещения старого поколения слишком мало.

Сборка мусора JVM и другие операции, когда запускать MinorGC

  • MinorGC срабатывает, когда область eden в молодом поколении заполнена (когда в новом поколении не хватает места).