JVM 如何对字节码进行验证?
Oracle官方有一小页介绍了其工作原理,可以在这里找到。
基本上,JRE不信任JDK。这是因为它不知道哪个JDK编译器创建了该类文件。它把该类文件视为敌对的,直到经过验证。
更进一步说,字节码验证是保护免受Sun所谓的“敌对编译器”攻击的必要步骤。Sun自己的Java编译器确保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 ===>>>