go 手动释放内存_golang 内存管理

本文探讨了Go语言内存管理的细节,包括如何手动释放内存。内容涵盖虚拟内存与物理内存的概念,简单的内存分配方法如线性分配和链表分配器,以及Go语言借鉴TCMalloc实现的内存分配策略。Go将内存分为微对象、小对象和大对象,使用mcache、mcentral和mheap等数据结构进行高效管理。
摘要由CSDN通过智能技术生成

1、虚拟内存、物理内存和页表

b3b69684b88fe33f5fbf403992169739.png

每一个进程都有自身的虚拟内存,通过页表将虚拟内存映射到物理内存。虚拟内存空间被内核划分为了等长的部分,这部分称之为,物理内存也被划分为了同样大小的页,通常称之为页帧

fa6281983b5c2cd335bf06ecf7227354.png

不同的虚拟内存空间中的页可以映射到同一个物理内存页,内核可以决定哪些内存区域在进程间共享,哪些不共享;不是所有的虚拟空间页都会映射到物理内存,虚拟空间远大于物理内存。

用来将虚拟地址空间映射到物理地址空间的数据结构称为页表,实际中为了提高性能、节省空间往往采用多级页表,linux 采用了四级页表。

虚拟内存中的栈主要保存函数的参数、返回值和局部变量等,由编译器管理;用户主动申请的内存主要保存在堆中,由用户和编译器共同管理,并且堆中内存需要垃圾回收机制,java、go、python等语言本身会负责垃圾回收,c、c++等需要用户自己负责内存的申请和释放。

2、简单的内存分配方法

  1. 线性分配
    维护一个指向内存的指针,移动指针实现内存的分配

46e3b95553277378b9e6736f368fabf1.png


实现复杂度低,内存分配快,但需要不停拷贝、合并内存以实现内存释放和回收

  1. 链表分配器
    维护一个空闲内存的链表

d1c13448e24404e6910218048b9fbd64.png


实现复杂度低,内存的释放和回收简单,但是需要遍历链表,为了进一步提高效率,可以把内存分割成不同的大小,分别组成不同的链表,根据申请内存的大小使用相应的链表

3、TCMalloc

线程缓存分配(TCMalloc,thread-caching malloc)是一种快

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值