Разница между режимом клиента JVM и режимом сервера
Через java -версию можно просмотреть режим работы JVM и настроить его, изменив конфигурационный файл, в чем между ними разница?
Сервер: - При запуске режима сервера скорость медленнее, но после запуска производительность выше, подходит для запуска фоновой программы сервера
Клиент: - При запуске клиентского режима скорость выше.После запуска не так хорошо, как у Сервера.Подходит для программ с интерфейсами типа десктопов.
горячий код
понимать
Когда виртуальная машина обнаруживает, что метод или блок кода запускается очень часто, она идентифицирует этот код как «горячий код».
Классификация горячих кодов
- Метод вызывается несколько раз
- Тело цикла, которое выполняется несколько раз
Метод вызывается только один или несколько раз, но внутри тела метода находится тело цикла с большим количеством циклов, поэтому код тела цикла также многократно выполняется многократно, поэтому эти коды также следует рассматривать как «горячий код».
Упомянутое выше много раз является неконкретным словом, так сколько раз оно может стать горячим кодом?
Как обнаружить горячий код
Судя по тому, является ли фрагмент кода горячим кодом и должен ли он запускать даже компиляцию, такое поведение называетсяОбнаружение точки доступа, обнаружение горячих точек не обязательно знает, сколько раз был вызван метод.В настоящее время существует два основных метода обнаружения горячих точек:
- Обнаружение горячих точек на основе выборки: виртуальная машина, использующая этот метод, периодически проверяет вершину стека каждого потока.Если она обнаруживает, что определенный метод (или некоторые) часто появляется на вершине стека, то этот метод является «горячим методом».
Недостатки: неточное обнаружение горячих точек, которое легко нарушить из-за блокировки резьбы или других внешних факторов.
- Обнаружение горячих точек на основе счетчика: виртуальная машина, использующая этот метод, устанавливает счетчик для каждого метода (даже блока кода), подсчитывает количество выполнений метода и считает его «методом горячих точек», если количество раз превышает определенное количество раз. порог
Недостатки: это проблематично реализовать, для каждого метода необходимо установить и поддерживать счетчик, а отношение вызова метода нельзя получить напрямую.
HotSpot использует второй метод обнаружения горячих точек на основе счетчика.
После определения способа обнаружения горячего кода, как рассчитать определенное количество раз?
Виды счетчиков (два вида сотрудничества)
- Счетчик вызовов метода: этот счетчик используется для подсчета количества вызовов метода. Пороговое значение по умолчанию составляет 1500 раз в режиме клиента и 10000 раз в режиме сервера.
- Счетчик возврата: подсчитайте, сколько раз выполняется код тела цикла в методе.
Сотрудничество двух счетчиков (если здесь обсуждается случай Счетчик вызовов метода): когда называется метод, он сначала будет проверять, имеет ли метод версию, составленной JIT (пояснил позже), и если она существует, компилированная версия будет использоваться сначала после того, как нативный код для выполнения. Если нет компиляционной версии, увеличивайте счетчик вызовов этого метода на 1, а затем определите, превышается ли сумма счетчика вызовов метода и счетчик обратной связи, превышает порог счетчика вызовов метода. Если порог был превышен, запрос на компиляцию кода для метода будет отправлен в компилятор Tont-Time.
Когда работа по компиляции будет завершена, адрес записи вызова этого метода будет автоматически изменен системой на новый, и скомпилированная версия будет использоваться при следующем вызове метода.
Что такое байт-код, машинный код, собственный код?
Байт-код относится к общеизвестному файлу .class, а код Java компилируется в байт-код с помощью команды javac.
И машинный код, и собственный код относятся к коду, который машина может распознавать и запускать напрямую, то есть к машинным инструкциям.
Байт-код нельзя запустить напрямую, он должен быть интерпретирован JVM или скомпилирован в машинный код для запуска.
В этот момент вы должны спросить, почему Java не компилируется напрямую в машинный код, разве это не быстрее?
1.Машинный код связан с платформой,то есть с операционной системой.Разные операционные системы могут распознавать разные машинные коды.Если он скомпилирован в машинный код,то он подобен C и C++.Он не может быть кроссплатформенным, да и Java не такая громкая, как лозунг "компилируй один раз, запускай везде";
2. Причина, по которой он не компилируется сразу, заключается в том, что некоторые коды запускаются только один раз, нет необходимости компилировать, просто интерпретировать и запускать. Для этих «горячих» кодов повторная интерпретация и выполнение должны быть очень медленными.JVM постоянно оптимизирует процесс запуска программы и использует компилятор JIT для компиляции этих «горячих» кодов, так что их не нужно интерпретировать и выполнять предложение каждый раз по предложению;
3. Другая причина — сосуществование интерпретатора и компилятора, объясненное позже.
Что такое JIT?
Чтобы повысить эффективность выполнения горячего кода, во время выполнения виртуальная машина будет компилировать эти коды в машинный код, связанный с локальной платформой, и выполнять различные уровни оптимизации. компилятор времени (Just In Time Compiler), называемый JIT-компилятором
Что такое компиляция и интерпретация?
Компилятор: скомпилируйте каждый оператор исходной программы на машинный язык и сохраните его в виде двоичного файла, чтобы компьютер мог запускать программу непосредственно на машинном языке во время выполнения, что очень быстро;
Интерпретатор: только когда программа выполняется, она интерпретируется на машинный язык одна за другой для выполнения компьютером, поэтому скорость работы не такая высокая, как у скомпилированной программы;
пройти черезjavac
Команда компилирует исходный код Java-программы в байт-код Java, который мы часто называем файлом класса. Это компиляция в обычном для нас понимании.
Байт-код — это не машинный язык, и чтобы машина могла работать, его необходимо преобразовать в машинные инструкции. Этот процесс выполняется виртуальной машиной Java, и этот процесс также называется компиляцией. представляет собой более глубокий уровень компиляции. (На самом деле это объяснение, а там еще и компиляция после введения JIT)
Тут снова возникают сомнения: разве Java не интерпретируется и не исполняется?
Правильно, Java нужно транслировать байт-коды в соответствующие машинные инструкции одну за другой и выполнять их.Это функция традиционного интерпретатора JVM.Именно потому, что интерпретатор переводит и выполняет этот процесс один за другим с низкой эффективностью, JIT просто- Введена своевременная компиляция.
Следует отметить, что независимо от того, интерпретируется ли он и выполняется, или компилируется и выполняется, окончательный исполняемый блок кода может быть запущен непосредственно на реальной машине.Машинный код, или называетсясобственный код
Прикрепите картинку для понимания
Справочник по принципу компиляции: [Углубленный анализ принципа компиляции Java](Вуху. Hollisbeds.com/archives/23…)
Почему виртуальная машина HotSpot использует архитектуру интерпретатора и компилятора?
У переводчиков, так и компиляторов имеют свои преимущества
Интерпретатор: когда программу нужно запустить и выполнить быстро, интерпретатор может сыграть роль в первую очередь, экономя время компиляции и выполняя ее немедленно.
Компилятор: после запуска программы со временем постепенно начинает играть роль компилятор.После того, как все больше и больше кодов скомпилировано в локальные коды, может быть достигнута более высокая эффективность выполнения.
Сотрудничество двух: когда ограничение ресурсов памяти в среде выполнения программы велико, интерпретируемое выполнение может использоваться для экономии памяти, и наоборот, скомпилированное выполнение может использоваться для повышения эффективности. При оптимизации компилятором обнаруживается, что оптимизация не играет роли и может быть возвращена в состояние интерпретации посредством деоптимизации для продолжения выполнения.
Связь между JIT-компилятором и виртуальной машиной Java
JIT-компилятор не является обязательной частью виртуальной машины Спецификация виртуальной машины Java не требует обязательного JIT-компилятора в виртуальной машине Java, а также не ограничивает и не указывает, как должен быть реализован компилятор точно в срок.
Однако производительность компилятора JIT и степень оптимизации кода являются одними из наиболее важных показателей для измерения качества коммерческой виртуальной машины. Это также ядро виртуальной машины и часть, которая лучше всего отражает технический уровень виртуальной машины.
Классификация JIT-компиляторов
- Клиентский компилятор — компилятор C1
- Серверный компилятор — компилятор C2
В HotSpot сосуществуют интерпретатор и JIT-компилятор JIT, они являются двумя компонентами JVM. Для различных типов приложений пользователи могут гибко выбирать, запускать ли их на основе интерпретатора или на основе JIT-компилятора в соответствии со своими характеристиками и потребностями. HotSpot предоставляет пользователям на выбор несколько режимов работы, которые можно задавать параметрами, а именно: режим интерпретации, режим компиляции и смешанный режим, просто метод компиляции используется для выполнения программы, но интерпретатор все равно должен вмешиваться в процессе выполнения, когда компиляция не может быть выполнена.
Многоуровневая компиляция
Причина: поскольку JIT-компилятору требуется время выполнения программы для компиляции машинного кода, может потребоваться больше времени для компиляции кода с более высокой степенью оптимизации, а для компиляции кода с более высокой степенью оптимизации интерпретатор может также собирать информацию о мониторинге производительности для компилятора, что также влияет на скорость выполнения интерпретации. Чтобы достичь наилучшего баланса между скоростью отклика программы при запуске и эффективностью работы, виртуальные машины HotSpot позволяютМногоуровневая компиляциястратегия
Многоуровневая компиляция делится на разные уровни компиляции в зависимости от масштаба и времени, затрачиваемого на компиляцию и оптимизацию компилятора:
- Уровень 0: программа интерпретируется и выполняется, и интерпретатор не включает функцию мониторинга производительности, что может вызвать компиляцию уровня 1.
- Уровень 1: также известный как компиляция C1, компилирует байт-код в машинный код, выполняет простую и надежную оптимизацию и при необходимости добавляет логику мониторинга производительности.
- Уровень 2 (или выше): также известен как компиляция C2, которая также компилирует байт-код в собственный код, но допускает некоторые оптимизации, которые требуют много времени для компиляции, и даже некоторую ненадежную агрессивность, основанную на оптимизации информации мониторинга производительности.
Технология оптимизации компиляции
Java-программисты пришли к единому мнению, что выполнять собственный код в скомпилированном режиме быстрее, чем в режиме интерпретируемого выполнения.Причина этого консенсуса заключается в том, что в дополнение к дополнительному времени, затрачиваемому виртуальной машиной на интерпретацию и выполнение байт-кода, есть еще одна важная причина. заключается в том, что команда разработчиков виртуальных машин сосредоточила почти все меры по оптимизации на коде JIT-компилятора, поэтому в целом собственный код, сгенерированный JIT-компилятором, будет лучше, чем байт-код, сгенерированный javac. . Ниже приведены методы оптимизации кода, используемые JIT-компилятором репрезентативной виртуальной машины HotSpot при создании кода:
- Один из классических методов оптимизации, не зависящих от языка: устранение общих подвыражений.
- Один из классических методов оптимизации, связанных с языком: устранение проверки диапазона массива
- Один из самых важных методов оптимизации: встраивание методов.
- Один из передовых методов оптимизации: escape-анализ
Если можно доказать, что объект не может выйти за пределы метода или потока, то есть другие методы или потоки не могут каким-либо образом получить доступ к объекту, то для этой переменной можно сделать некоторые эффективные оптимизации:
- Размещение в стеке: Выделяйте локальные объекты, которые не попадут в стек, и объекты будут автоматически уничтожены с окончанием метода, что снизит нагрузку на систему сборки мусора.
- Устранение синхронизации: если переменная не имеет выхода из потока, то есть к ней не могут получить доступ другие потоки, то конкуренция за чтение и запись этой переменной отсутствует, и меры синхронизации могут быть устранены (синхронизация требует цены)
- Скалярная замена: Скаляр относится к типам данных, которые не могут быть разложены, например к примитивным типам данных и ссылочным типам. Агрегаты могут продолжать декомпозироваться, например, объекты в Java. Скалярная подстановка Если доступ к объекту извне невозможен и объект можно разобрать, объект может не создаваться во время фактического выполнения, а вместо этого могут быть созданы непосредственно несколько его переменных-членов, которые используются этим методом. Этот метод не только позволяет размещать переменные-члены объекта, а также читать и записывать их в стек, но также создает условия для последующих дальнейших методов оптимизации.
Согласно их собственному пониманию, порядок очков знаний не подходит, пожалуйста, направляйте.
Источник ссылки:
"Глубокое понимание виртуальной машины Java"
Вуху. Hollisbeds.com/archives/23…