什么是垃圾回收算法,垃圾回收算法的作用什么:
- 垃圾回收、垃圾收集英文单词为 garbage collection,主要是jvm通过检测不再使用的对象,杀掉释放堆内存空间的算法,大概有五种:标记清除、标记整理法、复制法、引用计数法、分代收集法。
标记清除法:
标记-xx算法都会经历两个阶段:标记处理、清除处理
- 标记阶段:jvm会先对对象引用的根集合扫描并会标记被引用的对象,未被标记的即待回收的垃圾对象。
- 清除阶段:标记阶段完成后会再次扫描整个内存空间 将未被标记的对象回收掉。
此算法会产生内存碎片,会扫描内存两次,适用存活对象多的年老代
标记整理法:
标记-整理法与标记清除法较为类似,其在标记清除法上做了优化。
- 标记阶段:jvm会先对对象引用的根集合扫描并会标记被引用的对象,未被标记的即待回收的垃圾对象。
- 清除阶段:标记阶段完成后会再次扫描整个内存空间 将未被标记的对象回收掉,回收掉之后会将对象之间空表压缩,形成一段连续的内存空间。
此算法会扫描内存两次,但是不会产生内存碎片。
复制法:
复制法整体思路是将内存复制到新内存上,并且清除旧内存。
- 首先从根集合扫描标记所有的存活对象并将所有存活对象复制到一块新内存中。
- 清除被复制的旧内存。
此算法扫描内存一次,会复制移动对象,需要新的内存空间,适用存活对象少的新生代。
引用计数法:
引用计数法比较简单
在对象创建时会绑定一个计数器,每当有引用指向该对象时,计数器加1,每当有一个引用被删除时计数器减1,当计数器为0的时候对象死亡进行回收
此算法会直接释放内存,但无法对循环中的引用进行辨别,对巨大对象效率不高,不能完全解决内存泄漏问题。
分代收集:
分代收集即内存划分不同年代,不同年代采用不同的回收算法,
新生代存活较低,频繁创建,适用复制法。
老年代存活较高没有额外空间进行分配适用标记整理法或标记清除法。
永久代gc不会进行内存管理,所以永久代容易出oom异常