作者:
Jackson Joseraj
译者:码农网-小峰
原文:The JVM Architecture Explained
译文:www.codeceo.com/article/jvm-architecture-explained.html
(
点击文末阅读原文即可前往
)
每个Java开发人员都知道字节码由JRE(Java运行时环境)执行。但许多人不知道JRE是Java Virtual Machine(JVM)的实现,它分析字节码,解释代码并执行它。作为开发人员,我们应该知道JVM的架构是非常重要的,因为它使我们能够更有效地编写代码。在本文中,我们将更深入地了解Java中的JVM架构和JVM的不同组件。
什么是JVM?
虚拟机
是物理机器的软件实现。Java是用在VM上运行的WORA(Write Once Run Anywhere)概念而开发的。编译器将Java文件编译为Java .class文件,然后将.class文件输入到JVM中,JVM会加载并执行类文件。下面是JVM的架构图。
JVM如何工作?
如上面架构图所示,JVM分为三个主要子系统:
-
类加载器子系统(Class Loader Subsystem)
-
运行时数据区(Runtime Data Area)
-
执行引擎(Execution Engine)
1.类加载器子系统
Java的动态类加载功能由类加载器子系统处理。它在运行时,而不是编译时首次引用类的时候加载、链接、并初始化类文件。
1.1加载
类将通过此组件加载。Boot Strap Class Loader,Extension Class Loader和Application Class Loader是有助于实现的三个类加载器。
(1)Boot Strap Class Loader——负责加载来自于Bootstrap类路径的类,就是rt.jar。此加载程序将给予最高优先级。
(2)Extension Class Loader——负责加载在ext文件夹(jre \ lib)内的类。
(3)Application Class Loader——负责加载应用程序级类路径,路径提到环境变量等
上面的类记载器在加载类文件时遵循Delegation Hierarchy 算法。
1.2链接
(1)验证——字节码验证器将验证生成的字节码是否正确,如果验证失败,我们将得到verification error。
(2)准备——对于所有的静态变量,内存将被分配和配置默认值。
(3)解决——所有的符号存储器引用都将替换为来自Method Area的原始引用。
1.3初始化
这是类加载的最后阶段,这里所有的静态变量都将被赋予原始值,并执行静态块。