目标:
虚拟机jvm
jvm由类加载子系统、运行时数据存储区、执行引擎、JNI、垃圾回收器。
内容:
一、类加载子系统
类加载子系统使用三层类加载器,以双亲委派的形式实现类加载。
java文件编译成class文件后,首先由类加载子系统加载,才有之后的一系列运行。Java的每个类,在JVM中,都有一个对应的Klass类实例与之对应,加载的过程首先是这些Klass类实例生成。
JVM中有两种类型的类加载器,由C++编写的及由Java编写的。除了启动类加载器(Bootstrap Class Loader)是由C++编写的,其他都是由Java编写的。由Java编写的类加载器都继承自类java.lang.ClassLoader。
启动类加载器没有实体,只是将一段加载逻辑命名成启动类加载器。启动类加载器做的事情是:加载类sun.launcher.LauncherHelper,执行该类的方法checkAndLoadMain……启动类、扩展类、应用类加载器逻辑上的父子关系就是在这个方法的调用链中生成的
类的生命周期是由7个阶段组成,但是类的加载说的是前5个阶段:
1、 加载
a.通过类的全限定名获取存储该类的class文件(没有指明必须从哪获取)
b.解析成运行时数据,即instanceKlass实例,存放在方法区
c.在堆区生成该类的Class对象,即instanceMirrorKlass实例
2、 验证
3、 准备
为静态变量分配内存、赋初值
实例变量是在创建对象的时候完成赋值的,没有赋初值一说
4、 解析
5、初始化
二、执行引擎
jvm有两种解释器来执行class文件
1.字节码解释器
字节码解释器是先转换为c++再转硬编码解释执行。
2.模板解释器
模板解释器直接转换为硬编码解释执行。
可以使用一种,也可以两种都使用的混合模式
JIT
JIT Compiler(Just-in-timeCompiler) 即时编译
某些极少执行到的Java指令在编译时所额外花费的时间可能比转译器在执行时的时间还长,针对这些指令而言,整体花费的时间并没有减少。基于对JIT的经验,业界发展出动态编译器(dynamiccompiler),动态编译器仅针对较常被执行的程式码进行编译,其余部分仍使用转译程式来执行。
所以现在的即时编译器都是需要运行一段时间,运行一定循环次数才触发的(动态)即时编译器。
也分两种,C1编译器和C2编译器,可以使用一种,也可以两种混合使用。目前-server模式下默认就是混合编译模式。
目前的64bit机器上只有server模式。大家现在谈执行引擎,说的都是server模式启动的JVM中的执行引擎。触发即时编译的最小单位是代码段,最大单位是方法。
Client 编译器模式下,N 默认的值 1500
Server 编译器模式下,N 默认的值则是 10000