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向下搜索,如果这个对象没有在引用链上,就可以被回收
引用计数器,有引用加一,无引用减一,零回收,无法解决循环引用问题
强引用,弱引用,软引用,虚引用
强引用:永远不会被回收
软引用:空间不足时才回收
弱引用:当扫描发现只有弱引用时会回收
虚引用:最弱的引用,不决定对象生命周期
来源:CSDN
作者:之井
链接:https://blog.csdn.net/mdzz_z/article/details/104473811