JVM(二)

JAVA虚拟机执行

JVM的执行都是通过字节码指令来执行。如两个int类型数据相加通过iadd指令,所以JAVA文件经过编译后,可能形成的是各种指令。

同步的实现

JAVA的同步使用两个指令来实现monitorenter,monitorexit,同步块是使用这两个指令显示的达到锁的效果,当monitorenter进入后,线程就是持这个块的锁,阻塞了其它的访问,直到monitorexit指令被调用 ,同步方法是隐式的实现,通过常量池表中ACC_SYNCHORIZED常量标注方法,最后还是这两个指令实现。

虚拟机启动的过程

JAVA虚拟机在启动的过程通过引导类(bootstrap class load)创建一个初始类来完成,创建这个类实现是虚拟机内部实现,这个类有一个main方法,启动过也是在这个main方法中完成,在main方法中会进行依次加载类,然后对加载的类进行链接,后面进行初始化。

1、加载

根据特定名称找到CLASS的二进制表示,并根据这个二进制创建类或接口的过程。

加载类的过程,可以使用引导类直接加载也可以委托其它加载类来实现加载 ,也可以使用自定义的加载类,所有的加载类都是ClassLoader的实现。加载类过程一般都是一个委托的过程,A委托B,B委托C加载类M。
加载一般分为两种,一种是引导类加载 ,一种自定义实现的加载类(实现ClassLoader,包含loadClass(N) 方法),被加载的类,在加载前应该是存在方法区中。在加载的时候会进行一些安全的校验。
数组的创建是由虚拟机来实现的,如果是一些引用类型的数组内的对象则先是进行加载类载入,然后再由虚拟机来创建数组,数组不由加载类来创建。

2、链接

链接是对已经成功加载的类进行验证、准备、解析

验证:链接对已经加载类进行一次验证,验证主要确保类的二进制在结构信息上正确
准备:创建类或接口的静态字段,并用默认值初始化这些字段 ,但不执行任何虚拟机字节码指令
解析:对类的二进制码中运行常量池符号引用进行解析成直接引用

初始化

初始化调用类或接口的 init方法进行初始

类是调用cinit方法进行初始化,这个方法是特殊方法,不符合JAVA规范,不能在编译通过的。只有通过new指令或调用静态方法或属性时才会触发类的初始化。
初始化需要考虑多线程并发对类的初始,所以使用了初始锁,每个类或接口都有一个初始锁LC。通过LC防止多线程同时执行初始化。

你可能感兴趣的:(JAVA)