Pewnie JVM wykonuje sprawdzenie warunku zakończenia pętli i na to idą cykle CPU.
edycja:
Warunek nawet nie jest sprawdzany.
public class Foobar
{
public static void main(String[] args) {
while (true) {
}
}
}
Jak spojrzymy na instrukcje wykonywane przez JVM dla tego kodu:
javap.exe -c Foobar.class
Compiled from "Foobar.java"
public class Foobar {
public Foobar();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: goto 0
}
Widać, że ta psuta pętla, to po prostu goto, czyli CPU idzie na wykonanie tejże instrukcji.
druga edycja:
Takie obserwacja co robi proces i ile czasu mu to zajmuje, w rozbiciu na wywołania w user space, kernel space, łatwo się robi pod Linuksem, bo są narzędzia typu DTrace. Jak wpisałem na szybko odpowiednik DTrace pod Windows, to aż się zdziwiłem: https://techcommunity.microsoft.com/t5/Windows-Kernel-Internals/DTrace-on-Windows/ba-p/362902 :)