首先二者都是有自动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的机制,容易产生垃圾碎片,需要在使用过程中注意。