4.JVM类加载器:
a.通过类名+包名+ClassLoader实例ID找到对应的二进制字节码并加载JVM中
b.链接:1.负责对二进制字节码的格式进行校验、初始化装载类中的静态变量以及解析类中调用接口、类。
2.完成校验之后,初始化类中的静态变量并赋初值。
3.最后对类中的属性、方法等进行验证,以确保其需要的属性、方法和对应的权限存在,可能
报NoSuchMethodError、NoSuchFieldError等错误信息。
5.初始化:
a.执行类中的静态初始化代码、构造器代码以及静态属性的初始化。
四种情况下会执行:
a.调用了new b.反射调用了类中的方法
c.子类调用了初始化 d.JVM启动过程中的初始化类
6.JVM类加载顺序:
a.两种类加载器:启动类装载器(JVM实现的一部分)和用户自定义类加载器(Java程序的一部分,必须是ClassLoader类的子类)
7.JVM装载顺序:
a.JVM启动时,由BootStrap向User-Defined方向加载类;
应用进行ClassLoader时,由User-Defined向BootStrap方向查找并加载类。
1.Bootstrap ClassLoader(JVM的根ClassLoader),JVM启动时初始化此ClassLoader,并由此ClassLoader完成jre/lib/rt.jar(sun JDK实现)
中所有class文件的加载。 注:rt.jar包含java规范定义的所有接口以及实现
2.Extension ClassLoader JVM用于加载扩展功能的一些jar包
3.System ClassLoader JVM用来加载启动参数指定的Classpath中的jar包以及目录,如AppClassLoader
4.User-Defined ClassLoader
继承ClassLoader自定义ClassLoader类,用于加载非Classpath中的jar包以及目录
8.JVM常用几个方法:
a.loadClass: 加载指定名字的类,先从已加载的类中寻找,没有则继续从parent ClassLoader中寻找,仍没找到则从System ClassLoader中寻找,
最后调用findClass方法查找; 如要改变类的加载顺序,可覆盖此方法实现。
b.findLoadedClass: 从ClassLoader实例对象的缓存中寻找已加载的类,调用native方法。
c.findClass: 直接抛出ClassNotFoundException,可以通过覆盖此方法和loadClass来加载相应的类。
d.findSystemClass 从System ClassLoader中寻找类,未找到,则继续从BootStrap ClassLoader寻找,没有就返回null.
e.defineClass 将二进制的字节码转换为Class对象
f.resolveClass 负责完成Class对象的链接,如已链接过,则直接返回。
9.JVM执行引擎
a.invokestatic:调用类的static方法
b.invokevirtual:调用对象实例的方法
c.invokeinterface:将属性定义为接口来调用
d.invokespecial: 当JVM对于初始化对象(Java构造器的方法为:<init>)以及调用对象实例中的私有方法时调用。
JVM主要的执行技术有:
1.解释 第一代JVM
2.即时编译 第二代JVM
3.自适应优化 如目前的HotspotJVM 开始对所有的代码都采取解释执行的方式,并监视代码的执行情况,
对那些经常调用的方法启动一个后台线程,将其编译优化为本地代码;如该方法不再频繁使用,则
取消编译过的代码,仍对其解释执行。
4.芯片级直接执行
10.JVM运行时数据区:
1.PC寄存区:存储每个线程下一步将执行的指令,如该方法被native修饰,则PC寄存器不存储任何信息。
2.JVM栈 : JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈存放的为当前线程的基本类型
变量(八种数据类型:boolean、char、byte、short、int、long、float、double)、部分返回的结果以及
Stack Frame; 非基本类型的对象在JVM栈上仅存放一个指向堆的地址。
学习链接:http://www.open-open.com/lib/view/open1408453806147.html