В какой формат компилируется Java-код для выполнения в JVM?

«В какой формат компилируется Java-код для выполнения в JVM?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Java-код компилируется в байт-код — платформенно-независимый промежуточный формат, исполняемый виртуальной машиной (JVM).

Ключевые особенности:

  • Хранится в файлах с расширением .class.
  • Состоит из инструкций (opcodes), специфичных для JVM.
  • Не является машинным кодом конкретного процессора, что обеспечивает кроссплатформенность.
  • Для выполнения требует установленной JVM, которая интерпретирует или компилирует байт-код в машинный код (JIT-компиляция).

Пример:

Исходный код (Test.java):

public class Test {
    public static void main(String[] args) {
        System.out.println("Hello, JVM!");
    }
}

После компиляции javac Test.java создается Test.class. Его байт-код можно просмотреть утилитой javap:

javap -c Test

Compiled from "Test.java"
public class Test {
  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3  // String Hello, JVM!
       5: invokevirtual #4  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}