nehme ich diesen Code haben (es ist wirklich egal, wie ich glaube, aber nur für den Fall hier ist es):java9 intrinsische Methode unklar
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();
}
}
Und hier ist, wie ich es bin Aufruf (mit java9):
java -XX:+UnlockDiagnosticVMOptions
-XX:-TieredCompilation
-XX:+PrintIntrinsics
AtomicJDK9
Was ich herausfinden möchte, ist, welche Methoden durch intrinsischen Code ersetzt wurden. Die erste, die getroffen wird (innen 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;
}
Und diese Methode in der Tat in der Ausgabe des obigen Aufrufs vorhanden ist:
@ 8 jdk.internal.misc.Unsafe::getAndAddInt (27 bytes) (intrinsic)
Aber die gesamte Ausgabe ist seltsam (für mich, dass) ist:
@ 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)
Warum die getAndAddInt in der Ausgabe zweimal vorhanden ist?
Auch wenn getAndAddInt in der Tat durch einen intrinsischen Aufruf ersetzt wird, warum ist es notwendig, alle anderen intrinsischen Methoden in den Aufrufstack zu ersetzen l sie werden nicht mehr verwendet werden. Ich nehme an, dass es so einfach ist, wie der Stapel von Methodenaufrufen von unten durchlaufen wird.
vielleicht hinzufügen '+ PrintCompilation' (oder was auch immer das neue Unified Logging Äquivalent ist) und beleuchten den Kontext. – the8472