垃圾回收
垃圾回收主要是针对堆内存的,堆内存存放了类的对象和数据,随着工程的不断增加对象会不断增多,如果不进行及时的垃圾回收,会造成堆内存溢出。
如果一个对象没有任何的引用指向它,那这个对象就被认定为垃圾,需要被垃圾回收器进行及时的回收才可以。
如何定位垃圾对象
引用计数法和可达性分析法
引用计数法:一个对象呗引用一次,在当前对象头上递增一次引用计数,如果这个对象的引用次数为0,代表该对象是可以回收的
引用计数法无法避免循环引用问题
可达性分析算法
如下图
X,Y两个节点对象是可以回收的
1.Java虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象
2.扫描堆中的对象,看是否能够沿着GCRoot对象为起点的引用链找到对象,找不到,表示可以回收
哪些对象可以作为GCRoot呢?
1.虚拟机栈中(栈帧中的本地变量表)引用的对象
2.方法区(元空间)中类的静态属性引用的对象
3.方法区中(元空间)常量引用的对象
4.本地方法栈中JNI(即一般说的Native方法)引用的对象