引用计数
每个对象有一个引用计数,当对象被多引用一次,引用计数加一,当引用被释放,引用计数减一,当引用计数为零,则自动释放内存。
优点是:简单高效
缺点是:无法解决循环引用的问题
标记清除算法
从内存的根节点遍历内存块,把没有引用的内存块标记出来,并进行清除
优点:可以并行执行,通过增加写屏障,可以让标记-清除在不需要STW的时候进行
缺点:会损耗一定的计算,会出现大量内存碎片
复制回收算法
把堆分成大小相同的两个区域,当需要GC时,标记没有引用的内存,把标记为有引用的内存,拷贝到另一个区域,进行碎片整理,并清空原有的区域
优点:简单,碎片整理算法高效,适合大量内存被回收的场景,这样复制的内存就会少
缺点:需要中断程序,需要一块大小相同的内存块,比较浪费内存
标记压缩算法
对内存块进行标记-清除操作,最后再进行内存整理
优点:减少内存碎片,不浪费内存,适合大量内存不被回收的场景,这样整理过程中需要移动的内存块就少
分代算法
新的内存块是新生代内存
通过复制回收算法,对新生代内存进行回收
回收后,新生代还存活的对象进行观察,在进行了多次回收后,依然存活的对象,会被移动到老年代
通过标记压缩算法对老年代内存进行内存回收
网友评论