zoukankan      html  css  js  c++  java
  • 简单聊聊内存逃逸?

    golang程序变量会携带有一组校验数据,用来证明它的整个生命周期是否在运行时完全 可知。如果变量通过了这些校验,它就可以在栈上分配。否则就说它 逃逸 了,必须在 堆上分配。
    能引起变量逃逸到堆上的典型情况:
    •   在方法内把局部变量指针返回 局部变量原本应该在栈中分配,在栈中回收。但是由 于返回时被外部引用,因此其生命周期大于栈,则溢出。

    •   发送指针或带有指针的值到 channel 中。 在编译时,是没有办法知道哪
      个 会在 上接收数据。所以编译器没法知道变量什么时候才会 被释放。

    •   在一个切片上存储指针或带指针的值。 一个典型的例子就是 。这会导致 切片的内容逃逸。尽管其后面的数组可能是在栈上分配的,但其引用的值一定是在 堆上。

    •   slice 的背后数组被重新分配了,因为 append 时可能会超出其容量( cap )。 slice 初始化的地方在编译时是可以知道的,它最开始会在栈上分配。如果切片背后的存 储要基于运行时的数据进行扩充,就会在堆上分配。

    •   在 interface 类型上调用方法。 在 interface 类型上调用方法都是动态调度的 —— 方法的真正实现只能在运行时知道。想像一个 io.Reader 类型的变量 r , 调用 r.Read(b) 会使得 r 的值和切片b 的背后存储都逃逸掉,所以会在堆上分配。

    https://mp.weixin.qq.com/s?__biz=Mzg5NDY2MDk4Mw==&mid=2247486360&idx=1&sn=62add4f7def9638a0a1c83c1672992c5&source=41#wechat_redirect

  • 相关阅读:
    反转链表 16
    CodeForces 701A Cards
    hdu 1087 Super Jumping! Jumping! Jumping!(动态规划)
    hdu 1241 Oil Deposits(水一发,自我的DFS)
    CodeForces 703B(容斥定理)
    poj 1067 取石子游戏(威佐夫博奕(Wythoff Game))
    ACM 马拦过河卒(动态规划)
    hdu 1005 Number Sequence
    51nod 1170 1770 数数字(数学技巧)
    hdu 2160 母猪的故事(睡前随机水一发)(斐波那契数列)
  • 原文地址:https://www.cnblogs.com/brady-wang/p/15265417.html
Copyright © 2011-2022 走看看