Więc mam ta metoda, napisany w Javie:Gdzie znajduje się skompilowany kod JIT?
public void myMethod(int y){
int x = 5 + y;
doSomething(x);
}
i zakładamy, moja aplikacja wywołuje to wiele razy ..
Po uruchomieniu skompilowany kod dla tej metody na Java Virtual Machine, JVM najpierw zinterpretuj metodę. Potem, po pewnym czasie, zdecyduję się skompilować go na język maszynowy, jeśli dobrze zrozumiem.
W tym momencie
zostanie zastąpiony przez kod maszynowy w pamięci? Jeśli zostanie on nadpisany, w jaki sposób rozwiązany zostanie problem różnicy wielkości? Jeśli zostanie zapisane w innym miejscu w pamięci, czy kod bajtowy załadowany do pamięci zostanie zwolniony, czy nie? A także, jeśli kod bajtowy i skompilowany przez jit jest w pamięci, gdy aplikacja ponownie trafi tę metodę, w jaki sposób JVM decyduje się na wykonanie skompilowanego kodu jit zamiast kodu bajtowego?
Wpadłem na pomysł, że tego rodzaju rzeczy będą zależeć od tego, czy używasz komputera z systemem Windows, czy na przykład na pozbawionym pamięci RAM mikrokontroleru. Innymi słowy, zależne od platformy, nie? – Ghostkeeper
Odpowiedź 1: Dlaczego Cię to obchodzi? Odpowiedź 2: JVM przechowuje kod JITCed dla każdej metody w sterty C, połączonej za pomocą tabel w wewnętrznej reprezentacji obiektu klasy. Kod jest usuwany tylko wtedy, gdy kończy się JVM lub w rzadkim przypadku, gdy klasa jest "rozładowana". Wszystko to jest zarządzane przez odpowiednią magię. –
"Stertę C" jest tu naprawdę mylące - jeśli odnosi się do pamięci uzyskanej za pomocą wywołań do malloc (które mogą lub nie muszą być wyrównane do strony), odpowiednie strony musiałyby być oznaczone jako wykonywalne. Bardziej prawdopodobne jest, że JIT przydziela pamięć dla wygenerowanego kodu za pomocą mmap, VirtualAlloc i tym podobnych. –