1.引用计数法
2.标记清除法
3.标记压缩法
4.复制法
5.分代法
6.分区法
什么是垃圾回收:
垃圾回收:Garbage collection 简称GC
简单的说垃圾回收就是将不用的对象所占用的内存回收
在java虚拟机中垃圾回收是自动的
1.引用计数法
引用计数:对于一个A对象,只要有一个对象引用引用它,A对象引用计数就加1
缺点:
1.会产生循环引用(如A,B对象都没有被使用,需要被回收,但是A引用
了B,B也引用了A,这样就导致A,B不能被回收)
2.每次对象引用,对象就会加1或减1,会影响性能
2.标记清除法
标记清除:分为标记和清除两个阶段。它有根节点,相当于链表头,标记阶段:
从根节点可以到达的对象就标记,没有被标记的对象就是垃圾对象,清除阶段:
清除哪些没有被标记的对象
坏处:会产生空间碎片
图一:
3.标记压缩法
标记压缩法:在标记清除法上加了一个压缩,什么是压缩?就是在清除时将标记的对象放在一个连续的区域
在图一的基础上:
4.复制法
赋值算法相当于将一块内存分为两块只是使用一块,在垃圾回收时将存活的对象
直接复制到另外一块中,代价内存折半了,适用于存活对象少,垃圾对象多的场景
5.分代法
分代就是:根据对象的特点将内存分为不同的区,不同的区使用不同的回收算法
一般分为:新生代和老年代,新生代使用复制算法,老年代使用标记压缩或
标记清除
为了提高回收效率:会使用一个卡表(Card Table)数据结构,是比特
集合表示为一个区域(一般是4k大小)的老年代是否持有新生代的引用
6.分区法
分区方法:将堆内存分为连续不同的小区间,每一个小区间独立使用,回收。可以控制一次回收多少个区,减少GC