共计 1959 个字符,预计需要花费 5 分钟才能阅读完成。
引言
又到了金三银四的时候,作为一年一跳的胖虎,又筹备开始跳槽了,这不他明天又销假来面试了。
“跳跳虎”对于明天的面试还是有点筹备的,八股文早从网上下载好了,但就是来得及背完就接到面试邀请了。胖虎心想,“不必怂,人称八股文选手不是白得的,要是能唬住面试官就多要点。”
纷争开始了
面试官:“写过 C /C++ 的同学都晓得,调用驰名的 malloc 和 new 函数能够在堆上调配一块内存,这块内存的应用和销毁的责任都在程序员。一不小心,就会产生内存泄露。那你说下 Golang 是怎么解决这个问题的”
胖虎:“Golang 通过逃逸剖析,对内存治理进行的优化和简化,它能够决定一个变量是调配到堆还栈上。”
什么是 golang 的逃逸剖析
面试官:“那你说下什么是逃逸剖析吧”
胖虎想:“这道题我会啊,筹备好了吗,我要开始装 X 了。”
Golang 的逃逸剖析,是指编译器依据代码的特色和生命周期,主动的把变量调配到堆或者是栈下面。
通过优化了内存管理机制,解放宽广程序员的双手。让程序员更关注于业务。
留神:Go 在编译阶段确立逃逸,并不是在运行时。
什么是栈与堆
面试官:“那你说下什么是栈和堆”
胖虎心:“这个也简略啊”
栈(stack)是零碎主动调配空间的,例如咱们定义一个 char a;零碎会主动在栈上为其开拓空间。而堆(heap)则是程序员依据须要本人申请的空间,例如 malloc(10);开拓十个字节的空间。
先看下内存调配图
栈在内存中是从高地址向下调配的,并且间断的,遵循先进后出准则。零碎在调配的时候曾经确定好了栈的大小空间。栈下面的空间是主动回收的,所以栈下面的数据的生命周期在函数完结后,就被开释掉了。
堆调配是从低地址向高地址调配的,每次调配的内存大小可能不统一,导致了空间是不间断的,这也产生内存碎片的起因。因为是程序调配,所以效率绝对慢些。而堆上的数据只有程序员不开释空间,就始终能够拜访到,不过毛病是一旦遗记开释会造成内存泄露。
逃逸剖析有什么益处
面试官:“那你说下逃逸剖析有什么益处吗”
胖虎:“你是十万个为什么吗?”,但胖虎还是掏出了本人的看家本领。
就像刚开始提到的,Go 语言中内存的调配不是有程序员本人决定的,而是通过编译阶段确定的调配到何处。这样有什么益处呢?没错机智的你,可能曾经猜到了就是为了优化程序,榨干机器性能,让内存可能失去更高的应用效率。
通过逃逸剖析,那些不须要调配到堆上的变量间接调配到栈上,堆上的变量少了岂但同时缩小 GC 的压力,还加重了内存调配的开销。
常见的逃逸景象
面试官点点头,称誉的眼光看着胖虎说:“那你在说说,常见的逃逸景象有哪些吧”
胖虎心田解体了:“就我一个人始终在这说,都要渴死了,倒是给我来杯水啊,能不能让我喘口气”。但一想 JD 下面给的薪资还是挺引诱人的,那就在答复一题。
func(函数类型)数据类型
package main
import "fmt"
func main() {name := test()
fmt.Println(name())
}
func test() func() string {return func() string {return "后端时光"}
}
执行命令
go build -gcflags="-m -l" eee.go
-m:示意内存剖析 -l:示意避免内联优化
后果如下,第 11 行变量 name 逃逸到了堆上
interface{} 数据类型
package main
import "fmt"
func main() {
name := "Golang"
fmt.Println(name)
}
同理执行逃逸剖析,后果如下,name 变量也逃逸到堆上了
起因是 go/src/fmt/print.go 文件中 Println 传参数类型 interface{}, 编译器对传入的变量类型未知,所有对立解决调配到了堆下面去了。
指针类型
package main
import "fmt"
func main() {name := point()
fmt.Println(*name)
}
func point() *string {
name := "指针"
return &name
}
后果如下,第 11 行变量 name 逃逸到了堆上
还有其余状况呈现变量逃逸吗?
“额,这……”,胖虎心想:工夫太匆忙了,八股文我就背了这么点啊,其余的还么来得及看呢,要是昨天少玩一把游戏就好了。这可怎么办?
看着胖虎憋的满脸通红,面试官笑呵呵的说,“没事的,工夫也不早了,明天先到这吧,你还有什么要问我的吗?”
胖虎:“还有哪些会呈现变量逃逸啊”
面试官:“channel 或者栈空间有余逃逸, 也会导致逃逸的状况,还有其余问题吗?”
胖虎:“你们双休吗?”
面试官:“是的,咱们双休,不过是一个月劳动两天”
胖虎:“啊。”
你们说胖虎还要持续面试上来吗?这样的公司能入职吗?
文章首发于公众号
微信搜寻公众号 [后端时光] 一起学习成长 !
你必须十分致力,能力看起来毫不费力!