目录
JVM体系结构
java类的三种状态
java类的生命周期
类加载器
分类:
源码:
双亲委派加载机制
SOURCE:源码状态(静态)
CLASS:二进制字节码文件状态(静态)
RUNTIME:运行时状态(加载到JVM中的状态)
从CLASS——RUNTIME的过程需要类加载器
当程序使用某个类,如果该类还未被加载到内存中,则系统会通过加载、连接、初始化三个步骤来对该类进行初始化。如无意外,JVM会连续完成这三个步骤,所有有时也成为类加载或类初始化。
类加载: 将类的class文件读入内存,并为之创建一个java.lang.Class对象,也就是说,当程序使用任何类时,系统都会为之创建一个java.lang.Class对象。
系统中所有类实际上也是对象,他们都是java.lang.Class的实例
由类加载器完成的。
类的连接: 连接负责把类的二进制数据合并到JRE中,分为3阶段:
验证:验证阶段用于检验被加载的类是否有正确的内部结构,并和其他类协调一致(确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全)文件格式验证、元数据验证、字节码验证、符号引用验证
准备:类准备阶段则负责为类的类变量分配内存,并设置默认初始化为类变量(static修饰的变量)分配内存并设置类变量初始值(通常情况下数据类型的值为0)的阶段,这些变量所使用的内存都将在方法区中进行分配。不包括实例变量(实例变量在对象实例化时随着对象一起分配在Java堆中)
解析:将类的二进制数据中的符号引用替换成直接引用
类的初始化: 主要对类变量或其他资源进行初始化。
类加载器:ClassLoader将类的class文件读入内存,并为之创建一个java.lang.Class对象
某个特定的类加载器在接到加载类的请求时,首先将加载任务委派给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
特点:
父类能加载的不给子类加载;这个类加载过,就不能再加载。优点:
自带优先级;是一种安全机制,程序安全是JDK的事(程序员写了不安全的程序,JDK有责任不让他运行),文件安全是系统的事;如果自己写了一个java.lang.Object的类,将不会被加载运行