zoukankan      html  css  js  c++  java
  • go 逃逸分析

    1.前言:

    所谓逃逸分析(Escape analysis)是指由编译器决定内存分配的位置,不需要程序员指定。 函数中申请一个新的对象

    • 如果分配在栈中,则函数执行结束可自动将内存回收;

    • 如果分配在堆中,则函数执行结束可交给GC(垃圾回收)处理;

    有了逃逸分析,返回函数局部变量将变得可能,除此之外,逃逸分析还跟闭包息息相关,了解哪些场景下对象会逃逸至关重要。

    2.逃逸策略:

    每当函数中申请新的对象,编译器会跟据该对象是否被函数外部引用来决定是否逃逸: 1. 如果函数外部没有引用,则优先放到栈中; 2. 如果函数外部存在引用,则必定放到堆中;

    注意,对于函数外部没有引用的对象,也有可能放到堆中,比如内存过大超过栈的存储能力。

    3.逃离场景:

     指针逃逸,栈空间不足逃逸,动态类型逃逸,闭包引用对象逃逸,

    4.逃逸总结:

    • 栈上分配内存比在堆中分配内存有更高的效率

    • 栈上分配的内存不需要GC处理

    • 堆上分配的内存使用完毕会交给GC处理

    • 逃逸分析目的是决定内分配地址是栈还是堆

    • 逃逸分析在编译阶段完成

       

      思考一下这个问题:函数传递指针真的比传值效率高吗? 我们知道传递指针可以减少底层值的拷贝,可以提高效率,但是如果拷贝的数据量小,由于指针传递会产生逃逸,可能会使用堆,也可能会增加GC的负担,所以传递指针不一定是高效的。

  • 相关阅读:
    div里面的内容超出自身高度时,显示省略号
    CSS文本超出2行就隐藏并且显示省略号
    CSS中可以和不可以继承的属性
    return false
    CSS position: absolute、relative定位问题详解
    逆FizzBuzz问题求最短序列
    HTTP协议篇(一):多路复用、数据流
    PHP正则式PCRE
    Docker笔记三:基于LVS DR模式构建WEB服务集群
    架构设计之防止或缓解雪崩效应
  • 原文地址:https://www.cnblogs.com/smallleiit/p/12457165.html
Copyright © 2011-2022 走看看