美文网首页
golang的变量内存分配

golang的变量内存分配

作者: ywhu | 来源:发表于2018-03-28 14:55 被阅读0次

逃逸分析

逃逸分析不是直接的优化手段,而是一个代码分析,通过动态分析对象的作用域,为其它优化手段如栈上分配、标量替换和同步消除等提供依据,发生逃逸行为的情况有两种:方法逃逸和线程逃逸。

  • 方法逃逸:当一个对象在方法中定义之后,作为参数传递到其它方法中;
  • 线程逃逸:如类变量或实例变量,可能被其它线程访问到;

内存分配

Go是通过在编译器里做逃逸分析(escape analysis)来决定一个对象放栈上还是放堆上:不逃逸的对象放栈上,可能逃逸的放堆上

开启go编译时的逃逸分析日志

开启逃逸分析日志很简单,只要在编译的时候加上-gcflags '-m',但是我们为了不让编译时自动内连函数,一般会加-l参数,最终为-gcflags '-m -l'

Example:

package main

import (
    "fmt"
)

func main() {
    s := "hello"
    fmt.Println(s)
}
go run -gcflags '-m -l' escape.go
Output:

# command-line-arguments
escape_analysis/main.go:9: s escapes to heap
escape_analysis/main.go:9: main ... argument does not escape
hello

什么时候逃逸,什么时候不逃逸

Example2:

package main

type S struct{}

func main() {
    var x S
    _ = *ref(x)
}

func ref(z S) *S {
    return &z
}
Output:

# command-line-arguments
escape_analysis/main.go:11: &z escapes to heap
escape_analysis/main.go:10: moved to heap: z

这里的z是逃逸了,原因很简单,go都是值传递,ref函数copy了x的值,传给z,返回z的指针,然后在函数外被引用,说明z这个变量在函数內声明,可能会被函数外的其他程序访问。所以z逃逸了,分配在堆上

相关文章

  • Golang 1.14中内存分配、清扫和内存回收

    golang内存分配 Golang的内存分配是由golang runtime完成,其内存分配方案借鉴自tcmall...

  • golang的变量内存分配

    逃逸分析 逃逸分析不是直接的优化手段,而是一个代码分析,通过动态分析对象的作用域,为其它优化手段如栈上分配、标量替...

  • golang的内存泄漏分析

    golang的内存泄漏分析 什么是内存泄漏 内存泄漏说白了就是分配的内存(或者变量)不再使用,但是并没有被gc回收...

  • C语言内存分配(重)

    内存分配的类型: 静态内存分配: 全局变量、静态全局变量、静态局部变量; 静态内存分配是在程序编译时分配的内存空间...

  • golang内存分配

    一、分配对象(源码) 二、关于内存的管理 其实heap有两种内存状态free:空闲可用 busy:已被使用;当...

  • Golang 内存分配

    基础概念 Go语言内置运行时(就是runtime),不同于传统的内存分配方式,go为自主管理,最开始是基于 tcm...

  • Java学习-3-基本数据类型

    变量申请内存来存储值。当创建变量的时候,需要在内存申请空间。内存管理系统根据变量的类型为变量分配存储空间,分配的空...

  • go-内存机制(3)

    go的内存分配 Golang有一套自己的内存管理机制,自主的去完成内存分配、垃圾回收、内存管理等过程,从而避免频繁...

  • node var

    node中var才会分配内存,单独变量接收不会新分配内存

  • 图解Golang的内存分配

    一般程序的内存分配 在讲Golang的内存分配之前,让我们先来看看一般程序的内存分布情况: 以上是程序内存的逻辑分...

网友评论

      本文标题:golang的变量内存分配

      本文链接:https://www.haomeiwen.com/subject/ytnycftx.html