-
1 # 西街三水哥
-
2 # 蟲蟲安全
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演算法用引用計數和跟蹤回收結合的話才是最有效率的,最實用的。
回覆列表
個人理解:
垃圾回收機制,是長執行程式的時候,程式賦予的一種機制!
手動回收是常駐記憶體!除非程式結束否則不銷燬記憶體!
常駐記憶體多的話會導致記憶體洩露!