【2019秋冬】【面经】JVM

血红的双手。 提交于 2020-02-25 01:18:29

Java运行时数据区/内存区域
程序计数器
虚拟机栈 基本数据类型和对象引用
Java堆 对象实例及数组
本地方法栈 native方法
方法区 被虚拟机加载的类,静态变量,常量,编译后代码

判断常量是废弃常量
看这个常量是否还被引用

判断类是无用类
1.该类不存在任何实例
2.该类的类加载器已经被回收
3.无法通过反射的方法调用该类

垃圾收集算法,特点
1.标记清除
常用于老年代,把要回收的进行标记,标记完成后统一回收
2.标记整理
用于老年代,把存活的统一向一边移动,按边界清除回收
3.复制算法
分两半,当一半快满时,把存活的移动至另一半
4.分代算法
把Java堆分为新生代和老年代 1/3 2/3
新生代按8:1:1的Eden和Survivor,每次使用一个Eden和一个Survivor,当快满时,把所有存活的放入另一块Survivor,另外两块清空
新生代没更新一次就+1,当达到15时自动转化为老年代

HotSpot为什么要分老年代新生代
对不同的代可以采用不同的回收算法,效率更高

常见垃圾收集器
Serial 单线程,新生代
ParNew 多线程,新生代,和CMS一起用
Parallel Scavenge 多线程,新生代,考虑吞吐量
Serial Old 单线程,老生代
Parallel Old 多线程,老生代
CMS 老生代,初始标记,并发标记,重新标记,并发清理
G1 可以全部用,设置了优先级,按优先级回收 初始标记,并发标记,最终标记,筛选回收

Minor GC 和 Full GC区别
Minor GC是用于新生代,复制算法
Full GC是用于老生代,标记整理算法

Java创建对象过程
1.看类是否在常量池中,或者有没有被初始化过
2.将类的字段信息和方法信息存储到方法区
3.为类在Java堆上分配空间
4.对类的成员变量进行初始化
5.执行构造函数

对象访问定位的两种方式
直接访问模式,速度快
在Java堆中直接存放的就是对象地址

句柄模式,发生改变时只修改句柄即可
在Java堆中开辟一块内存放句柄,引用中存放的是句柄,句柄中存放的是地址

类加载机制
加载 把对应类的class文件加载到方法区
验证 验证class文件是否正确
准备 给静态变量分配内存空间
解析 将常量池内符号转为直接引用
初始化 对静态变量和静态块初始化赋值

双亲委派模型
针对类加载器,当子类加载器收到请求时,会直接传给父类,直到最顶端的启动类加载器,如果顶端无法完成这个请求时,子类会进行实现

判断对象是否死亡
从GC root向下搜索,如果这个对象没有在引用链上,就可以被回收

引用计数器,有引用加一,无引用减一,零回收,无法解决循环引用问题

强引用,弱引用,软引用,虚引用

强引用:永远不会被回收
软引用:空间不足时才回收
弱引用:当扫描发现只有弱引用时会回收
虚引用:最弱的引用,不决定对象生命周期

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!