GC垃圾回收
GC回收有2种算法:一种是引用计数器法,另一种是可达性分析算法
java中 GC的对象是堆空间和永久区
1.引用计数器法
老牌垃圾回收算法:通过引用计数来回收垃圾,只要有一个人使用就再这个对象上加1,有人释放了这个对象就减1,如果引用计数为0,则
对象A就会被回收
引用计数问题:(没有被java采用)
引用和去引用都伴随着加法和减法,影响性能
很难处理循环引用,即A引用B,B引用C,C引用A,闭环。
2.可达性分析算法
可达性分析算法通过定义GCRoot,然后根据GCRoot一直找下去,可达的就不是垃圾,不可达的就是垃圾
GCROOT包括:
虚拟机栈中的局部变量表;方法区类属性所引用的对象;方法区常量属性所引用的对象;本地方法
可达性分析算法包含的三种垃圾回收方法:
标记—清除:
是现代垃圾回收算法的思想基础,将垃圾回收分为2个阶段,如题;在标记阶段首先通过根节点,标记所有从根节点开始的可达对象,因此未被标记的对象就是未被引用的垃圾对象,然后再清除阶段,清除所有的未被标记的对象。
标记—压缩:
适合用于存活对象较多的场合,如老年代,首先从跟节点开始,对所有的可达对象做一次标记,但之后,并不简单的清除未标记的对象,而是将所有的存活的对象压缩到内存的一端,之后,清理边界外所有的空间。
复制算法:
不适用于存活对象较多的场合,如老年代
将原有的内存空间分为2块,每次只使用其中的1块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换2个内存的角色,完成垃圾回收。
缺点:空间浪费
分代思想:依据对象的存活周期进行分类,短命对象归为新生代,长命对象归位老年代。
根据特点,选取合适收集算法:
少量对象存活,适合复制算法,新生代对象朝生夕死,适合复制算法
大量对象存活,适合标记清理或者标记压缩。老年代对象存活比较长,适合标记整理算法