Golang語言中的逃逸分析詳解-創(chuàng)新互聯(lián)

1.什么是逃逸分析

說到逃逸分析我們先聊一聊C/C++中的malloc和new,他們都可以從堆上分配到一塊內(nèi)存,該內(nèi)存的銷毀都是需要程序員來銷毀,一不小心就可能發(fā)生內(nèi)存泄漏,這是很危險的。首先我們來看一下他們有什么區(qū)別:
(1)malloc:是memory(內(nèi)存)和allocate(分配)縮寫結(jié)合:

成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的棗陽網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
  • 從堆上分配內(nèi)存,堆是操作系統(tǒng)的術(shù)語;
  • 與new不一樣,malloc僅僅分配內(nèi)存,free僅僅是回收內(nèi)存(與malloc對應(yīng))

(2)new從自由存儲區(qū)上分配內(nèi)存(自由存儲區(qū)是C/C++基于new操作符的一個抽象概念,凡是通過new操作符進(jìn)行內(nèi)存申請該內(nèi)存為自由存儲區(qū));

  • new能在堆上動態(tài)分配內(nèi)存,也可以是靜態(tài)存儲區(qū),取決于operator new 在哪里new
  • 使用new先調(diào)用malloc分配內(nèi)存空間,再調(diào)用對象的構(gòu)造函數(shù);delete會調(diào)用對象的析構(gòu)函數(shù),再調(diào)用free回收內(nèi)存。
    在Go語言中程序員基本上不需要再擔(dān)心內(nèi)存泄漏。雖然Go也有內(nèi)建函數(shù)new,但是調(diào)用new函數(shù)得到的內(nèi)存不一定在堆上,還有可能在棧上。這是因為go語言的堆和棧被模糊化了,這一切都是有Go編譯器在后臺完成的。(具體C/C++堆棧與Go有何不同可參考我的另一篇博客:Go與C/C++中的堆和棧比較
    聊了這么多,那么逃逸分析是如何定義的呢?
    在編譯原理中,分析指針動態(tài)范圍的方法被稱之為逃逸分析。通俗來講,當(dāng)一個對象的指針被多個方法或線程引用時,則稱這個指針發(fā)生了逃逸。逃逸分析決定一個變量是分配在堆上還是分配在棧上。如果編譯器發(fā)現(xiàn)這塊內(nèi)存在退出函數(shù)后就沒有使用了,那就分配到棧上
2.逃逸分析的作用
  • 按需分配,編譯器經(jīng)過逃逸分析后發(fā)現(xiàn)函數(shù)退出后這塊內(nèi)存沒有再用,那么分配到棧上。反之分配到堆上,我們都知道棧上的內(nèi)存分配比堆上快很多。有了逃逸分析,在無形中縮短了程序運行時間
  • 減小系統(tǒng)開銷,堆不像??梢宰詣忧謇?,如果變量都分配到堆上,會頻繁的進(jìn)行垃圾回收,而垃圾回收會占用比較大的系統(tǒng)開銷。
  • 減少內(nèi)存碎片生成,堆內(nèi)存分配比較慢,而且會形成內(nèi)存碎片,棧內(nèi)存會自動釋放不會形成內(nèi)存碎片;
  • 減少垃圾回收的壓力,通過逃逸分析之后,可盡量把不需要分配到堆上的內(nèi)存分配到棧上,堆上的變量少了,會減輕堆內(nèi)存的開銷,同事也會減少垃圾回收(Garbage Collection,GC)的壓力,提高程序的運行速度。
3.逃逸分析是怎樣形成的

逃逸分析基本原則:編譯器分析代碼的特征和代碼的聲明周期,如果一個函數(shù)返回堆一個變量的引用,那么這個變量就會發(fā)生逃逸。 簡單的來說編譯器會根據(jù)變量時候被外部引用來決定是否逃逸:

  • 如果變量在函數(shù)外部沒有被引用,則優(yōu)先分配到棧上
  • 如果變量在函數(shù)外部存在引用,則必定分配在堆上
    針對第一條,放在堆上的情形:定義一個很大的數(shù)組,需要申請的內(nèi)存過大,超過了棧的存儲能力。
4.如何確定是否發(fā)生了逃逸

這個問題我在其他文章有詳細(xì)說明,參考地址:Golang語言中如何確定是否發(fā)生逃逸

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

標(biāo)題名稱:Golang語言中的逃逸分析詳解-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://muchs.cn/article16/csjhdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、響應(yīng)式網(wǎng)站、網(wǎng)站制作、企業(yè)網(wǎng)站制作、定制網(wǎng)站外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)