Ответ 1
У самих 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 ===>>>