目录
2.1优点:
2.2缺点:
一.类的加载过程
1.1分为三大阶段
加载:查找并且加载类的二进制数据
链接:
验证:确保被加载类的正确性
准备:为类的静态变量分配内存,并将其初始化为默认值
解析:把类中的符号引用转换为直接引用
初始化:执行构造方法
1.2 加载
类加载过程的第一步,主要完成下面3件事情:
通过全类名获取定义此类的二进制字节流
将字节流所代表的静态存储结构转换为方法区的运行时数据结构
在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口
一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,这一步我们可以去完成还可以自定义类加载器去控制字节流的获取方式(重写一个类加载器的 loadClass() 方法)。数组类型不通过类加载器创建,它由 Java 虚拟机直接创建。
1.3验证
主要目的:检查输入的字节流。为了确保当前加载的Class字节流符合虚拟机的要求,不会危害到虚拟机
检验动作
文件格式验证。判断当前字节流是否符合Class文件格式要求。
原数据验证。语义分析,判断数据类型是否符合Java语言规范
字节码验证。判断方法是否符合Java语言规范
符号引用验证。判断能否找到所引用的类
1.4准备
目的:给类中静态变量赋予初值,其他的变量随着类的初始化,跟类存放在堆中
1.5解析
目的:将常量池中的符号引用变成直接引用
1.6初始化
目的:初始化是类加载的最后一步,初始化阶段是执行类构造器 <clinit> ()方法的过程
1.7卸载
卸载类即该类的Class对象被GC。
卸载类需要满足3个要求:
该类的所有的实例对象都已被GC,也就是说堆不存在该类的实例对象。
该类没有在其他任何地方被引用
该类的类加载器的实例已被GC
所以,在JVM生命周期类,由jvm自带的类加载器加载的类是不会被卸载的。但是由我们自定义的类加载器加载的类是可能被卸载的。
二.双亲委派模型
优点:
- 避免重复加载某类
- 避免系统API被篡改
缺点:
双亲委派模型缺点/什么场景会大批双亲委派模型
Java SPI -> JDBC
- 为什么要有垃圾回收?——》在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象;而在Java中,当没有对象引用指向原先分配给某个对象 的内存时,该内存便成为垃圾。 垃圾回收能自动释放内存空间,减轻编程的负担,JVM的一个系统级线程会自动释放该内存块。垃圾回收意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。当一个对 象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放没用的对象,垃圾回收也可以清除内存记录碎片。由于创建对象和垃圾回收器释放丢弃对象所占的内存空间,内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆的一端,JVM将整理出的内存分配给新的对象
- 垃圾回收主要回收哪个内存区域?——》主要回收两部分内容:废弃的常量和不再使用的类型。
- 标记的过程(见图)
- 回收的过程(见图)
- 垃圾回收器有哪些典型实现?