網站首頁 編程語言 正文
前言
我們都知道go語言中內存管理工作都是由Go在底層完成的,這樣我們可以不用過多的關注底層的內存問題,有更多的精力去關注業務邏輯, 但掌握內存的管理,理解內存分配機制,可以讓你寫出更高效的代碼,本文主要總結一下 Golang內存逃逸分析,需要的朋友可以參考以下內容,希望對大家有幫助。
什么是內存逃逸
在了解什么是內存逃逸之前,我們先來了解兩個概念,棧內存和堆內存。
堆內存(Heap):一般來講是人為手動進行管理,手動申請、分配、釋放。一般硬件內存有多大堆內存就有多大。適合不可預知大小的內存分配,分配速度較慢,而且會形成內存碎片。
棧內存(Stack):是一種擁有特殊規則的線性表數據結構。由編譯器進行管理,自動申請、分配、釋放。大小一般是固定的。
通過上面我們可以看出堆分配昂貴,棧分配廉價,在go中所有內存優先棧分配,那么,Go 編譯器怎么知道某個變量需要分配在棧上,還是堆上呢?
逃逸分析是用于堆和棧分配進行選擇,通過在編譯時期做gc,編譯器追蹤變量在代碼塊的作用域,判斷變量在整個運行周期是否在運行時完全可知,通過校驗可以在棧上分配;否則逃逸到堆上;逃逸分析由編譯器完成,作用于編譯階段。
查看對象是否發生逃逸
Go 語言工具鏈提供了查看對象是否逃逸的方法,我們在執行 go build 時,配合使用參數 -gcflags 開啟編譯器支持的額外功能,例如:
go build -gcflags '-m -l' main.go
-m
會打印出逃逸分析的優化策略,實際上最多總共可以用 4 個 -m
,但是信息量較大,一般用 1 個就可以了
-l
會禁用函數內聯,在這里禁用掉 inline
能更好的觀察逃逸情況,減少干擾。
除了使用編譯參數之外,我們還可以使用一種更底層的,更硬核,也更準確的方式來判斷一個對象是否逃逸,那就是: 通過反編譯命令查看
go tool compile -S main.go
示例:
func main() { sum(1, 2) } func sum(a, b int) *int { res := a + b return &res }
結果如下,第7行變量 res 逃逸到了堆上
內存逃逸分析的意義
通過逃逸分析,可以盡量把那些不需要分配到堆上的變量直接分配到棧上,堆上的變量少了,會減輕分配堆內存的開銷,同時也會減少GC的壓力,提高程序的運行速度。
怎么避免內存逃逸
盡量減少外部指針引用,必要的時候可以使用值傳遞;
對于自己定義的數據大小,有一個基本的預判,盡量不要出現棧空間溢出的情況;
Golang中的接口類型的方法調用是動態調度,如果對于性能要求比較高且訪問頻次比較高的函數調用,應該盡量避免使用接口類型;
盡量不要寫閉包函數,可讀性差且發生逃逸。
小結
本文主要介紹了 Go 語言逃逸分析,它可以幫助我們合理分配對象的內存空間。
我們知道分配到堆內存空間的對象,會導致 Go 執行垃圾回收,而垃圾回收會占用系統資源,降低應用程序本身可使用的系統資源。
所以,我們在實際項目開發中,可以借助 Go 工具鏈分析對象是否會發生逃逸,盡量避免一些不必要的對象逃逸。
原文鏈接:https://juejin.cn/post/7140864963974791175
相關推薦
- 2022-11-21 Python?tabulate結合loguru打印出美觀方便的日志記錄_python
- 2022-05-11 C#實現搶紅包算法的示例代碼_C#教程
- 2024-04-02 Maven項目引用本地jar涉及scope配置
- 2022-06-02 C#?操作Windows注冊表的實現方法_C#教程
- 2022-12-15 Android?NotificationListenerService?通知服務原理解析_Andro
- 2022-04-04 react解包并配置Less解包config文件目錄
- 2022-03-16 .Net?6中WebApplicationBuilder介紹和用法_自學過程
- 2022-04-23 小程序云函數解析encryptedData
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支