Так я этот метод, написанный на Java:Где находится скомпилированный код JIT?
public void myMethod(int y){
int x = 5 + y;
doSomething(x);
}
И предположим, мое приложение называет это много раз ..
При запуске скомпилированного кода для этого метода на Java Virtual Machine, JVM будет сначала интерпретируйте метод. Затем через некоторое время он решит скомпилировать его на машинный язык, если я правильно пойму.
На данный момент,
Будет ли перезаписана машинный код в памяти? Если он будет перезаписан, как будет решаться проблема разности размеров? Если он записан в другое место в памяти, будет ли освобожден байт-код загружен в память или нет? А также, если оба байта и jit скомпилированный код находятся в памяти, когда приложение снова обращается к этому методу, как JVM решает выполнить скомпилированный код jit вместо байтового кода?
У меня возникла мысль, что это будет зависеть от того, работаете ли вы на машине под Windows или, скажем, на микроконтроллере с RAM-голоданием. Другими словами, зависит от платформы, нет? – Ghostkeeper
Ответ 1: Почему вас это волнует? Ответ 2: JVM хранит код JITCed для каждого метода в C heap, связанный с помощью таблиц во внутреннем представлении объекта класса. Код удаляется только при завершении JVM или в редком случае, когда класс «разгружен». Все это управляется подходящей магией. –
«C heap» на самом деле является неправильным здесь - если это относится к памяти, полученной с помощью вызовов в malloc (которые могут быть или не выровнены по страницам), соответствующие страницы должны быть отмечены как исполняемые. Скорее всего, JIT выделяет память для сгенерированного кода с помощью mmap, VirtualAlloc и тому подобного. –