垃圾判断算法
- 引用计数算法
给对象添加一个引用计数器,每当有一个地方引用它,计数器值就加1.当引用失效后,计数器值就减1.任何时刻计数器为0的对象就是不可能再被使用的。但是无法解决对象之间互相循环引用的问题。 - 可达性分析算法
通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明次对象是不可用的。- GC Roots的对象包括
1.虚拟机栈(栈帧中的本地变量表)中引用的对象
2.方法区中类静态属性引用的对象
3.方法区中常量引用的对象
4.本地方法栈中JNI引用的对象
- GC Roots的对象包括
堆和方法区垃圾回收
- 堆垃圾回收
在堆中,尤其是在新生代,常规应用进行一次GC一般可以回收70%-95%的空间,而方法区的GC效率远低于此。 - 方法区垃圾回收
方法区主要回收两部分内容:废弃常量和无用的类。类回收需要满足下面3个条件:
1.该类所有的实例都已被回收,也就是Java堆中不存在该类的任何实例
2.加载该类的ClassLoader已经被回收
3.该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法
垃圾收集算法
- 标记-清除算法(Mark-Sweep)
算法分为标记和清除两个阶段,首先标记出所有需要回收的对象,然后回收所有需要回收的对象。- 缺点
1.效率问题:标记和清除两个过程效率都不高,需要扫描所有对象。堆越大,GC越慢。
2.空间问题:标记清理之后会产生大量不连续的内存碎片,内存碎片太多导致后续使用时无法找到足够连续的内存空间。从而导致提交触发一次垃圾回收。
- 缺点
- 标记-整理算法(Mark-Compact)
标记整理和标记清除算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。比标记清除算法耗费更多的时间进行整理。 - 复制算法(Copying)
将可用内存空间划分为两块,每次只使用其中一块,当半区内存用完了,将仅还存活的对象复制到另一块上面。然后就把原来内存空间清空即可。- 缺点
1.需要将内存缩小为原来的一半
- 缺点
- 分代收集算法
网友评论