JVM原理之类加载器

JVM体系结构大概分为三部分:

(1)类加载器,用来加载.class文件

(2)执行引擎,用来执行字节码文件或本地方法

(3)运行时数据区,包括堆、栈、方法区、pc寄存器、本地方法栈


虚拟机怎样把类装载进来的呢?

要经过三步:装载(Load)-> 链接(Link)-> 初始化(Initializ)。

其中链接又可分为校验(Verify),准备(Prepare),解析(Resolve)三步。

JVM原理之类加载器_第1张图片


类加载器:

JVM类加载整体分为三步分

装载:将字节码文件装载到JVM中,由类名、包名通过ClassLoader进行装载。同样,通过类名、包名、ClassLoader ID来区分已经装载的字节码文件

链接:负责对字节码文件进行校验、初始化装载类中的静态变量、解析类中调用的类或接口

在对字节码文件校验之后,初始化类中的静态变量,为其付为默认值。然后开始检验类中的属性和方法,以确保属性和方法的存在,以及对应的权限是否复合。

初始化:初始化过程会执行静态代码块、构造方法、以及静态属性的初始化。一般在以下情况执行初始化:调用了new、通过反射执行了类中的方法、子类调用了初始化、JVM过程指定的初始化类


JVM类加载器顺序:

JVM包括两种类装载器:启动类装载器和用户自定义类装载器

启动类装载器是JVM实现的一部分;用户自定义类装载器是java程序的一部分,必须是ClassLoader的子类


类的加载过程首先需要检验该类是否被加载了,检验类的加载过程是自底向上,只要某个ClassLoader以加载,就视为该类已经被加载了,这样保证每个类只被加载一次避免重复加载。而类的加载过程是自顶向下的。

JVM原理之类加载器_第2张图片

                               (图片来源:http://blog.csdn.net/cutesource/article/details/5904542)

Bootstrap ClassLoader:

是JVM的的根ClassLoader,使用C++编写的。在启动JVM的时候加载此类,由此类加载$JAVA_HOME下的jre/lib/rt.jar的所有class文件的加载,这个jar包,包括了java规范定义 的所有接口和实现。

Extension ClassLoader:

负责加载java中一些扩展功能的jar包,包括$JAVA_HOME下的jre/lib/*.jar和-Djava.ext.dirs指定的jar包

App ClassLoader(System ClassLoader)

否则加载启动参数指定的classpath下的jar包和文件夹下面的class

Custom ClassLoader

是java开发人员通过集成ClassLoader自行实现的ClassLoader,可以用来加载非classpath下的jar包。在tomcat或者jboss下也会根据j2ee规范实现ClassLoader。


JVM执行引擎

类执行原理:

JVM是基于栈来执行.class,当线程在创建后会产生程序计数器(PC)和栈(Stack)。计数器负责记录下一次要执行的指令在方法中的偏移量,而在栈中存放的是一个个栈帧,每个栈帧对应着每个方法每次调用。每个栈帧又是由局部变量区和操作数栈组成,局部变量区用来存放方法中的局部变量和参数,操作数栈用来存放执行过程产生的中间结果。

你可能感兴趣的:(JVM原理)