Виртуальная машина Java - Оптимизация JIT

В этой главе мы узнаем об оптимизации JIT.

Встраивание метода

В этом методе оптимизации компилятор решает заменить вызовы ваших функций телом функции. Ниже приведен пример того же -

int sum3;

static int add(int a, int b) {
   return a + b;
}

public static void main(String…args) {
   sum3 = add(5,7) + add(4,2);
}

//after method inlining
public static void main(String…args) {
   sum3 = 5+ 7 + 4 + 2;
}

Используя эту технику, компилятор избавляет машину от накладных расходов, связанных с вызовами любых функций (для этого требуется вставка и выталкивание параметров в стек). Таким образом, сгенерированный код работает быстрее.

Встраивание методов может быть выполнено только для не виртуальных функций (функций, которые не переопределяются). Подумайте, что произошло бы, если бы метод 'add' был переопределен в подклассе, а тип объекта, содержащего метод, неизвестен до времени выполнения. В этом случае компилятор не будет знать, какой метод встроить. Но если бы метод был помечен как «окончательный», то компилятор легко узнал бы, что он может быть встроенным, потому что он не может быть переопределен каким-либо подклассом. Обратите внимание, что совсем не гарантируется, что финальный метод всегда будет встроенным.

Устранение недостижимого и мертвого кода

Недостижимый код - это код, который не может быть достигнут никакими возможными потоками выполнения. Мы рассмотрим следующий пример -

void foo() {
   if (a) return;
   else return;
   foobar(a,b); //unreachable code, compile time error
}

Мертвый код также является недостижимым, но в этом случае компилятор выдает ошибку. Вместо этого мы просто получаем предупреждение. Каждый блок кода, такой как конструкторы, функции, try, catch, if, while и т. Д., Имеет свои собственные правила для недоступного кода, определенные в JLS (Спецификация языка Java).

Постоянное складывание

Чтобы понять концепцию сворачивания констант, см. Пример ниже.

final int num = 5;
int b = num * 6; //compile-time constant, num never changes
//compiler would assign b a value of 30.