Предположим, у меня есть этот код (это на самом деле не имеет значения, я думаю, но только в том случае, здесь есть):java9 присущий метод неясными
public class AtomicJDK9 {
static AtomicInteger ai = new AtomicInteger(0);
public static void main(String[] args) {
int sum = 0;
for (int i = 0; i < 30_000; ++i) {
sum += atomicIncrement();
}
System.out.println(sum);
}
public static int atomicIncrement() {
ai.getAndAdd(12);
return ai.get();
}
}
А вот как я ссылающегося на него (с помощью java9):
java -XX:+UnlockDiagnosticVMOptions
-XX:-TieredCompilation
-XX:+PrintIntrinsics
AtomicJDK9
Что я пытаюсь выяснить, какие методы были заменены внутренним кодом. Первый один, который ударил (внутри Unsafe):
@HotSpotIntrinsicCandidate
public final int getAndAddInt(Object o, long offset, int delta) {
int v;
do {
v = getIntVolatile(o, offset);
} while (!weakCompareAndSwapIntVolatile(o, offset, v, v + delta));
return v;
}
И этот метод действительно присутствует на выходе указанного выше вызова:
@ 8 jdk.internal.misc.Unsafe::getAndAddInt (27 bytes) (intrinsic)
Но весь выход странно (для меня это есть):
@ 8 jdk.internal.misc.Unsafe::getAndAddInt (27 bytes) (intrinsic)
@ 3 jdk.internal.misc.Unsafe::getIntVolatile (0 bytes) (intrinsic)
@ 18 jdk.internal.misc.Unsafe::weakCompareAndSwapIntVolatile (11 bytes) (intrinsic)
@ 7 jdk.internal.misc.Unsafe::compareAndSwapInt (0 bytes) (intrinsic)
@ 8 jdk.internal.misc.Unsafe::getAndAddInt (27 bytes) (intrinsic)
Почему getAndAddInt присутствует дважды на выходе?
Также, если getAndAddInt действительно заменен внутренним вызовом, то почему существует необходимость в замене всех других встроенных методов в стек вызовов l они больше не будут использоваться. Я предполагаю, что это так же просто, как стек вызовов методов проходит по низу.
Возможно, добавление '+ PrintCompilation' (или что-то новое унифицированное эквивалент протоколирования) и пролить свет на контекст. – the8472