甲骨文自己有一个关于它如何工作的小片段页面
here
.
基本上,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 ===>>>