Почему эти методы компилируются в сборку? - PullRequest
0 голосов
/ 09 мая 2018
public class Inline {
    public static void main(String[] args) throws Exception {
        long upto = Long.parseLong(args[0]);
        for(int i = 0; i < upto; i++) {
            int x = inline1();
            Thread.sleep(1);
        }
    }
    public static int inline1() {
        return inline2();
    }
    public static int inline2() {
        return inline3();
    }
    public static int inline3() {
        return 4;
    }
}  

Это простой пример, который я использую, чтобы увидеть влияние безопасных точек и затухания счетчика на методы, компилируемые в сборку.

Насколько я понимаю, при вызове Thread.sleep (или System.gc) счетчик вызова метода / обратного фронта будет уменьшен и никогда не превысит CompileThreshold.

Thread.sleep() должен вставить безопасную точку, и методы не должны быть скомпилированы. Однако когда я запускаю приведенный выше пример с -XX:+PrintCompilation, я вижу все компилируемые методы.

Я выполняю код следующим образом:

java -XX:+PrintCompilation Inline 10000 

Моя версия Java:

java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

Я что-то упустил?

1 Ответ

0 голосов
/ 09 мая 2018

Из того, что я могу сказать, информация, на которую вы ссылаетесь в ваших комментариях, устарела. Статья "CompileThreshold является относительной!" датирована 2013 годом и описывает версию Java, доступную в то время.

Если вы посмотрите на исходный код Java 8 и Java 9 OpenJDK, вы увидите, что описанного в статье кода затухания счетчика больше нет. Это объясняет, почему вы не видите эффекта в Java 8.

(Место для поиска - "./jdk8u/hotspot/src/share/vm/runtime/safepoint.cpp" в дереве исходного кода.)

...