jvm面试知识结构
- 类加载顺序
- 加载:将java的class文件加载,用ClassLoader.loadClass加载。
- 链接
- 验证:验证字节码是否符合jvm规范。
- 准备:
- static final:会将值直接赋予
- 非static final:给予对象或者字段初始化值
- 解析:将连接引用转化为直接直接引用
- 初始化
- new、getstatic、putstatic、invokestatic、反射调用的进行初始化操作
- 如果父亲类未初始化先初始化父类
- 调用
- 销毁
- jvm模型
- 线程共享
- 堆:存放对象实例,并初始化参数。
- 堆又称为gc堆
- 标记算法
- 程序计数算法:
- 每个对象实例都有一个引用计数器,引用则被+1,完成则-1
- 判断对象引用数量来决定对象是否可以回收。
- 可达性算法:
- 判断引用链是否可达来决定对象是否回收
- 根据gc root判断是否可达
- 程序计数算法:
- 回收算法
- 标记-清除算法
- 特点
- 标记:从根集合进行扫面,对存活对象标记
- 清除:对堆内存从头到尾线性遍历,回收不可达内存
- 缺点:导致碎片化
- 特点
- 标记-整理算法
- 特点
- 标记:从根集合进行扫面,对存活对象标记
- 整理:移动所有存活对象,且按照内存地址次序一次排序,然后将末端内存全部回收
- 优缺点:
- 避免内存不连续
- 不用设置两块内存地址
- 适用于存活率高场景=》老年代回收
- 特点
- 复制算法
- 特点:
- 分为对象面和空闲面
- 对象在对象面创建
- 存活对象从对象面复制到空闲面
- 将对象面所有对象内存清除
- 优缺点:
- 解决碎片化问题
- 顺序分配内存简单高效
- 适用于对象存活率低场景
- 特点:
- 分代收集算法(组合算法)
- 年轻代
- 存活率低一般采用复制算法,尽可能快的收集生命周期短的对象
- 一个Eden区占80%,两个Surrivor区各占10%
- 老年代
- 经过一定次数复制仍然存活的对象(每次复制+1)
- Surrivor区放不下的
- 新生成的大对象
- 年轻代
- 标记-清除算法
- 标记算法
- 堆又称为gc堆
- 方法区:存储被jvm加载的类信息,常量、静态变量
- 永久代:jdk1.8后移到元空间(jvm外部内存)
- 堆:存放对象实例,并初始化参数。
- 线程私有
- 程序计数器:
- 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制。
- 多线程情况下,程序计数器记录程序执行行号位置。
- 虚拟机栈
- java方法执行的内存模型(后进先出)
- 包含多个栈帧(包含:局部变量、操作数栈、动态链接、返回地址)
- 递归会导致StackOverFlowError异常,递归过深栈幁数超过虚拟机栈深度。
- 本地方法栈:和虚拟机栈类似,主要作用于了Native方法。
- 程序计数器:
- 线程共享
参考资料: