1.判断对象是否已死:
1.引用技术法:给对象添加引用计数器纪录被引用次数
实现简单判定高效、但是无法解决对象循环引用的问题,实际上较少使用
2.可达性分析算法:从gc root对象作为起点向下搜索引用链,与引用链不能相连的对象即被判定为可回收对象。gcroot:本地变量表中引用对象、类静态属性引用对象、方法常量引用对象、native方法引用对象
主流商用语言使用
2.引用
1.强引用:赋值引用,只要存在就不会被回收
2.软引用:有用但非必需,在内存溢出前才被第二次回收,若回收后内存仍不够才会抛出内存溢出异常
3.弱引用:被引用对象只能存活到下次垃圾回收之前,垃圾收集器工作时无论内存是否足够都会回收
4.虚引用:对对象生存时间不会构成影响,仅起到被回收前进行系统通知的作用
3.对象被回收过程:
1.第一次标记:可达性分析认为可回收
2.第二次标记:对象的finalize()方法被调用期间仍未与引用队列上对象建立引用关系
3.被真正回收
4.垃圾回收算法
1.标记清除算法:标记出需要回收对象,然后统一进行回收
标记、清除效率都不高;清除完成后产生大量内存碎片,不好对较大对象进行内存分配
2.复制算法:将内存一分为二,一块用于存储,空间用完后将还存活的对象一次性复杂到另一半,并清除掉前一半所有数据
运行效率高,不用考虑碎片问题。现多用于新生代(回收率高),分为一块大内存与两块小内存,在大的和其中一块小的上面进行存储,回收时将存活对象复制到另一块小内存上。
3.标记整理算法:标记后将所有存活对象移动到一起,然后清除存活对象范围外内存
针对对象存活率较高的老年代,避免了较多的复制次数及额外空间分配
网友评论