C#和Lua的内存管理

首先二者都是有自动GC的功能,C#是有CLR在保障下运行的,CLR的功能除了GC还有保证运行安全等。

C#中数据类型分为值类型和引用类型,值类型存储在栈上,在程序运行一段时间后栈上内存会自动释放,无需CLR管理,引用类型存储在堆上,需要CLR管理并且通过GC来减少内存负担。

C#垃圾回收的过程如下:

1.暂停进程中的所有线程,避免线程在CLR检测期间访问堆内存。

2.GC的标记阶段,托管堆会默认所有对象都是垃圾,都是可回收的对象,然后检查每个对象是否有引用,如果没有引用就会纳入对象图中。

3.垃圾回收阶段,遍历对象图,对所有没有标记的对象进行回收,执行清理

4.碎片整理阶段,对剩下所有保有引用的对象进行内存压缩整理,相应的引用地址也会调整,避免内存碎片。

除此之前,C#进行垃圾回收还有另一个辅助进制,就分代GC,分代GC的基本思路是对象越新,生命周期越短,反之越长,通过分代,调整不同代的垃圾回收的频率,从而可以提高GC的效率。

lua中垃圾回收机制是Mark And Sweep算法,对所有对象进行一次是扫描,并标记所有没有被引用的对象,然后清除所有垃圾。

与C#垃圾回收机制相比,没有内存压缩整理和分代GC的机制,容易产生垃圾碎片,需要在使用过程中注意。

发布了58 篇原创文章 · 获赞 7 · 访问量 3725

猜你喜欢

转载自blog.csdn.net/xy_learning/article/details/104714870