什么是垃圾回收
程序运行会产生各种各种的数据,那么这些数据存在于内存当中,这些数据不可能是永久存在的,无效的资源对象需要进行垃圾回收,释放内存。
引用计算法
此对象有一个引用,既增加一个计数器,删除一个引用减少一个计数器,垃圾回收时,只回收计数器为0的对象。
特点:简单但是速度很慢,缺陷是不能处理循环引用的情况。
标记清除法
标记:从根节点开始标记引用对象
清除:未被标记的对象就是垃圾对象,可以清除
原理:初始状态下所有对象的标记都为0,当内存不足的情况下,
标记阶段:GC先会进行标记阶段,从根节点开始,凡是引用的对象都标记为1,其他没有引用的对象标记为0
清除阶段:凡是对象标记为1代表该对象存在引用不清除,对象标记为0则清除,清除完毕之后所有对象重新标记为0
缺点:
1.效率较低,标记和清除两个动作都需要遍历所有的对象,并且在GC时,需要停止应 用程序,对于交互性要求比较高的应用而言这个体验是非常差的。
2.碎片化较为严重,可能导致大数据没有办法存储,小数据存储浪费空间
复制算法
为了解决效率问题,它将可用的内存按照容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况。只要移动堆指针,按照顺序分配内存即可,实现简单,运行高效。
缺陷:这种算法的代价是将内存缩小为原来的一半。
分代算法
合适的垃圾回收对象沿用合适的算法,在JVM当中年轻代适合复制算法,年老代可以标记清除发,或者标记压缩算法