go語言不需要手動管理記憶體;go語言內建記憶體管理功能(GC機制),是一種自動記憶體管理的機制。當程式向作業系統申請的記憶體不再需要時,垃圾回收主動將其回收並供其他代碼進行記憶體申請時候復用,或者將其歸還給作業系統,這種針對記憶體級資源的自動回收過程,即為垃圾回收;而負責垃圾回收的程序組件,即為垃圾回收器。
本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。
go語言不需要手動管理記憶體;go語言內建記憶體管理功能(GC機制),開發者不需要關心記憶體的申請與釋放,這樣為使用者帶來極大的便利。
什麼是GC,又有什麼用?
GC,全名為 Garbage Collection,即垃圾回收,是一種自動記憶體管理的機制。
當程式向作業系統申請的記憶體不再需要時,垃圾回收主動將其回收並供其他程式碼進行記憶體申請時候復用,或者將其歸還給作業系統,這種針對記憶體級資源的自動回收過程,即為垃圾回收。而負責垃圾回收的程序組件,即為垃圾回收器。
垃圾回收其實一個完美的 “Simplicity is Complicated” 的範例。一方面,程式設計師受益於 GC,無需操心、也不再需要對記憶體進行手動的申請和釋放操作,GC 在程式運行時自動釋放殘留的記憶體。另一方面,GC 對程式設計師幾乎不可見,只有在程式需要進行特殊最佳化時,透過提供可調控的 API,對 GC 的運作時機、運作開銷進行把控的時候才得以現身。
在運算中,記憶體空間包含兩個重要的區域:堆疊區(Stack) 和堆疊區(Heap);堆疊區一般儲存了函數呼叫的參數、傳回值以及局部變量,不會產生記憶體碎片,由編譯器管理,無需開發者管理;而堆區會產生記憶體碎片,在Go 語言中堆區的物件由記憶體分配器分配並由垃圾收集器回收
通常,垃圾回收器的執行過程被分割為兩個半獨立的元件:
賦值器(Mutator):這個名稱本質上是在指涉用戶態的程式碼。因為對垃圾回收器而言,使用者態的程式碼僅僅只是在修改物件之間的引用關係,也就是在物件圖(物件之間引用關係的一個有向圖)上進行操作。
回收器(Collector):負責執行垃圾回收的程式碼。
GC中的根物件
根物件在垃圾回收的術語中又叫做根集合,它是垃圾回收器在標記過程時最先檢查的對象,包括:
全域變數:程式在編譯期間就能確定的那些存在於程式整個生命週期的變數。
執行堆疊:每個 goroutine 都包含自己的執行棧,這些執行棧上包含堆疊上的變數及指向分配的堆疊記憶體區塊的指標。
暫存器:暫存器的值可能表示一個指針,參與計算的這些指針可能指向某些賦值器分配的堆內存區塊。
#在Go 語言中,垃圾回收器實作的演算法是一個並發的三色標記和掃描收集器
啟動寫入屏障的唯一條件是在短時間內停止程序,即「Stop the World」
1.1 實作原理Go 語言的垃圾收集可以分成清除終止、標記、標記終止和清除四個不同的階段,其中兩個階段會產生Stop The World (STW)
暫停程序,所有的處理器在這時會進入安全點(Safe point)
- 如果當前垃圾收集循環是強制觸發的,我們還需要處理還未被清理的記憶體管理單元
- #將狀態切換至
- _GCmark
、開啟寫入屏障、使用者程式協助(Mutator Assists)並將根物件入隊
恢復執行程序,標記進程和用於協助的使用者程式會開始並發標記記憶體中的對象,寫入屏障會將被覆蓋的指標和新指標都標記成灰色,而所有新建立的物件都會被直接標記成黑色
開始掃描根對象,包括所有Goroutine 的堆疊、全域物件以及不在堆疊中的運行時資料結構,掃描Goroutine 堆疊期間會暫停目前處理器
依序處理灰色佇列中的對象,將物件標記成黑色並將它們指向的物件標記成灰色
使用分散式的終止演算法檢查剩餘的工作,發現標記階段完成後進入標記終止階段
#標記終止階段(STW)
- #暫停程式、將狀態切換至
_GCmarktermination
並關閉輔助標記的使用者程式 - 清理處理器上的執行緒快取
##清理階段
- 將狀態切換至
_GCoff
開始清理階段,初始化清理狀態並關閉寫入屏障
- 恢復使用者程序,所有新建立的物件都會標記成白色
- 後台並發清理所有的記憶體管理單元,當Goroutine 申請新的記憶體管理單元時就會觸發清理
1.2 三色標記法
#三色標記演算法將程式中的物件分成白色、黑色和灰色三類:- 白色物件— 潛在的垃圾,其記憶體可能會被垃圾收集器回收
- 黑色物件— 活躍的對象,包括不存在任何引用外部指標的物件以及從根物件可達的物件
- 灰色物件— 活躍的對象,因為存在指向白色物件的外部指針,垃圾收集器會掃描這些物件的子物件
- 從灰色物件的集合中選擇一個灰色物件並將其標記成黑色
- #將黑色物件指向的所有物件都標記成灰色,保證該物件和被該物件所引用的物件都不會被回收
- 重複上述兩個步驟直到物件圖中不存在灰色物件
程式設計影片! !
以上是go語言需要手動管理記憶體嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Golangisidealforbuildingscalablesystemsduetoitsefficiencyandconcurrency,whilePythonexcelsinquickscriptinganddataanalysisduetoitssimplicityandvastecosystem.Golang'sdesignencouragesclean,readablecodeanditsgoroutinesenableefficientconcurrentoperations,t

Golang在並發性上優於C ,而C 在原始速度上優於Golang。 1)Golang通過goroutine和channel實現高效並發,適合處理大量並發任務。 2)C 通過編譯器優化和標準庫,提供接近硬件的高性能,適合需要極致優化的應用。

選擇Golang的原因包括:1)高並發性能,2)靜態類型系統,3)垃圾回收機制,4)豐富的標準庫和生態系統,這些特性使其成為開發高效、可靠軟件的理想選擇。

Golang適合快速開發和並發場景,C 適用於需要極致性能和低級控制的場景。 1)Golang通過垃圾回收和並發機制提升性能,適合高並發Web服務開發。 2)C 通過手動內存管理和編譯器優化達到極致性能,適用於嵌入式系統開發。

Golang在編譯時間和並發處理上表現更好,而C 在運行速度和內存管理上更具優勢。 1.Golang編譯速度快,適合快速開發。 2.C 運行速度快,適合性能關鍵應用。 3.Golang並發處理簡單高效,適用於並發編程。 4.C 手動內存管理提供更高性能,但增加開發複雜度。

Golang在Web服務和系統編程中的應用主要體現在其簡潔、高效和並發性上。 1)在Web服務中,Golang通過強大的HTTP庫和並發處理能力,支持創建高性能的Web應用和API。 2)在系統編程中,Golang利用接近硬件的特性和對C語言的兼容性,適用於操作系統開發和嵌入式系統。

Golang和C 在性能對比中各有優劣:1.Golang適合高並發和快速開發,但垃圾回收可能影響性能;2.C 提供更高性能和硬件控制,但開發複雜度高。選擇時需綜合考慮項目需求和團隊技能。

Golang适合高性能和并发编程场景,Python适合快速开发和数据处理。1.Golang强调简洁和高效,适用于后端服务和微服务。2.Python以简洁语法和丰富库著称,适用于数据科学和机器学习。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

SublimeText3漢化版
中文版,非常好用

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)