Как проверяется байт-код в JVM? - PullRequest
14 голосов
/ 16 апреля 2009

Как проверяется байт-код в JVM?

Ответы [ 2 ]

19 голосов
/ 16 апреля 2009

Сами Oracle имеют небольшую страницу с фрагментами о том, как это работает здесь .

По сути, JRE не доверяет JDK. Это потому, что он не знает, какой компилятор JDK создал файл класса. Он обрабатывает файл класса как враждебный, пока не будет проверен.

Более того, проверка байт-кода является необходимым шагом для защиты от того, что Sun называет «враждебным компилятором». Собственный Java-компилятор Sun гарантирует, что исходный код Java не нарушает правила безопасности, но когда приложение импортирует фрагмент кода, оно фактически не знает , если фрагмент кода следует правилам языка Java для безопасности. Другими словами, код, возможно, не был создан заслуживающим доверия компилятором Java.

В этом случае система времени выполнения Java на вашем компьютере должна предположить, что фрагмент поврежден и подвергнуть его проверке байт-кода.

Виртуальная машина Java даже не видит байт-код, пока не пройдет этот процесс проверки. Выполнение этого при загрузке байт-кода также имеет то преимущество, что при каждом выполнении кода не нужно выполнять много проверок во время выполнения. Поскольку он был проверен на правильность, после запуска он может работать быстрее, чем это было бы возможно в противном случае.

Представление связанной схемы приведено ниже:

                    <<<=== Unsafe / Safe ===>>>
                                  \
+---------------+        +-------------------+
|  Java source  |   +--> |   Class loader    | --+
+---------------+   |    | Bytecode verifier |   |
        |           |    +-------------------+   |
        V           |             /              |
+---------------+   |             \              V
| Java compiler |  Network        /    +-------------------+
+---------------+   |             \    |      JVM/JIT      |
        |           |             /    +-------------------+
        V           |             \              |
+---------------+   |             /              V
| Java bytecode | --+             \    +-------------------+
+---------------+                 /    | Operating system  |
                                  \    +-------------------+
                                  /              |
                                  \              V
                                  /    +-------------------+
                                  \    |     Hardware      |
                                  /    +-------------------+
                                  \
                    <<<=== Unsafe / Safe ===>>>
9 голосов
/ 16 апреля 2009

Лучшим источником информации, вероятно, является соответствующий раздел в спецификации JVM, 4.10 Проверка файлов класса .

Подробности смотрите по ссылке, но в широком смысле:

Проверка времени соединения повышает производительность интерпретатора. Дорогие проверки, которые в противном случае пришлось бы выполнять для проверки ограничений во время выполнения для каждой интерпретируемой инструкции, могут быть исключены. Виртуальная машина Java может предположить, что эти проверки уже выполнены. Например, виртуальная машина Java уже будет знать следующее:

  • Нет переполнений или переполнений стека операндов.
  • Все локальные переменные и хранилища действительны.
  • Аргументы для всех инструкций виртуальной машины Java имеют допустимые типы.

Верификатор также выполняет проверку, которая может быть выполнена без просмотра массива кода атрибута Code (§4.7.3). Выполненные проверки включают следующее:

  • Обеспечение того, чтобы конечные классы не были подклассами и чтобы конечные методы не переопределялись (§5.4.5).
  • Проверка того, что у каждого класса (кроме Object) есть прямой суперкласс.
  • Обеспечение того, чтобы пул констант удовлетворял задокументированным статическим ограничениям; Например, каждая структура CONSTANT_Class_info в пуле констант содержит в своем элементе name_index действительный индекс константы пула для структуры CONSTANT_Utf8_info.
  • Проверка того, что все ссылки на поля и ссылки на методы в пуле констант имеют действительные имена, допустимые классы и допустимый дескриптор типа.
...