go 引用另外一个文件中的struct_记一个golang“内存泄漏”的问题

本文探讨了一个Go语言程序中由于编译器的逃逸分析导致的内存泄漏问题。当在函数中创建并引用一个结构体,特别是该结构体包含指针时,即使该结构体在函数结束后理论上应被垃圾收集,但由于优化策略,内存可能不会被正确释放。通过分析和实验,确认这是一个Go语言的bug,且介绍了如何通过修改代码以确保内存被正常回收。
摘要由CSDN通过智能技术生成

2019-3-26更新:

这个bug已经在go1.12修复了

=======

之前从一个朋友手上拿到一份代码,运行起来会不停吃内存,但是从代码本身看,好像又不应该:

package main

type Node struct {
    
	next *Node
	payload [64]byte
}

func main() {
    
	curr := new(Node)
	for {
    
		curr.next = new(Node)
		curr = curr.next
	}
}

类似一个单链表,每次申请一个节点接在尾部,然后curr指向最后一个节点,按理说在for循环中,curr引用的只有最后一个节点,而最后一个节点的next是nil,不引用任何其他数据,所以前面的节点应该都会被gc释放才对,但测试结果是内存不停涨。虽然没仔细分析过源码,但还是基本了解go的gc做法的,不可能是由于不及时导致

之后打印了相关内存地址才反应过来,是第一个Node的new分配在栈上了,go编译器会对代码做逃逸分析,如果在函数中new分配一个小对象,而且这个小对象不会逃逸出去,则可以直接将其分配到栈上,所以上面代码在优化后相当于:

func main() {
    
	var n Node
	curr := &n
	for {
    
		curr.next = new(Node)
		c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值