GC垃圾回收

java中  GC的对象是堆空间和永久区

老牌垃圾回收算法:通过引用计数来回收垃圾,只要有一个人使用就再这个对象上加1,有人释放了这个对象就减1,如果引用计数为0,则
对象A就会被回收
引用计数问题:(没有被java采用)
引用和去引用都伴随着加法和减法,影响性能
很难处理循环引用,即A引用B,B引用C,C引用A,闭环。


标记—清除:

是现代垃圾回收算法的思想基础,将垃圾回收分为2个阶段,如题;在标记阶段首先通过根节点,标记所有从根节点开始的可达对象,因此未被标记的对象就是未被引用的垃圾对象,然后再清除阶段,清除所有的未被标记的对象。


标记—压缩:

适合用于存活对象较多的场合,如老年代,首先从跟节点开始,对所有的可达对象做一次标记,但之后,并不简单的清除未标记的对象,而是将所有的存活的对象压缩到内存的一端,之后,清理边界外所有的空间。


复制算法:
不适用于存活对象较多的场合,如老年代
将原有的内存空间分为2块,每次只使用其中的1块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换2个内存的角色,完成垃圾回收。

缺点:空间浪费





分代思想:依据对象的存活周期进行分类,短命对象归为新生代,长命对象归位老年代。
根据特点,选取合适收集算法:
少量对象存活,适合复制算法
大量对象存活,适合标记清理或者标记压缩。



猜你喜欢

转载自blog.csdn.net/shahuhubao/article/details/79965989