啥叫内存逃逸?
简单的讲就是本该分配到栈上的变量,跑到了堆上,这就导致了内存逃逸
常见的go、java语言都会有内存逃逸的情况,我们常用的函数以及局部变量通常是分配到栈上的,但是一旦出现内存逃逸,变量就会分配到堆上。
那么分配到堆上会有什么后果?
我们知道,栈是高地址到低地址,栈上的变量,函数结束后变量会跟着回收掉,不会有额外性能的开销。
如果变量从栈逃逸到堆,会怎样?
堆上的变量,如果要回收掉,需要进行gc,那么gc一定会带来额外的性能开销,大家知道,编程语言不断优化gc算法,主要目的都是为了减少gc带来的额外性能开销,高级语言基本都是有gc的,除了rust一类的;所以变量一旦逃逸会导致性能开销变大,这当然并不是什么好事,但是一般来讲,如果不是什么性能敏感的地方,这点性能完全可以忽略。
所以了解内存逃逸,对我们追踪变量实际分配到那个地方了是有很大帮助的,甚至如果遇到性能调优的地方,这里也是一个优化点。