GC(垃圾回收):
垃圾回收(Garbage Collection,GC)是一种自动管理内存的技术,用于在程序运行时识别和清理不再被程序引用的内存对象,从而避免内存泄漏和提高内存利用率。
GC 是一种自动内存管理技术,用于检测和释放不再需要的内存对象,以避免内存泄漏。传统的 GC 算法包括引用计数、标记-清除、标记-整理等,而现代的 GC 进化到了分代垃圾回收算法,如新生代和老年代的区分,以提高性能。
下面我将详细介绍几种常见的垃圾回收算法:
引用计数算法:
① 这是最简单的垃圾回收算法之一。它通过维护每个对象的引用计数,在对象被引用时增加计数,在引用失效时减少计数。当某个对象的引用计数为零时,即表示对象不再被使用,可以被回收。
② 缺点是无法解决循环引用的问题,导致循环引用的对象永远无法被回收。
其实就是计数,被用++,取消使用--,为0回收。但是当有A、B两个对象相互引用时,他们计数都不为0,及时其他部分代码都不用这两个对象,他们计数始终不在回收范围内。因此引用计数法无法将他们视为垃圾进行资源回收。
标记-清除算法:
① 这是一种基本的垃圾回收算法,分为两个阶段:标记阶段和清除阶段。
② 标记阶段从根节点(如全局变量、活跃线程中的变量)开始,递归遍历所有可达对象,并标记为“存活”。
③ 清除阶段遍历整个堆,清除未标记为“存活”的对象。
④ 缺点是会产生内存碎片,可能导致内存分配效率下降。
这个方法因为要遍历堆内的未标记对象,即回收对象,回收完之后未整理内存剩余空间,所以内存的堆回收完之后会发现内存出现很多碎片(即空间小进程无法进入的无法利用的空间),这样虽然回收了资源,但也浪费了一定的资源。
标记-整理算法:
① 这是对标记-清除算法的改进,通过在清除阶段将存活对象向一端移动,整理出一块连续的内存空间。
② 清理后的内存空间变得更加整齐,减少了内存碎片化,有利于提高内存分配效率。
此方法就在标记-清除算法上做出了一定的整理优化,使其内存碎片减少。但因为多了整理的步骤,也就让其增加了移动对象的开销,同时移动对象也会对并发程序的性能造成一定的影响,并发程序要等它整理好才能进行使用。最后有个比较难受的缺点是标记-整理算法假设内存是线性连续的,可以将存活对象整理到一端。但对于非连续内存结构(如链表或树形结构),这种整理方式可能并不适用,导致算法效率下降。(即不适用于非连续内存结构)
分带垃圾回收算法:
① 这种算法根据对象存活时间将堆分为不同的代,通常分为新生代和老年代。
② 大部分对象在短时间内就会变得不可达,因此新生代采用较轻量的垃圾回收算法,而老年代则采用更耗时但更全面的算法,提高整体效率。
这种做法即是存在时间短的对象理论上被使用的概率很大,不怎么用考虑回收,采用轻量回收算法,开销小;而存在时间长的老东西理论上更容易不被使用,所以采用更全面的算法进行回收,增大回收效率。
评论(0)