是手动管理与自动垃圾回收相结合的?
Rust和Objective-C内存管理据虫虫所知目前有两种语言可以做到这种权衡,一种是Rust,一种是OC。但基本上都不是主流。
rust通过所以权和生命周期方式动态管理内存,保证运行时100%内存安全,需要手动时候用unsafe强制标记。
Objective-C中有mrc和arc两种内存管理机制:MRC(手动计数,MannulReference Counting)和 ARC(自动计数Automatic Reference Counting),分别提供对内存的手动和自动管理,来满足不同的需求。
主流的内存管理和GC垃圾回收各种现代语言都有一套自己的gc处理办法,虽然各有各的招,但是基本上是基于三种基本方法:引用计数、复制收集和标记清除。下面一一介绍下。引用计数这是一种比较方便,有效的gc管理方法。现代绝大多数语言都是基于这种方法,包括不限于python、php、perl、ruby和js都是。
引用计数的基本原理就是对程序中所有对象(比如变量等)有个全局表记录其被引用的次数,当对其引用释放时候计数就减少,直到计数为零,则其会被释放。
引用计数优点实现简单,可即时回收垃圾。缺点是容易形成循环引用,导致永远释放不了,所以现代语言gc主要是基于引用计数,然后引入一些改进算法解决循环引用的问题。
复制收集这种算法是把内存分两块,一块正常使用,当需要gc时候,将第一块上还在使用的对象复制到另一块,然后将第一块内存全部释放,这种方法防止了对象存活检查的遍历,可提高效率。
标记——清除这是出现最早应用最广的gc方法,也可以说gc普遍原理就是这种方法。标记清楚发有两个阶段,标记阶段需要标记回收的对象;回收阶段有gc统一回收。
这种方式问题,效率很差还会产生大量内存碎片。
实际上java的gc综合了2,3方法还做了其他大量的改进,可以说java gc是最先进的gc方法。但是由于底层jvm限制,不能用引用计数的方法,所以还是有一些问题的。
业界普遍看法也是,任何一种GC算法用引用计数和跟踪回收结合的话才是最有效率的,最实用的。