There are one of two possibilities going on here:
-
The compiler realized that the loop is redundant and doing nothing so it optimized it away.
-
The JIT (just-in-time compiler) realized that the loop is redundant and doing nothing, so it optimized it away.
Modern compilers are very intelligent; they can see when code is useless. Try putting an empty loop into GodBolt and look at the output, then turn on -O2 optimizations, you will see that the output is something along the lines of
main():
xor eax, eax
ret
I would like to clarify something, in Java most of the optimizations are done by the JIT. In some other languages (like C/C++) most of the optimizations are done by the first compiler.