Обычно считается, что все новые объекты, все выделяются на кучу, но это не совсем правильно. Благодаря анализу процесса распределения объектов Java мы обнаружили, что в дополнение к распределению на куче объекты также могут выделять пространство в стеке или TLAB. Техническая основа для распределения объектов в стеке - анализ побега и скалярная замена. Эта статья в основном представляет анализ побега.
Определение анализа побега
Анализ побега-это межфункциональный глобальный алгоритм анализа потоков данных, который может эффективно снизить синхронную нагрузку и давление на распределение кучи памяти в программах Java.
Благодаря анализу побега, компилятор Hotpot Java может проанализировать область использования ссылки нового объекта и определить, выделять ли объект на кучу.
Java поддерживает и позволяет экологическую анализ в Java SE 6U23 и более поздних версиях. Компилятор Java Hotspot JIT может выполнить анализ экономного кода, когда метод перегружен или динамически загружен.
Основное поведение анализа побега состоит в том, чтобы проанализировать динамический объем объекта: когда объект определяется методом, на него можно ссылаться внешний метод.
Метод Escape: например, передайте в качестве параметра вызова другим методам.
Выход из потока: к нему можно получить доступ к внешним потокам, таким как присвоение значений переменным класса или переменных экземпляра, к которым можно получить доступ в других потоках.
Теоретическая основа анализа побега
Анализ побега проводится на основе алгоритма, описанного Чон-деок Чой, Манишем Гупта, Маурисио Сеффано, Вуграмама С. Шридхаром, Сэмом Мидкиффом и другими в статье «Анализ побега для Java».
Этот алгоритм вводит подключенный график и использует подключенный график для построения доступной взаимосвязи между ссылкой на объект и объекта, и на основе этого предлагается комбинированный метод анализа потока данных. Поскольку алгоритм зависит от контекста и чувствительный к потоку и имитирует вложенные отношения на любом уровне объекта, точность анализа высока, но время выполнения и потребление памяти относительно велики.
Большинство реализаций анализа побега основаны на предпосылке «закрытого мира»: все возможные методы, которые выполняются, были известны перед анализом побега, и фактическая работа программы не изменит отношения между ними. Но когда работает настоящая программа Java, такие предположения не верны. Многие функции программ Java, такие как динамическая загрузка класса, вызов локальных функций и отражение вызовов программы, сломают так называемую конвенцию «закрытого мира».
Операции обработки после анализа побега
После анализа побега может быть получено три возможных состояния выхода из объекта:
GlobalScape: то есть ссылка объекта ускользает от метода или потока. Например, ссылка объекта копируется в переменную класса или сохраняется в сбежавшем объекте, или ссылка объекта возвращается в метод вызова в качестве возвращаемого значения метода.
ArgeScape (Escape Level Parameters): то есть применение объекта, передаваемого методу во время процесса вызова метода. Это состояние может быть определена путем анализа бинарного кода настраиваемого метода.
NOESCAPE: объект, который можно заменить скальсами. Объект не может быть выделен на традиционную кучу.
Компилятор может использовать результаты анализа побега для оптимизации программы:
Объект распределения кучи становится объектом распределения стека: объектом в методе, и ссылка на объект не уходит, поэтому этот метод может быть выделен на память стека и очень распространен для памяти.
Устранение синхронизации: стоимость синхронизации потока довольно высока, а последствиями синхронизации являются снижение параллелизма и производительности. Анализ побега может определить, всегда ли доступ к объекту доступен только одним потоком. Если к нему обращается только один поток, то операция синхронизации объекта может быть преобразована в операцию без защиты от синхронизации, что может значительно улучшить степень параллелизма и производительности.
Замена вектора: Метод анализа побега Если вы обнаружите, что структура хранения памяти объекта не нужно выполнять непрерывно, вы можете сохранять детали и даже все объекты в регистрах ЦП, что может значительно улучшить скорость доступа.