垃圾回收
1 如何判断一个对象是否为垃圾
① 引用计数法
对每个对象保存一个整型的引用计数器属性。用于记录对象被引用的情况。当这个对象被引用时加一,引用失效时减一。任何引用计数器为0的对象实例可以被当作垃圾收集。
特点 :简单,无法解决循环引用。
① 可达性分析算法
可达性分析算法是以根对象集合(GCRoots就是一组必须活跃的引用)为起始点,按照从上倒下的搜索被根对象集合所连接的目标对象是否可达。被走过的路径叫做引用链,如果目标对象没有任何引用链相连,则是不可达的,就意味着该对象己经死亡,可以标记为垃圾对象
2 可达性算法中,哪些对象可作为GC Roots对象?
虚拟栈中引用的对象,
方法区静态成员应用的对象,
方法区常量引用的对象,
本地方法栈引用的对象
3 Java中都有那些引用类型
① 强引用
只要强引用存在,垃圾回收器将永远不会回收被引用的对象(Java中默认的引用方法为强引用)
② 软引用
在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收软引用对象后内存还不够,就会抛出内存溢出异常
③ 弱引用
无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收
④ 虚引用
虚引用的对象随时都会被回收
4、常见的垃圾回收算法都有哪些?(高频)
① 标记清除
执行过程:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
优点:速度比较快
缺点:会产生内存碎片,碎片过多,仍会使得连续空间少
② 标记整理
执行过程:首先标记出所有需要回收的对象,在标记完成后统一进行整理,整理是指存活对象向一端移动来减少内存碎片,相对效率较低
优点:无内存碎片
缺点:效率较低
③ 复制算法
执行过程:开辟两份大小相等空间,一份空间始终空着,垃圾回收时,将存活对象拷贝进入空闲空间;
优点:无内存碎片
缺点:占用空间多
注意:如果有很多对象的存活率较高,这时我们采用复制算法,那么效率就比较低;
④ 分代回收
概述:根据对象存活周期的不同,将对象划分为几块,比如Java的堆内存,分为新生代和老年代,然后根据各个年代的特点采用最合适的算法;
新生代对象的存活的时间都比较短,因此使用的是【复制算法】;而老年代对象存活的时间比较长那么采用的就是【标记清除】或者【标记整理】;
1197

被折叠的 条评论
为什么被折叠?



