golang程序变量会携带油一组校验数据,用来证明它的整个生命周期是否在运行时完全可知。如果变量通过了这些校验,它就可以在栈上分配。否则就说它逃逸了,必须在堆上分配
 
 
能引起变量逃逸到堆上的典型情况:
 
1.在方法内把局部变量指针返回
    局部变量原本应该在栈中分配,在栈中回收。但是由于返回时被外部引用,因此其生命周期大于栈,则溢出
 
2.发送指针或带有指针的值到channel中
    在编译时,是没有办法知道那个goroutine会在channel上接收数据。所以编译器没法知道变量什么时候才会被释放
 
3.在一个切片傻姑娘存储指针或带指针的值
    一个典型的例子就是[]*string.这会导致切片的内容逃逸,尽管其后面的数组可能是在栈上分配的,但其引用的值一定是在堆上
 
4.slice的背后数组被重新分配了,因为append时可能会超出其容量
    slice初始化的地方在编译时是可以知道的,它最开始在栈上分配,如果切片背后的存储要基于运行时的数据进行扩充,就会在堆上分配
 
5.在interface类型上调用方法
    在interface类型傻姑娘调用方法都是动态调度的——方法的真正实现只能在运行时知道。想象一个io.Reader类型的变量r,调用r.Read(b)会使得r的值和切片b的背后存储都逃逸掉,所以会在堆上分配 

最新文章

  1. JAVA获取客户端IP地址
  2. Linux学习笔记17--Linux系统启动详解
  3. RSA_RSA算法原理(二)
  4. SPOJ ONEZERO(搜索)
  5. 浅谈负载均衡SLB、CLB和综合应用
  6. 获取txt文件指定行内容
  7. mysql 数据库自增id 的总结
  8. C# JackLib系列之Form窗体的ShowWithoutActivation属性及其作用
  9. xadmin学习笔记(一)——编程准备
  10. 基于visual Studio2013解决C语言竞赛题之1016循环打印矩阵
  11. JAVA学习课第五十三届 — IO流程(七)File打靶 & Properties设置
  12. AutoFac使用方法总结
  13. nginx源码编译问题
  14. C#.Net与MATLAB集成
  15. C++\virtual 虚函数、纯虚函数
  16. Netty事件监听和处理(下)
  17. console 命令进行 JS 调试的灵活用法
  18. 查看Linux磁盘空间
  19. 为app录制展示gif
  20. Java-Runoob-高级教程-实例-方法:07. Java 实例 – instanceOf 关键字用法

热门文章

  1. Coursera课程笔记----计算导论与C语言基础----Week 10
  2. matlab读取csv文件并显示
  3. RMQ问题总结,标准RMQ算法的实现
  4. jbpm4.4 发送邮件
  5. 萌新带你开车上p站(终极番外)
  6. 程序员的踩坑经验总结(一):如何把Bug的偶现变必现
  7. Oracle百万数据查询语句
  8. css概述四
  9. 针对移动端开发的响应式 Jekyll 主题
  10. SpringBoot踩坑日记