Встроенный метод Java, содержащий частные вызовы - PullRequest
0 голосов
/ 15 декабря 2018

Предполагая, что jvm идентифицирует метод b.foo () как горячий, он попытается встроить его?Потому что, если это так, инструкция вызова B.bar () будет встроена в метод A.main, что запрещено, потому что bar является приватным.Что делает jvm в этих ситуациях?

Также приветствуется любая документация с более подробной информацией.Спасибо

public class A {

    public static void main(String[] args)
    {
        B b = new B();
        for (int i=0; i<99999; i++)
            b.foo();
    }
}

class B {

    public void foo() {
        bar();
    }

    private void bar() { // do something. (is small method)
    }
}

РЕДАКТИРОВАТЬ: я спрашиваю, потому что, когда я пытаюсь выполнить эту оптимизацию самостоятельно (в байт-код), я получаю ошибку проверки, которая имеет смысл:

java.lang.VerifyError:Неверная специальная инструкция: текущий класс не может быть назначен ссылочному классу

EDIT2:

public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
  stack=2, locals=5, args_size=1
     0: new           #13                 // class B
     3: dup
     4: invokespecial #14                 // Method B."<init>":()V
     7: astore_1
     8: iconst_0
     9: istore_2
    10: iload_2
    11: ldc           #15                 // int 99999
    13: if_icmpge     30
    16: aload_1
    17: astore        4
    19: aload         4
    21: invokespecial #18                 // Method B.bar:()V // VERIFY ERROR HERE
    24: iinc          2, 1
    27: goto          10
    30: return
  StackMapTable: number_of_entries = 2
    frame_type = 253 /* append */
      offset_delta = 10
      locals = [ class B, int ]
    frame_type = 19 /* same */
  LineNumberTable:
    line 5: 0
    line 6: 8
    line 7: 16
    line 14: 19
    line 15: 24
    line 6: 24
    line 8: 30

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018
  1. в начале есть исходный код
  2. компилятор java превращает его в байт-код
  3. jvm читает байт-код, проверяет его целостность и интерпретирует его.Байт-код «горячих точек» (часто выполняемых блоков кода) как раз вовремя компилируется в набор инструкций процессора, на котором работает JVM

В Java большая часть оптимизации откладывается наJIT-компилятор на шаге 3, чтобы воспользоваться статистикой, собранной во время выполнения программы.Это включает в себя вставку.

Модификаторы доступа, такие как private, проверяются во время проверки, перед интерпретацией байт-кода и перед его JIT-компиляцией.Поскольку модификаторы доступа уже были проверены, JIT полностью независим от их существования, и использование частного метода не вызывает затруднений.

Кстати, если вы хотите проверить, что делает JIT, вы можете использовать * 1014 для hotspot*-XX:+PrintAssembly для перевода машинного кода обратно в код сборки для проверки.

0 голосов
/ 15 декабря 2018

В Java оптимизация обычно выполняется на уровне JVM.Во время выполнения JVM выполняет некоторый «сложный» анализ, чтобы определить, какие методы встроить.Он может быть агрессивным во встраивании, и JVM Hotspot фактически может встраивать не финальные методы.

Компиляторы java почти никогда не встраивают вызов любого метода (JVM делает все это во время выполнения).Они делают встроенные постоянные времени компиляции (например, конечные значения статических примитивов).Но не методы.

Для дополнительных ресурсов:

  1. Статья: Механизм производительности Java HotSpot: Пример встраивания метода

  2. Wiki: вкладка в OpenJDK , заполнена не полностью, но содержит ссылки на полезные обсуждения.

...