垃圾回收与算法
一、垃圾回收机制
1.1、引用计数法
在java中引用和对象是有关联的。如果要操作对象必须用引用进行。因此。很简单的办法是通过引用计数来判断一个对象是否可以回收。即一个对象如果没有任何与之关联的引用,即他们的引用计数都为0,则说明对象没有被引用,即不可达对象,就是可回收对象
引用计数存在循环引用的问题,写一个类,创建两个对象,
MyObject myObject1 = new MyObject(); MyObject myObject2 = new MyObject();
myObject1、myObject2分别记录了对象的地址,所以对象被创建出来,引用计数就是1,再让他们互为引用,那么这两个对象的引用计数都是2,他们就无法被回收。
1.2、可达性分析
为了解决引用计数的循环引用问题,java使用了可达性分析的方法。通过一系列的“GC ROOT”对象作为起点搜索。如果在“GC ROOT”和一个对象之间没有可达路径,则称该对象是不可达的。
GC ROOT:VM栈中的引用、方法区中的静态引用、JNI(本地方法调用,与其他语言的通信)中的引用
二、垃圾回收算法
标记清楚、复制、标记整理、分代收集
标记清除:
最基础的清除算法,先扫描一轮,标记出需要清除的数据,第二轮,清除掉标记的数据,这种方法,会造成碎片化,后续大的对象可能找不到地方存储。
复制算法:
始终有一块空白空间,是用来存储复制过来的所有的存活的对象。然后将其余空间的对象全部清除就好了,这种算法简单方便,而且不会有碎片化,但是可用内存被压缩了,而且对象增多的话,复制效率会下降。
标记整理:
标记后,不清理对象,而是将存活对象移向内存的一端,然后清除端边界外的对象,也就是存活对象和可回收对象,进行位置的替换和移动,直到存活对象被整理到最左端,然后再清除掉存活对象边界以外的可回收对象。
分代收集算法
即新生代使用复制算法,老年代使用标记整理算法