golang垃圾回收gc

垃圾回收概念

对不再使用的内存资源进行自动回收的行为。

出现的原因

内存管理是程序员开发应用的难题,传统的编程语言(c/c++),程序员须小心进行管理操作,控制内存的申请及释放。稍有不慎会造成内存泄漏。

以往常用办法

1.内存泄漏检测工具。原理是静态代码扫描,通过扫描程序检测可能出现内存泄漏的代码段,然而检测工具难免有疏漏和不足,只能嗯起到辅助作用。

2.职能指针。c++中引入的自动内存管理方法。通过拥有自动内存管理功能的指针对象来引用对象,让程序员不用太关注内存的释放,而达到内存自动释放的目的。需要一定的学习成本,并且一旦忘记使用有无法避免造成内存泄漏。

后来开发的语言(java/python,php)引入了语言层面的自动内存管理,即语言的使用者只需要关注内存的申请而不必关心内存的释放。内存释放由虚拟机或者运行时(runtime)自动管理。

常见的垃圾回收方法

引用计数

最简单的垃圾回收算法。引用计数是渐进式的,能够将内存管理的开销分布到整个程序之中。

每个对象维护一个引用计数,当该引用对象的对象被销毁或者更新时被引用的引用技术自动减1,当被引用对象被创建或者被赋值给其他对象时引用计数自动加1.当引用计数为0时立即回收该对象。

新分配的单元计数值置为1(注意,不是0, 因为申请一般都是ptr = new object)。

这种算法实现简单,并且内存回收很及时。在内存比较紧张或者实时性高的系统中使用广泛。

存在的问题:

1.频繁更新引用计数降低了性能。一种简单的解决方法是编译器将相邻的引用计数更新操作合并到一次更新bayou一种是针对频繁发送的临时变量引用不进行计数,而是在引用达到0时通过扫描堆栈确认是否还有临时对象引用从而决定释放。

2.循环引用问题。当对象间发生循环引用时引用链中的对象都无法得到释放。如果递归处理会导致系统崩溃。

标记清除

分代收集

golang的gc

何时触发gc

mallocgc (自动回收),在堆上分配内存大于32kb对象的时候进行检测此时是否满足垃圾回收条件,如果满足则进行垃圾回收。runtime.gc()----主动回收

gc触发条件

垃圾回收主要流程

猜你喜欢

转载自blog.csdn.net/u010918487/article/details/81534824