Сообщения

Повышение производительности Java Hotspot VM: сжатые нулевые указатели на обычные объекты

Изображение
Когда JVM использует сжатые обычные указатели объектов (oops) в 64-разрядном процессе JVM, программное обеспечение JVM отправляет запрос операционной системе на резервирование памяти для кучи Java, начиная с нулевого виртуального адреса. Если операционная система поддерживает такой запрос и может зарезервировать память для кучи Java по нулевому виртуальному адресу, то используются сжатые значения, основанные на нуле. Когда используются сжатые значения, основанные на нуле, 64-битный указатель может быть декодирован из 32-битного смещения объекта без включения базового адреса кучи Java. Для размеров кучи менее 4 гигабайт программное обеспечение JVM может использовать смещение байта вместо смещения объекта и, таким образом, также избежать масштабирования смещения на 8. Соответственно, эффективно кодирование 64-битного адреса в 32-битное смещение. Для кучи Java размером до 26 гигабайт операционные системы Linux и Windows обычно могут выделять кучу Java по нулевому виртуальному адресу. ...

Повышение производительности Java Hotspot VM: сжатый указатель на обычный объект

Изображение
Обычный указатель объекта (oop, ordinary object pointer) для Java Hotspot - это управляемый указатель на объект. Как правило, oop имеет тот же размер, что и собственный указатель компьютера, который является 64-разрядным в системе LP64. В системе ILP32 максимальный размер кучи составляет менее 4 гигабайт, что недостаточно для многих приложений. В системе LP64 куча, используемая данной программой, может быть примерно в 1,5 раза больше, чем при работе в системе ILP32. Это требование связано с расширенным размером управляемых указателей. Память стоит недорого, но в наши дни пропускная способность и кэш ограничены, поэтому нежелательно значительно увеличивать размер кучи и получать только более 4 ГБ. Управляемые указатели в куче Java указывают на объекты, которые выровнены по 8-байтовым границам адресов. Сжатые операции представляют управляемые указатели (во многих, но не во всех местах программного обеспечения виртуальной машины Java (JVM)) в виде 32-битных смещений объектов от 64-битног...

Повышение производительности Java Hotspot VM: Graal, AOT компиляция

Изображение
Graal: основанный на Java JIT-компилятор Graal - это высокопроизводительный оптимизирующий, just-in-time (JIT) компилятор, написанный на Java, который интегрируется с Java HotSpot VM. Это настраиваемый динамический компилятор, который вы можете вызывать из Java. Некоторые из особенностей и преимуществ Graal включают в себя: Гибкие спекулятивные оптимизации Лучше встраивание (inlining) Частичный escape анализ Преимущества инструментов Java и IDE поддержка Метациркулярный подход, обеспечивающий более жесткий контроль генерации кода Вы можете использовать Graal и в статическом контексте. Статический компилятор Ahead of Time основан на платформе Graal. Graal является частью сборки JDK и поставляется как внутренний модуль, jdk.internal.vm.compiler. Он связывается с JVM с помощью интерфейса компилятора JVM (JVMCI). JVMCI также является частью сборки JDK и содержится во внутреннем модуле: jdk.internal.vm.ci. Чтобы включить Graal в качестве JIT-компилятора, используйте следующую о...

Повышение производительности Java Hotspot VM: многоуровневая компиляция

Изображение
Многоуровневая компиляция , представленная в Java SE 7, обеспечивает скорость запуска клиентской виртуальной машины на виртуальной машине сервера. Без многоуровневой компиляции виртуальная машина сервера использует интерпретатор для сбора информации о методах профилирования, которая отправляется компилятору. При многоуровневой компиляции виртуальная машина сервера также использует клиентский компилятор для генерации скомпилированных версий методов, которые собирают информацию о профилировании. Скомпилированный код значительно быстрее, чем интерпретатор, и программа выполняется с большей производительностью на этапе профилирования. Зачастую запуск происходит быстрее, чем скорость запуска клиентской виртуальной машины, поскольку окончательный код, созданный серверным компилятором, может быть доступен на ранних этапах инициализации приложения. Многоуровневая компиляция также может обеспечить лучшую пиковую производительность по сравнению с обычной серверной виртуальной машиной, поскольку ...

Повышение производительности Java Hotspot VM: компактные строки

Изображение
Функция компактных строк вводит внутреннее представление строк с эффективным использованием пространства. Данные из разных приложений показывают, что строки являются основным компонентом использования кучи Java и что большинство объектов java.lang.String содержат только символы Latin-1. Такие символы требуют только одного байта памяти. В результате половина пространства во внутренних символьных массивах объектов java.lang.String не используется. Функция компактных строк, представленная в Java SE 9, сокращает объем занимаемой памяти и снижает активность по сбору мусора. Эта функция может быть отключена, если вы наблюдаете проблемы снижения производительности в приложении. Функция компактных строк не представляет новых общедоступных API или интерфейсов. Она изменяет внутреннее представление класса java.lang.String из массива символов UTF-16 (два байта) в байтовый массив с дополнительным полем для идентификации кодировки символов. Другие связанные со строками классы, такие как Abstract...

Паттерн Стратегия (Strategy) в Java

Изображение
Паттерн Стратегия (Strategy) относится к поведенческим (behavioral) паттернам проектирования. Также известен как Политика (Policy). Основным замыслом паттерна является следующая ситуация. Вы определяете семейство алгоритмов, инкапсулируете каждый и делаете их взаимозаменяемыми. Стратегия позволяет алгоритму варьироваться независимо от клиентов, которые используют его. Используйте шаблон стратегии, когда многие связанные классы отличаются только своим поведением. Стратегии предоставляют способ настроить класс на одно из многих поведений вам нужны разные варианты алгоритма. Например, вы можете определить алгоритмы, отражающие различные компромиссы пространства/времени. Стратегии могут использоваться, когда эти варианты реализованы в виде иерархии классов алгоритмов. алгоритм использует данные, о которых клиенты не должны знать. Используйте паттерн Стратегия, чтобы избежать выявления сложных, специфичных для алгоритма структур данных. класс определяет много поведений, и они появля...

Паттерн Декоратор (Decorator) в Java

Изображение
Паттерн Декоратор (Decorator) относится к структурным паттернам проектирования. С его помощью можно прикрепить дополнительные обязанности к объекту динамически. Декораторы предоставляют гибкую альтернативу подклассам для расширения функциональности. Пример из реального мира. Предположим существует автомобиль. Он имеет максимальную скорость, с которой может ездить. Для того чтобы увеличить скорость не обязательно создавать другой автомобиль. Можно просто провети тюнинг (например, заменить колеса на облегченные, убрать из салона сидения пассажиров, поменять мотор как радикальная мера) - и тогда максимальная скорость автомобиля увеличится. Простыми словами паттерн Декоратор позволяет динамически изменять поведение объекта во время выполнения, оборачивая их в объект класса декоратора. В объектно-ориентированном программировании паттерн декоратор является паттерном проектирования, который позволяет добавлять поведение к отдельному объекту, статически или динамически, без влияния на пове...