垃圾回收处理机制的算法整理
垃圾回收处理机制介绍:
程序的运行必然需要申请内存资源,无效的对象资源如果不及时处理就会一直占用内存资源,最终导致内存溢出,垃圾回收机制就是在自动的处理内存中无效的垃圾,释放资源,他是依据算法进行回收那么下面我就给大家讲一下算法
1.计数算法
他可以说是最老的算法之一 他的原理 : 每一个对象都有一个对象所对应的计数器,假设有一个对象a,那么有任何一个别的对象在引用对象a的时候对象a所对应的计数器就会+1,当他们的与引用失败或不再引用的时候计数器就会-1,如果对象a所对应的计数器为0的时候就说明对象a没有引用了就可以回收了
优点:
1.实时性比较高,无需等到内存不够的时候才开始回收,
2.区域性,更新对象计数器时候只是影响到该对象,不会全对象扫描,不会影响其他对象
缺点:
1.每次对象被引用时候都需要去跟新计数器,有一点时间开销,
2.浪费cpu资源即使内存够用,仍然在被引用时候进行计数器的统计,
3. (最大的缺点)无法解决循环引用的问题
2.标记算法
原理:分为两个阶段1,标记,从root根节点开始标记被根节点引用对象,2,清除:未被标记的引用对象就 是垃圾对象,可以被清理,标记算法解决了计数算法最大的缺点循环引用
优点:
优点:解决了计数算法中的循环引用问题
缺点:
1.效率较低,标记和清除两个动作都需要扫描全部对象,
2.并且在清理内存时候需要停止应用程序,对于交互性比较高的应用体验是非常差的,
3.通过标记清除的内存碎片化严重因为被回收的对象可能存在内存的各个角落所以是不连贯的,
3.压缩标记算法
压缩标记算法它其实就是为了解决标记算法碎片化严重的问题
他就是在标记算法的基础上做了优化改进的算法,他和标记算法的原理一样,只不过在清理阶段不再是简单的清理未标记的对象 而是将存活的对象压缩到内存的一端,压缩到一块 然后在清理未标记的对象从而解决了碎片化的问题
4.复制算法
原理:它的核心就是将原有的内存空间一分为二,每次只用其中一块,在垃圾回收时候将正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,清空后在交换两个内存的角色完成垃圾回收,
举例:内存分为两块第一块使用的命名为1,第二块没有使用的命名为2, 在进行垃圾回收时候将内存1的正在使用的对象全部复制到内存2,然后将内存1全部清空,清空后他们交换内存的角色在以此延续
说了这么多那么垃圾回收机制到底该用哪种算法呢?
5.分代算法
每一种算法都有优缺点,谁也不能代替谁,所以根据垃圾回收机制的特点进行选择,才是明智的选择,分代算法其实就是这样,他是根据回收对象的特点进行选择,在jvm中 年轻代适合使用复制算法,老年代适合使用标记清除或者标记压缩算法,这就叫分代算法